اسپاگتی‌کد؛ دستورالعملی برای کدهای نه چندان خوشمزه

1360

ممکن است اسپاگتی به‌عنوان یک شام ایتالیایی انتخابی وسوسه‌کننده باشد، اما احتمالاً یکی از آخرین چیزهایی است که دوست دارید درمورد کد خود بشنوید. به‌عنوان یک توسعه‌دهنده اینکه کدی که به شما داده می‌شود، به‌اندازه‌ی یک بشقاب اسپاگتی درهم‌پیچیده باشد، به‌معنای واقعی کلمه یک کابوس است. با این حال، بیشتر اوقات اسپاگتی‌کد چیزی نیست که از شخص دیگری دریافت کرده باشید، بلکه خود شما نویسنده‌ی این جنایت بوده‌اید و اکنون خودتان هم نمی‌دانید چگونه باید از این کلاف سردرگم سر در بیاورید.

در ادامه‌ی این مقاله، به تعریف و بررسی اسپاگتی‌کد می‌پردازیم و سپس روش‌هایی برای نوشتن کدهای تمیزتر و ساختاریافته‌تر ارائه خواهیم کرد.

اسپاگتی‌کد چیست؟

اسپاگتی‌کد (Spaghetti Code) یک اصطلاح رایج برای کدهای بدون ساختار و با خوانایی دشوار است. به‌عبارتی اسپاگتی‌کد یک آشفتگی محض است. مشکل اسپاگتی‌کد این است که خطوط نوشته‌شده به‌راحتی قابل درک نیستند و در نتیجه شما به‌راحتی نمی‌توانید تشخیص دهید که هر بخش از کد، از کجا شروع می‌شود، به کجا ختم می‌شود و یا با چه چیزی در مخزن می‌تواند مرتبط باشد یا نباشد. بگذارید با یک مثال ساده از یک اسپاگتی‌کد شروع کنیم:

یک کد بدون ساختار در زبان Basic:

1 i=0
2 i=i+1
3 PRINT i; "squared=";i*i
4 IF i>=100 THEN GOTO 6
5 GOTO 2
6 PRINT "Program Completed."
7 END

کد ساختاریافته‌ی مثال بالا:

1 FOR i=1 TO 100
2     PRINT i;"squared=";i*i
3 NEXT i
4 PRINT "Program Completed."
5 END

این مثالی از اسپاگتی‌کد در یک قطعه‌کد کوتاه است. حالا تصور کنید که این آشفتگی در سراسر کد عریض و طویل شما وجود داشته باشد. به‌عنوان یک توسعه‌دهنده، شما باید یک ایده‌ی خاص را در چندین کلاس، تابع، ماژول و فایل دنبال کنید. اما در اسپاگتی‌کد دنبال‌کردن بخش‌های مختلف کد دشوار است؛ زیرا تنها چیزی که در اسپاگتی‌کد ثابت است، ناسازگاری است. این فرایند بسیار کلافه‌کننده است، به‌خصوص اگر مجبور باشید یک باگ را هم رفع کنید. 

اسپاگتی‌کد دستورالعملی عالی برای شکست در دراز‌مدت است. چنین نوع کدی در هر پایگاه متن برنامه‌ی (Codebase) بزرگی، می‌تواند منجر به اتلاف عظیم منابع برای یافتن باگ‌ها و رفع آن‌ها شود. به‌علاوه، در چنین کدهایی باگ‌های بیشتری اتفاق می‌افتند، هر ارتقا، استقرار و اتصال با یک برنامه‌ی شخص ثالث بسیار پیچیده و پرهزینه است، زمان Downtime‌ها طولانی‌تر است و به‌طور کلی اسپاگتی‌کد یکی از بزرگ‌ترین مشکلاتی است که یک توسعه‌دهنده و یک تیم توسعه می‌تواند با آن مواجه شود.

چگونه از اسپاگتی‌کد اجتناب کنیم؟

کد چیزی فراتر از یک کد است. کد نه‌فقط ترجمه‌ی ایده‌ها در یک قالب دیجیتالی، بلکه زبانی است که توسط توسعه‌دهندگان دیگر استفاده می‌شود. این بدان معناست که توسعه‌ی یک نرم‌افزار کافی نیست. کد شما باید برای توسعه‌دهندگان دیگری که قرار است در آینده وارث کد شما باشند، قابل‌فهم باشد. زمانی که یک زمینه‌ی خوب توسط توسعه‌دهنده قبلی ایجاد شود، توسعه‌دهندگان بعدی به‌راحتی می‌توانند کد را متوجه شده و دنبال کنند. بنابراین از آسیب‌پذیری‌ها و خرابی‌های بزرگ در آینده جلوگیری می‌شود، زیرا توسعه‌دهندگان درگیر زمان‌های طولانی برای فهم کد به‌منظور اصلاح، افزودن یا بهبود ویژگی‌ها نیستند.

دستورالعمل گام‌به‌گامی برای اجتناب از اسپاگتی‌کد وجود ندارد. در عوض، روش‌هایی وجود دارد که با پیروی از آن‌ها می‌توانید کدهای ساختاریافته‌تری بنویسید. در ادامه تعدادی از رایج‌ترین روش‌ها را بررسی می‌کنیم:

از یک قرارداد نام‌گذاری ثابت استفاده کنید

از متغیرها گرفته تا توابع و کلاس‌ها، نام‌گذاری بسیار اهمیت دارد. مهم نیست چه استانداردی را برای نام‌گذاری انتخاب می‌کنید، آنچه اهمیت دارد این است که به آن پایبند باشید و در سراسر کد، قواعد آن را رعایت کنید. هر زبانی best practiceهایی برای نام‌گذاری دارد که با استفاده از آن‌ها، هر توسعه‌دهنده‌ای به‌راحتی می‌تواند با ساختار کد شما آشنا شود.

قبل از شروع به نوشتن هر کد، برای مطالعه و درک روش‌هایی که باید از آن استفاده کنید، وقت بگذارید و اگر کدی دارید که قبلاً توسط فرد دیگری نوشته شده است، از قواعد نام‌گذاری آن پیروی کنید؛ حتی اگر مطابق با best practiceهای آن زبان نباشد.

از تست‌های واحد استفاده کنید

با انجام تست‌های واحد (Unit Test) می‌توانید احتمال ایجاد اسپاگتی‌کد را کاهش دهید. تست‌ها ابزارهایی هستند که برنامه‌ی شما را اجرا می‌کنند و نحوه‌ی عملکرد آن را در مقایسه با نتایج مورد‌انتظار بررسی می‌کنند. بنابراین، اگر برنامه‌ی شما به‌درستی کار نکند، تست‌های شما با شکست مواجه می‌شوند. آموزش‌های زیادی برای نحوه‌ی انجام تست‌های واحد وجود دارد. کافیست «Unit Test» و سپس زبان موردنظرتان را در گوگل جست‌وجو کنید.

کامنت‌گذاری کنید

کامنت‌گذاری ساده‌ترین راه برای اجتناب از اسپاگتی‌کد است. همه‌چیز را کامنت‌گذاری کنید، اما هوشمندانه! کامنت‌ها باید توضیحاتی را ارائه دهند که در کد مشخص نیست، در غیر این صورت فقط همه‌چیز را به هم می‌ریزند. وقتی یک تابع یا قطعه‌کد پیچیده می‌نویسید، یک کامنت ایجاد کنید و در آن توضیح دهید که آن قسمت از کد چه کاری انجام می‌دهد و چرا اهمیت دارد. با این کار احتمالاً هم خودتان و هم توسعه‌دهندگان دیگر را از دردسرِ تلاش برای فهمیدن کد در آینده، نجات خواهید داد.

بیشتر بخوانید: اصول کامنت‌گذاری در کد‌ها

کدهای کامنت‌شده را حذف کنید

احتمالاً برای شما هم بارها پیش آمده است که احساس کرده‌اید به قطعه‌ای از کدتان دیگر احتیاجی ندارید، اما به‌جای حذف آن قسمت، آن را تبدیل به کامنت کرده‌اید. کامنت‌ها برای خواندن انسان‌ها نوشته می‌شوند و مکانی برای ذخیره کدهایی نیستند که ممکن است دیگر به آن‌ها نیاز نداشته باشید. پس تمام کامنت‌هایی که قرار نیست توسط یک انسان خوانده شوند و توضیحی ارائه کنند را حذف کنید.

کد پایه را درک کنید

هنگام شروع یک موقعیت جدید در یک شرکت، اغلب توصیه می‌شود که ابتدا روش‌ها و سبک‌های آن‌ها را قبل از انجام هر کار مهم مرتبط با برنامه‌نویسی یاد بگیرید. این کار به شما کمک می‌کند تا درک بهتری از ساختار کد پایه‌ی آن‌ها داشته باشید و بتوانید مطابق با قواعد آن شرکت کدنویسی کنید.

از الگوها استفاده کنید

گاهی اوقات، توسعه‌دهندگان برای رفع یک مشکل فوری، بدون هیچ مسیر یا برنامه‌ریزی مشخصی کدنویسی می‌کنند. بنابراین کد بدون هیچ الگویی نوشته می‌شود. در این حالت تشخیص اینکه آیا تغییر یک چیز بر کلاس، تابع یا ماژول دیگر تأثیر می‌گذارد یا نه بسیار دشوار است. اما با استفاده از الگوها به‌راحتی می‌توانید تأثیر تغییرات را ردیابی کنید. زبان‌های برنامه‌نویسی مختلف الگوهای پیاده‌سازی متفاوتی دارند. با این حال الگوهای اصلی در زبان‌های برنامه‌نویسی شیءگرا عبارت‌اند از: الگوهای creational ،structural و behavioral.

توابع مستقل ایجاد کنید

اگر توابع شما مستقل (self-contained) نیستند، احتمالاً کد شما بدترین نوع اسپاگتی‌‌کد است. استفاده از یک تابع فوق‌العاده بزرگ که یک کار عظیم و احتمالاً پیچیده را انجام می‌دهد، حاوی مقدار زیادی کد است، در آن چندین تابع فراخوانی شده‌اند که هر یک از آن‌ها نیز احتمالاً توابع دیگری را فراخوانی کرده‌اند، یکی از بهترین روش‌ها برای تبدیل کد شما به یک اسپاگتی‌کد است. چگونه از اسپاگتی‌کد در چنین شرایطی اجتناب کنیم؟ تنها کاری که باید انجام دهید این است که وظایف فرعی را مشخص کنید، سپس برای هرکدام یک تابع ایجاد کنید و این فرایند را تا زمانی که همه‌ی توابع به‌اندازه‌ی کافی کوچک شوند و فقط یک کار را انجام دهند، ادامه دهید.

از Docstring‌ها استفاده کنید

استفاده از Docstringها، روشی عالی برای اجتناب از اسپاگتی‌کد است. با این حال، این روش زمانی بهترین نتیجه را دارد که توابع شما مستقل باشند. بنابراین، اگر هنوز توابع مستقلی ندارید، ابتدا مشکل آن‌ها را برطرف کنید.

Docstringها توضیحات خاصی را به توابع، روش‌ها یا حتی کلاس‌های شما اضافه می‌کنند و مشخص می‌کنند که تابع شما چه کاری انجام می‌دهد و پارامترهای آن، مقادیر بازگشتی آن و استثنائات احتمالی چه چیزهایی هستند. اکثر IDE‌ها کد شما را بررسی می‌کنند و هنگام فراخوانی تابع، docstring را به شما نشان می‌دهند، بنابراین می‌توانید به‌سرعت توضیحات کد را در اختیار داشته باشید. در ادامه مثالی از یک docstring در PHP آورده شده است که بسیار شبیه به docstringها در بسیاری از زبان‌های دیگر است:

/**
 * Create a new processor object
 *
 * @param array $object The configuration to build the processor
 * @return Processor The created processor
 * @throws RuntimeException in case the array is misconfigured
 */
function createProcessor(array $data) {
 // ...
}

هر تابع را فقط برای انجام یک کار ایجاد کنید

آیا تا‌به‌حال به تابعی برخورد کرده‌اید که بر اساس یک یا برخی از آرگومان‌هایش، کارهای مختلفی انجام دهد؟ هر تابع باید فقط یک کار را انجام دهد و تنها پارامترهایی که به‌شدت برای پردازش لازم هستند را به‌عنوان آرگومان در نظر بگیرد. بنابراین چندین تابع ایجاد کرده و اطمینان حاصل کنید که هر کدام هدف مشخصی دارند.

// Bad
function processData ($method, $a, $b) {
  if ($method == 'multiply') {
    return $a * $b;
  }
  return $a + $b;
}
// Do this instead
function multiplyData($a, $b) {
  return $a * $b;
}
function addData($a, $b) {
  return $a + $b;
}

برای اکنون کدنویسی کنید

گاهی توسعه‌دهندگان بیش از حد مشتاق هستند تا هر پیشرفت احتمالی در آینده را در نظر بگیرند. این کار می‌تواند منجر به انتخاب‌های بد طراحی، و نام‌گذاری‌ها و تعاریف مبهمی شود. وقتی وضوح به‌خاطر آینده‌ای نامعلوم کنار گذاشته شود، توسعه‌دهندگان آینده برای درک کد شما و چیزی که در ذهن داشته‌اید دچار مشکل خواهند شد.

 بنابراین برای دو سال آینده کدنویسی نکنید. این کار شما را از گره‌خوردن به ایده‌هایی که ممکن است هرگز محقق نشوند باز می‌دارد و به کد شما اجازه می‌دهد تا با ساختاری سالم توسعه پیدا کند. در پروژه‌های چابک، آینده همیشه در جریان است و ممکن است مدیران و تیم‌ها نظر خود را درمورد پروژه‌ای که برای دو سال آینده برنامه‌ریزی شده است، تغییر دهند.

از فریم‌ورک‌ها استفاده کنید

هزاران فریم‌ورک و کتابخانه در تمام زبان‌های برنامه‌نویسی مدرن وجود دارد که به شما کمک می‌کنند صدها تابع را تنها با استفاده از چند خط کد اجرا کنید. درنتیجه کد شما جمع‌جورتر و پیدا کردن باگ‌ها و رفع آن‌ها آسان‌تر می‌شود.

از سیستم‌های کنترل نسخه استفاده کنید

با استفاده از سیستم‌های کنترل نسخه، کد شما همیشه در دسترس و نسخه‌بندی‌شده است. به این معنی که به‌راحتی می‌توانید ببینید که کد شما در طول زمان چه تغییراتی کرده است. اگر هنوز از سیستم‌های کنترل نسخه مانند Git استفاده نمی‌کنید، یک توسعه‌دهنده‌ی حرفه‌ای نیستید. پس یادگیری و استفاده از Git را از همین امروز شروع کنید. دوره آموزش گیت (Git) کوئرا کالج گزینه خوبی برای شما خواهد بود تا روش استفاده از این سیستم کنترل نسخه محبوب را به شکل کاربردی یاد بگیرید.


صرف ساعت‌های طولانی برای اینکه بفهمید کدام خط کد در یک مخزن غول‌پیکر تغییر کرده است و یا اینکه برای رفع یک باگ باید از کجا شروع کنید، یکی از بدترین قسمت‌های توسعه‌دهنده بودن است. با پیروی از راهکارهای ارائه‌شده در این مقاله، به‌مراتب بشقاب دیجیتالی تمیزتر و چشم‌نوازتری خواهید داشت.

اکنون که می‌دانید چگونه از اسپاگتی‌کد اجتناب کنید، آماده هستید تا با نوشتن کدهای بهتر دنیا را به جای بهتری تبدیل کنید. ممکن است پایبندی به این قواعد در ابتدا، کار دشواری به نظر برسد، اما پس از مدتی از نوشتن کدهای زیبا لذت خواهید برد!


منابع:

آموزش برنامه نویسی با کوئرا کالج
کوئرا بلاگ

اشتراک در
اطلاع از
guest

2 دیدگاه‌
قدیمی‌ترین
تازه‌ترین بیشترین واکنش
بازخورد (Feedback) های اینلاین
View all comments
محمدمهدی لطفی
محمدمهدی لطفی
1 سال قبل

سلام خسته نباشید
عنوان مطلب جذاب بوداگه تونستید چند تا از شاخص هاشو توی مقالات بعدی بیشتر توضیح بدید
ممنون