کانال تلگرام فراسوعضو شوید
بازگشت به کتاب‌ها
جلد کتاب بازآرایی کد نوشتهٔ مارتین فاولر

بازآرایی کد

نوشتهٔ مارتین فاولر · سال انتشار 1999

نرم‌افزار می‌تواند با بهبود پیوستهٔ ساختار درونی و بدون تغییر رفتار بیرونی، ایمن تکامل یابد.

نقاط قوت

  • اثری بنیادین در مهندسی نرم‌افزار.
  • بی‌نهایت کاربردی.
  • پیوندی قوی میان طراحی و نگهداشت‌پذیری.
  • در همهٔ زبان‌های برنامه‌نویسی به کار می‌آید.

نقاط ضعف

  • به تجربهٔ برنامه‌نویسی نیاز دارد.
  • برخی نمونه‌ها سبک‌های کدنویسیِ قدیمی‌ترند.
  • بدون تست و معماری خوب، بازآرایی دشوار می‌شود.

خلاصه کتاب

مارتین فاولر «بازآرایی» را با تعریفی دقیق آغاز می‌کند که کل کتاب حول آن می‌چرخد: تکنیکی منظم برای بهبود ساختار درونیِ کد موجود، بدون تغییر رفتار بیرونیِ آن. تأکید روی دو کلمهٔ «منظم» و «بدون تغییر رفتار» است — بازآرایی نوشتن دوبارهٔ کد از صفر نیست، و اضافه کردن قابلیت جدید هم نیست؛ مجموعه‌ای از تبدیل‌های کوچک و قابل‌بازگشت است که کد را خواناتر و منعطف‌تر می‌کند در حالی که هر بار می‌شود تأیید کرد که رفتارش عوض نشده.

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

کتاب نیمی کاتالوگ است — فهرستی دقیق از تکنیک‌های بازآرایی نام‌گذاری‌شده، هرکدام با گام‌های مشخص — و نیمی استدلال: چرا این تکنیک‌ها را باید یاد گرفت، کِی باید از آن‌ها استفاده کرد، و چطور با تست‌های خودکار، بازآرایی را ایمن نگه داشت.

ایده‌های کلیدی

۱. بوهای کد: واژگانی برای تشخیص مشکل

فاولر مفهوم «بوی کد» را معرفی می‌کند — نشانه‌های قابل‌تشخیصی که معمولاً به یک مشکل ساختاریِ عمیق‌تر اشاره می‌کنند، حتی وقتی کد ظاهراً کار می‌کند. تابع طولانی، کلاس بزرگ، کد تکراری، وسواس نسبت به داده‌های اولیه به‌جای اشیاء — این‌ها اسم دارند و هرکدام به یک یا چند بازآراییِ مشخص در کاتالوگ متصل‌اند. این واژگانِ مشترک ارزش عملی بزرگی دارد: یک تیم می‌تواند در بازبینیِ کد بگوید «این یک بوی کدِ حسادت به ویژگی است» و بلافاصله همه بفهمند مشکل چیست و راه‌حل احتمالی کدام است.

۲. استخراج تابع: پایه‌ای‌ترین بازآرایی

اگر یک بازآرایی بخواهد نمایندهٔ کل کتاب باشد، آن «استخراج تابع» است: گرفتن قطعه‌ای از کد که می‌شود گروهش کرد، بیرون کشیدنش به یک تابع جدا، و دادن نامی که بگوید آن قطعه چه کاری انجام می‌دهد. فاولر نشان می‌دهد این تکنیکِ به‌ظاهر ساده، وقتی به‌طور مکرر و منظم اعمال شود، توابع طولانیِ غیرقابل‌فهم را به مجموعه‌ای از توابع کوچک و خودتوضیح‌دهنده تبدیل می‌کند — هرکدام آن‌قدر کوچک که فهمشان چند ثانیه طول می‌کشد.

هرکسی می‌تواند کدی بنویسد که کامپیوتر بفهمد. برنامه‌نویسان خوب کدی می‌نویسند که انسان‌ها بفهمند.

۳. دو کلاه: هرگز هم‌زمان بازآرایی نکن و قابلیت اضافه نکن

فاولر استعارهٔ «دو کلاه» را معرفی می‌کند: در هر لحظه، یا کلاه «افزودن قابلیت» را دارید یا کلاه «بازآرایی» را — نه هر دو را هم‌زمان. وقتی قابلیت اضافه می‌کنید، رفتار کد باید تغییر کند و ساختارش دست‌نخورده می‌ماند؛ وقتی بازآرایی می‌کنید، ساختار تغییر می‌کند و رفتار دست‌نخورده می‌ماند. مخلوط کردن این دو، تشخیص علتِ یک باگ تازه را تقریباً غیرممکن می‌کند — نمی‌دانید مشکل از تغییر رفتار آمده یا از تغییر ساختار.

۴. تست‌ها به‌عنوان تور ایمنی

فاولر تأکید می‌کند بازآراییِ بدون تست خودکار، قماری خطرناک است — چون تنها راه اثبات اینکه «رفتار بیرونی عوض نشده»، اجرای مکرر یک مجموعه تست معتبر است. او پیشنهاد می‌دهد پیش از شروع هر بازآراییِ جدی، ابتدا پوششِ تستیِ کافی بسازید، حتی اگر این کار خودش زمان بگیرد. بدون این تور ایمنی، بازآرایی به کاری تبدیل می‌شود که هرکس، به‌درستی، از انجامش می‌ترسد.

۵. مثال آغازینِ کتاب: محاسبهٔ اجارهٔ ویدیو

فاولر کل فصل اول کتاب را حول یک مثالِ واحد می‌سازد: برنامه‌ای برای محاسبهٔ صورت‌حساب یک ویدیوکلوپ که اجاره‌ها و امتیازهای وفاداری مشتری را حساب می‌کند. او این کد را قدم‌به‌قدم، با ده‌ها بازآراییِ کوچک و مجزا، از یک تابعِ طولانی و پرشرط به مجموعه‌ای تمیز از کلاس‌ها و توابع کوچک تبدیل می‌کند — و در هر قدم، دقیقاً نشان می‌دهد کدام بازآراییِ نام‌دار از کاتالوگ اعمال شده. این مثال، که در تمام چاپ‌های کتاب حفظ شده، هنوز رایج‌ترین راه آموزش دادن بازآرایی به برنامه‌نویسان تازه‌کار است.

برای چه کسی مفید است

  • کسی که کدبیسی قدیمی و رشدکرده را نگهداری می‌کند — دقیقاً همان کدبیسی که کتاب برایش نوشته شده.
  • کسی که «کد تمیز» را خوانده و می‌خواهد بداند چطور به آنجا برسد — این کتاب مکانیزمِ گام‌به‌گام را می‌دهد، نه فقط اصول.
  • تیمی که بازبینیِ کد ندارد یا واژگان مشترک برای بحث دربارهٔ کیفیت کد ندارد — کاتالوگ بوهای کد پایه‌ای برای این واژگان می‌سازد.
  • برنامه‌نویس مبتدی که هنوز پایگاه‌های کدِ واقعی ندیده — بدون تجربهٔ نگهداریِ کد واقعی، بسیاری از مثال‌ها انتزاعی به نظر می‌رسند.
این کتاب فرض می‌کند خواننده تجربهٔ برنامه‌نویسیِ واقعی دارد — کسی که هرگز کدبیسی بزرگ و درهم را نگهداری نکرده، ممکن است ارزش عملیِ بسیاری از این تکنیک‌ها را کاملاً درک نکند. این آموزش مقدماتیِ برنامه‌نویسی نیست.
بدون تست‌های خودکار و معماریِ حداقلی، بازآرایی خودش می‌تواند خطرناک شود — دقیقاً همان چیزی که قرار است از آن جلوگیری کند. برخی نمونه‌های کتاب هم سبک‌های کدنویسیِ قدیمی‌تر (به‌ویژه در چاپ اول، به زبان جاوا با اصطلاحات دههٔ ۱۹۹۰) را منعکس می‌کنند؛ چاپ دوم با مثال‌های جاوااسکریپت این را تا حدی به‌روز کرده، اما اصول باید همچنان با بستر زبانِ خودتان تطبیق داده شوند.

سؤالات پرتکرار

چاپ اول یا چاپ دوم را بخوانم؟

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

آیا بازآرایی همیشه ایمن است اگر تست داشته باشم؟

ایمن‌تر است، اما ایمن مطلق نه. تست‌ها فقط رفتاری را که پوشش می‌دهند تأیید می‌کنند؛ اگر پوشش ناقص باشد، بازآرایی هنوز می‌تواند باگ‌های نادیده‌ای وارد کند. فاولر توصیه می‌کند بازآراییِ گام‌های کوچک و مکرر، حتی با تستِ ناقص، امن‌تر از تغییرات بزرگ و یک‌باره است.

تفاوتش با «بازنویسیِ کامل» چیست؟

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

چرا مثال محاسبهٔ اجارهٔ ویدیو این‌قدر معروف است؟

چون یک مثال واقعی و کامل، به‌جای قطعه‌کدهای پراکنده، نشان می‌دهد. دیدن یک تابعِ واقعی که از یک بلوکِ پرشرطِ درهم به کدی تمیز تبدیل می‌شود، درسی می‌دهد که هیچ توضیح انتزاعی نمی‌تواند بدهد.

آیا این کتاب فقط برای برنامه‌نویسیِ شیءگرا کاربرد دارد؟

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

این مطلب برایتان مفید بود؟

شمارش آرا پس از ۵ رأی نمایش داده می‌شود.

بیشتر در همین دسته