قواعد کدنویسی تمیز در برنامه نویسی [Clean Code]

همه ما می دانیم که کدنویسی تمیز و مرتب مهم است. اگر در یک تیم برنامه نویسی مشغول کدنویسی هستید، تمیز نوشتن اسکریپت ها می تواند به سایر اعضای تیم کمک کند تا از کد شما راحت تر و سریع تر سر در بیاورند. حتی اگر شما بصورت انفرادی برنامه نویسی می کنید برای توسعه های کدهای خود در آینده کدنویسی تمیز می تواند کمک کننده باشد.
استفاده از نام های مناسب:
تعریف یک نام مناسب و توصیفی برای توابع و متغیرها ممکن است دشوار باشد. اما باید سعی کنید توابع، فایل ها و متغیرهایی که در اسکریپت خود دارید اسامی مناسبی داشته باشند زیرا کد ما را قرار است علاوه بر کامپیوتر، انسان نیز بخواند و متوجه شود.
در این بخش برخی از مواردی که در نام گذاری اسامی المان ها در اسکریپت اهمیت دارند را بیان می کنیم:
بولین (Boolean):
انواع داده بولین زمانی مورد استفاده قرار می گیرند که بخواهیم مسیر کدنویسی را به دو راه مجزا بخش بندی کنیم (True/False). وقتی می خواهید یک متغیر بولین را نام گذاری کنید سعی کنید آن را بصورت سوالی تعریف کنید. مثلا:
let content = false; if (content) { ... }
نام content گویا و شفاف نیست و توصیه می شود از پیشوندهایی مانند has, is, are, should, … قبل از نام متغیر استفاده کنید:
let hasContent = true; if (hasContent) { ... }
لیست/آرایه (Lists/Array):
باید برای آرایه ها و لیست ها در کد خود اسامی جمع در نظر بگیرید زیرا شامل چند آیتم هستند.
let salesOrder = []; // :( let salesOrderList = []; // :| let salesOrders = []; // :D Yay!
نگران طولانی شدن اسامی نباشید!
گاهی اوقات نمی توان فقط در یک کلمه عملکرد یک قطعه کد را تعریف کرد. مثلا اینکه داخل متغیر قرار است چه مقداری ریخته شود یا فلان تابع قرار است چکاری انجام دهد. به مثال زیر دقت کنید:
function doStuff() { ... } // Bad! function getSalesOrder() { ... } // Better! function getSalesOrderByLineId() { ... } // Even Better! function getSalesOrderByItemIdInTheDatabaseThenValidateReturnObject() { ... } // What? Bad!
استفاده از ویژگی های زبان برنامه نویسی:
در کدنویسی باید از ویژگی های گروه بندی یا Grouping Features در نام گذاری ها استفاده کنید. منظورمان class و namespaces. منظورمان اینست که نیازی نیست نام کلاس یا namespace را مجددا برای اسامی متغیرها یا متدها تعریف کنیم.
روش نادرست نام گذاری متدها:
/* It's easy to get lost what's going on. (SalesOrder.SalesOrder.SalesOrder(...)) */ namespace SalesOrder { class SalesOrder { function SalesOrder() { ... } } }
روش صحیح نام گذاری متدها:
/* * Following our naming structure, it's extremely easy to figure out what's going on * while not repeating ourselves. * (Repositories.SalesOrder.GetById(...)) */ namespace Repositories { class SalesOrder { function GetById() { ... } } }
دومین روش صحیح برای نام گذاری متد:
/* * This is also perfectly fine, as namespaces generally get include/using/import 'd away * to not be seen. * (SalesOrderRepository.GetById(...)) */ namespace Repositories { class SalesOrderRepository { function GetById() { ... } } }
فضای خالی (White Space):
سعی کنید بین توابع و بلاک های کد در پروژه خود فاصله و line-break را رعایت کنید. در اینصورت خوانایی کد شما افزایش خواهد یافت.
مثالی از عدم رعایت فاصله و اینتر در کد:
// Anyone else going cross-eyed? Remember, write code for humans! function add(a, b) { return a + b; } function doStuff(a, b) { let j = add(a, b); if (j > 2) { j = 5; } else { return a; } for(let i = 0; i < 20; i++) { j += i; } return j; }
مثالی از رعایت فاصله و اینتر در کد:
// Much better! Statements are separated by new-lines to give context, // and makes it a lot easier to read! function add(a, b) { return a + b; } function doStuff(a, b) { let j = a + b; if (j > 2) { j = 5; } else { return a; } for(let i = 0; i < 20; i++) { j += i; } return j; }
روش کار:
سعی کنید حداقل یک خط فاصله قبل و بعد از دستورات زیر قرار دهید:
- دستورات if/else
- حلقه for/while
- توابع/کلاس/متد/…
و در نهایت یک خط فاصله قبل از دستورات return در انتهای توابع رعایت کنید.
فانکشن ها/ متدها:
سعی کنید از قواعد برنامه نویسی فانکشنال در کدنویسی تمیز و مرتب بهره بگیرید. توابع و متدهای پروژه خود را طوری تعریف کنید که هر کدام از آنها تنها یک کار اصلی را انجام دهند. اینکار باعث افزایش سرعت تست کدهای پروژه و خطایابی (debug) آن خواهد شد.
روش نادرست تعریف تابع (ترکیب دو یا چند عملکرد، update و create در یک تابع):
// Common occurance of OR! function updateOrCreate() { ... }
روش صحیح تعریف تابع (جداسازی دو کار اصلی update و create):
// Better! function update() { ... } function create() { ... }
در نهایت توصیه می کنیم اگر حتی هیچیک از قواعد ذکر شده در این مقاله را رعایت نمی کنید سعی کنید در نحوه کدنویسی خود ثابت قدم (Consistent) باشید و تمام اسکریپت های پروژه خود را با قواعد یکسان و مشخص تعریف کنید. زیرا در آینده که خودتان یا سایر اعضای تیم بخواهند کد شما را توسعه دهند کار راحت تری خواهند داشت.
دیدگاهتان را بنویسید