SOLID رو حفظ نکن، Coupling و Cohesion رو بفهم
خلاصهٔ کاملتر
باستریچ تو این مقاله سراغ یه دردسر آشنا میره: خیلیها اسم SOLID و GRASP و KISS رو بلدن و همهجا هم پیادهشون میکنن، ولی نتیجه یه کدبیس پرنقشونگار و سختنگهداری از آب درمیاد. حرف اصلی نویسنده اینه که این اصول در نهایت فقط دارن دو تا چیز رو مدیریت میکنن: coupling و cohesion. اگه این دوتا رو خوب بفهمی، دیگه لازم نیست اون فهرست بلند اصول رو حفظ کنی.
coupling یعنی تغییر یه قطعه چقدر مجبورت میکنه قطعههای دیگه رو هم دست بزنی، و cohesion یعنی اجزای یه قطعه چقدر حول یه هدف واحد جمع شدن. مثالش سادهست: تابعی که فقط آرایهٔ عدد رو مرتب میکنه به نوع integer وابستهست، ولی همون تابع اگه با یه قرارداد انتزاعی مثل Comparable کار کنه دیگه به نوع خاصی گیر نمیده. نویسنده تأکید میکنه هیچکدوم از این دوتا عدد مطلق نیستن و به تغییری بستگی دارن که در نظر گرفتی.
برای اندازهگیری، بهجای تئوری پیشنهاد میده از کار واقعی آمار بگیری: برای coupling تعداد کامپوننتهایی که تو یه تسک دست میزنی و سهم هرکدوم از تلاش، و برای cohesion تعداد دغدغههای جدا که موقع کار روی یه کامپوننت باید تو ذهنت نگه داری. بعد با یه فرمول از جنس شاخص تمرکز از این اعداد نمره درمیاری. coupling از ۰ تا نزدیک ۱ حرکت میکنه و cohesion از بالای ۰ تا ۱.
مثال عملیش اینه: قانون طول پسورد هم تو فرم ثبتنام پیاده شده هم تو فرم تغییر رمز، پس با عوضشدن قانون باید هر دوتا رو دست بزنی. با تخمین تلاش ۴ و ۶ برای این دو فرم، عدد coupling میشه ۰٫۴۸ و چون هر فرم فقط یه دغدغه داشته، cohesion هرکدوم ۱ میمونه. مزیت این روش اینه که سراغ سنجش انتزاعی نمیره و نشون میده طراحی واقعاً چقدر روی کار روزمره فشار میاره.
نویسنده بعدش اصول معروف رو به همین دو مفهوم برمیگردونه: Single Responsibility یعنی cohesion بالا، Open/Closed و Interface Segregation هم cohesion رو بالا میبرن هم coupling رو کم میکنن، و Liskov و Dependency Inversion و DRY و Law of Demeter سراغ کمکردن coupling میرن. در عوض حدوحدودش رو هم میگه: abstractionهای اضافه یهکم CPU و حافظه میخوان که تو embedded و سیستمهای low-latency میتونه مهم شه، و برای اسکریپت یکبارمصرف یا PoC هم که قرار نیست تغییر زیادی ببینه، هزینهش نمیارزه.
نکات کلیدی:
- فرمول coupling یعنی ۱ منهای نسبت مجموع مربع تلاشها به مربع مجموعشون؛ خروجی بین ۰ تا نزدیک ۱.
- cohesion همون نسبت بدون تفریقه: از بالای ۰ تا ۱، و ۱ یعنی تمرکز کامل روی یه دغدغه.
- این دو فرمول همون شاخصهای Gini-Simpson و Herfindahl-Hirschman هستن و چون روی دادههای متفاوتی اعمال میشن، جمعشون لزوماً ۱ نمیشه.
- coupling به ازای هر تغییر روی کامپوننتهای درگیر سنجیده میشه، cohesion به ازای هر کامپوننت روی دغدغههای درگیر.
- تو embedded، سیستمهای low-latency، اسکریپت یکبارمصرف و PoC، نویسنده کوتاهاومدن از این اصل رو منطقی میدونه.




