
تسمية الأشياء أمر صعب. هذه الورقة تحاول تسهيل الأمر.
على الرغم من أنه يمكن تطبيق هذه الاقتراحات على أي لغة برمجة ، إلا أنني سأستخدم JavaScript لتوضيحها في الممارسة العملية.
استخدم اللغة الإنجليزية عند تسمية متغيراتك ووظائفك.
/* Bad */
const primerNombre = 'Gustavo'
const amigos = [ 'Kate' , 'John' ]
/* Good */
const firstName = 'Gustavo'
const friends = [ 'Kate' , 'John' ]شئنا أم لا ، اللغة الإنجليزية هي اللغة المهيمنة في البرمجة: بناء جملة جميع لغات البرمجة مكتوبة باللغة الإنجليزية ، بالإضافة إلى عدد لا يحصى من الوثائق والمواد التعليمية. من خلال كتابة الكود الخاص بك باللغة الإنجليزية ، يمكنك زيادة تماسكها بشكل كبير.
اختر اتفاقية تسمية واحدة واتبعها. قد يكون camelCase ، أو snake_case ، أو على أي حال ، لا يهم. ما يهم هو أن تظل متسقة.
/* Bad */
const pages_count = 5
const shouldUpdate = true
/* Good */
const pageCount = 5
const shouldUpdate = true
/* Good as well */
const page_count = 5
const should_update = true يجب أن يكون الاسم قصيرًا وبديهيًا وصفيًا :
/* Bad */
const a = 5 // "a" could mean anything
const isPaginatable = a > 10 // "Paginatable" sounds extremely unnatural
const shouldPaginatize = a > 10 // Made up verbs are so much fun!
/* Good */
const postCount = 5
const hasPagination = postCount > 10
const shouldDisplayPagination = postCount > 10 // alternatively لا تستخدم الانقباضات. أنها تسهم في لا شيء سوى انخفاض قابلية القراءة للرمز. قد يكون العثور على اسم قصير وصفي أمرًا صعبًا ، لكن الانكماش ليس ذريعة لعدم القيام بذلك.
/* Bad */
const onItmClk = ( ) => { }
/* Good */
const onItemClick = ( ) => { } يجب ألا يكرر الاسم السياق الذي يتم تعريفه فيه. قم دائمًا بإزالة السياق من الاسم إذا لم يقلل ذلك من قابلية القراءة.
class MenuItem {
/* Method name duplicates the context (which is "MenuItem") */
handleMenuItemClick = ( event ) => { ... }
/* Reads nicely as `MenuItem.handleClick()` */
handleClick = ( event ) => { ... }
} يجب أن يعكس الاسم النتيجة المتوقعة.
/* Bad */
const isEnabled = itemCount > 3
return < Button disabled = { ! isEnabled } />
/* Good */
const isDisabled = itemCount <= 3
return < Button disabled = { isDisabled } />هناك نمط مفيد يجب متابعته عند تسمية وظائف:
prefix? + action (A) + high context (HC) + low context? (LC)
ألقِ نظرة على كيفية تطبيق هذا النمط في الجدول أدناه.
| اسم | بادئة | العمل (أ) | السياق العالي (HC) | سياق منخفض (LC) |
|---|---|---|---|---|
getPost | get | Post | ||
getPostData | get | Post | Data | |
handleClickOutside | handle | Click | Outside | |
shouldDisplayMessage | should | Display | Message |
ملاحظة: يؤثر ترتيب السياق على معنى المتغير. على سبيل المثال ، يجب أن تعني
shouldUpdateComponentأنك على وشك تحديث مكون ، بينما يخبركshouldComponentUpdateأن المكون سيقوم بتحديثه ، وأنت تتحكم في متى يجب تحديثه. بمعنى آخر ، يؤكد السياق العالي على معنى المتغير .
جزء الفعل من اسم وظيفتك. الجزء الأكثر أهمية المسؤول عن وصف ما تفعله الوظيفة.
getالوصول إلى البيانات على الفور (أي اختصار للبيانات الداخلية).
function getFruitCount ( ) {
return this . fruits . length
}انظر أيضا تأليف.
set يضع متغيرًا بطريقة إعلانية ، مع القيمة A إلى القيمة B .
let fruits = 0
function setFruits ( nextFruits ) {
fruits = nextFruits
}
setFruits ( 5 )
console . log ( fruits ) // 5resetيعيد متغير العودة إلى قيمته أو حالته الأولية.
const initialFruits = 5
let fruits = initialFruits
setFruits ( 10 )
console . log ( fruits ) // 10
function resetFruits ( ) {
fruits = initialFruits
}
resetFruits ( )
console . log ( fruits ) // 5fetchطلب بعض البيانات ، والتي تستغرق بعض الوقت غير المحدد (أي طلب ASYNC).
function fetchPosts ( postCount ) {
return fetch ( 'https://api.dev/posts' , { ... } )
}removeيزيل شيء من مكان ما.
على سبيل المثال ، إذا كان لديك مجموعة من المرشحات المحددة على صفحة البحث ، فإن إزالة أحدها من المجموعة هو removeFilter ، وليس deleteFilter (وهذه هي الطريقة التي ستقولها بشكل طبيعي باللغة الإنجليزية أيضًا):
function removeFilter ( filterName , filters ) {
return filters . filter ( ( name ) => name !== filterName )
}
const selectedFilters = [ 'price' , 'availability' , 'size' ]
removeFilter ( 'price' , selectedFilters )انظر أيضا حذف.
deleteيمسح تماما شيء من عوالم الوجود.
تخيل أنك محرر محتوى ، وهناك هذا المنشور الشهير الذي ترغب في التخلص منه. بمجرد النقر فوق زر "حذف النشر" اللامع ، قامت CMS بإجراء deletePost ، وليس removePost .
function deletePost ( id ) {
return database . find ( { id } ) . delete ( )
}انظر أيضا إزالة.
composeينشئ بيانات جديدة من تلك الموجودة. في الغالب ينطبق على السلاسل أو الكائنات أو الوظائف.
function composePageUrl ( pageName , pageId ) {
return ` ${ pageName . toLowerCase ( ) } - ${ pageId } `
}انظر أيضا الحصول على.
handleيتعامل مع العمل. غالبًا ما تستخدم عند تسمية طريقة رد الاتصال.
function handleLinkClick ( ) {
console . log ( 'Clicked a link!' )
}
link . addEventListener ( 'click' , handleLinkClick ) المجال الذي تعمل عليه الوظيفة.
غالبًا ما تكون الوظيفة عملاً على شيء ما . من المهم أن نوضح مجاله القابل للتشغيل ، أو على الأقل نوع بيانات متوقع.
/* A pure function operating with primitives */
function filter ( predicate , list ) {
return list . filter ( predicate )
}
/* Function operating exactly on posts */
function getRecentPosts ( posts ) {
return filter ( posts , ( post ) => post . date === Date . now ( ) )
}قد تسمح بعض الافتراضات الخاصة باللغة في حذف السياق. على سبيل المثال ، في JavaScript ، من الشائع أن يعمل
filterعلى الصفيف. إن إضافةfilterArrayصريح سيكون غير ضروري.
-
البادئة تعزز معنى المتغير. نادرا ما يستخدم في أسماء الوظائف.
is يصف خاصية أو حالة السياق الحالي (عادةً boolean ).
const color = 'blue'
const isBlue = color === 'blue' // characteristic
const isPresent = true // state
if ( isBlue && isPresent ) {
console . log ( 'Blue is present!' )
}has يصف ما إذا كان السياق الحالي يمتلك قيمة أو حالة معينة (عادة ما boolean ).
/* Bad */
const isProductsExist = productsCount > 0
const areProductsPresent = productsCount > 0
/* Good */
const hasProducts = productsCount > 0should يعكس بيان مشروط إيجابي (عادة boolean ) إلى جانب إجراء معين.
function shouldUpdateUrl ( url , expectedUrl ) {
return url !== expectedUrl
}min / maxيمثل القيمة الحد الأدنى أو الحد الأقصى. تستخدم عند وصف الحدود أو الحدود.
/**
* Renders a random amount of posts within
* the given min/max boundaries.
*/
function renderPosts ( posts , minPosts , maxPosts ) {
return posts . slice ( 0 , randomBetween ( minPosts , maxPosts ) )
}prev / nextأشر إلى الحالة السابقة أو التالية لمتغير في السياق الحالي. تستخدم عند وصف انتقالات الحالة.
function fetchPosts ( ) {
const prevPosts = this . state . posts
const fetchedPosts = fetch ( '...' )
const nextPosts = concat ( prevPosts , fetchedPosts )
this . setState ( { posts : nextPosts } )
} مثل البادئة ، يمكن جعل الأسماء المتغيرة فردية أو صيغة الجمع اعتمادًا على ما إذا كانت تحمل قيمة واحدة أو قيم متعددة.
/* Bad */
const friends = 'Bob'
const friend = [ 'Bob' , 'Tony' , 'Tanya' ]
/* Good */
const friend = 'Bob'
const friends = [ 'Bob' , 'Tony' , 'Tanya' ]