Bad Code Smell
begin
مفهوم اصطلاح Bad Code Smell چیست ؟
اصطلاح Code Smell که گاهی Bad Smell هم اطلاق میشود در واقع به بخش هایی از سورس کد گفته میشه که پتانسیل این را دارند که مشکلات عمیقی برای سیستم به وجود بیاورند. Code Smell ها ساختارهای خاصی از کد هستند که اصول اساسی طراحی را نقض و تاثیر منفی در کیفیت طراحی میگذارند. این به این معنی است که نفر بعدی که سورس به دستش میرسد هر لحظه ممکن است خودکشی نماید یا سر از تیمارستان در بیاورد...!!!
Code Smell ها بطور معمول باگ نیستند و از لحاظ فنی و دستوری در آن زبان خطا ندارند و جلوی اجرا و کارایی عادی برنامه رو نمیگیرند. در عوض با ضعف عجیبی که در طراحی ایجاد میکنند میتوانند باعث کند شدن سرعت توسعه ، بالا رفتن ریسک ایجاد باگ های منطقی و یا شکست و واماندگی در آینده ای نزدیک شوند.
Code Smell ها کاملاً پتانسیل این را دارند که مشکلی به نام بدهی های فنی (Technical debt) رh به وجود بیاورند.
یک مطالعه ی فنی در 2015 روی بیش از نیم میلیون خط کد که برای بیش از 200 پروژه متن باز Commit شده حاکی از آن است که :
1- اکثر Code Smell ها از همان ابتدا بد نوشته شده اند ، نه اینکه در طی تغییرات بعدی ، از کد استاندارد به غیر استاندارد تبدیل شده باشند.
2- هرچند Code Smell اغلب هنگام اضافه کردن ویژگی های جدید یا توسعه ی کدهای موجود پیش می آید اما فعالیت های Refactoring هم میتوانند کد بد بو ایجاد کنند!
3-همیشه این تازه کاران نیستند که بیشتر باعث ایجاد Bad Smell میشوند بلکه توسعه دهندگان با تجربه با حجم کار بالا و زیر فشار و استرس بیشتر باعث ایجاد Bad smells میشوند!
انواع Code smell متداول
*** در سطح برنامه ( Application-level smells )
1- Duplicated code : به قطعاتی از کد گفته میشود که بسیاربسیار شبیه به هم هستند و در جاهای مختلف سورس تکرار میشوند.
2-Contrived complexity : پیچیدگی ساختگی با استفاده اجباری و زیاد از الگوهای طراحی (Design patterns) در جایی که یک طراحی ساده کفایت میکند.
3- Intentional complexity : پیچیدگی عمدی که به دلیل اختلافات بین توسعه دهندگان ، کدها بطور عمدی ناخوانا با پیچیدگی زیاد نوشته میشوند که فقط نویسنده از آن سر در می آورد و خدا...!
*** در سطح کلاس ها (Class-level smells)
1- Large class : که از نامش پیداست کلاس بسیار بزرگی است که توسط پروژه عملا پرستیده میشود! بعضاً به این نوعِ بزرگ ، God Object هم میگویند...
2- Feature envy : کلاس هایی که بیش از حد از متد های دیگر کلاس ها استفاده میکنند!
3- Inappropriate intimacy : کلاس هایی وابسته به جزئیات اجزای دیگر کلاس ها
4- Refused bequest: از بین بردن وراثت . به کلاس هایی گفته میشود که تمام متدهای کلاس پدر را Override میکنند و از وراثت چیزی به ارث نبرده اند!!
5- Lazy class / Freeloader : کلاس تنبل! کلاسی که خیلی خیلی کم کار انجام میدهد.
6- استفاده بیش از حد متغیرها ، ثابت ها و ایجاد حلقه های زیاد و تو درتو که همگی باعث ناخواناشدن کد و بالا بردن ریسک ایجاد باگ میشوند.
7- Downcasting : نوعی casting از بزرگ به کوچک که در آن مدل انتزاعی شکسته میشود و مجبور به refactor یا حذف بخشی از آن میشوید.
8-Orphan Variable or Constant class : متغیر یتیم! یا کلاس ثابت در واقع یک کلاس هست که بطور غیرمعمول دربرگیرنده ی مجموعه ای از ثوابت است که متعلق به جاهای دیگر است ، جایی در دیگر کلاس ها یا حتی اعضای بعضی کلاس های دیگر!
* در سطح متدها Method-level smells
1- Too many parameters : یک لیست طولانی از پارامترها که call کردن و تست کردن متد را پیچیده خواهد کرد.
2- Long method: یک متد ، فانکشن و یا رویه ای که بیش از حد رشد کرده باشد نیز احتمال خطا را افزایش میدهد.
3- Excessively long identifiers یا Excessively Short identifiers : هردو اشاره به نامگذاری های بسیار کوتاه و یا بسیار طولانی و غیر استاندارد دارند که با مطالعه استاندارد نامگذاری در زبان مربوطه ( Naming conventions ) به راحتی قابل حل خواهد بود.
4- Excessive return of data : بازگشت داده اضافی توسط فانکشن یا متدها که بیش از نیاز استفاده کننده متد (Caller) است.
نکته : این اصطلاح اولین بار توسط Kent Beck در ده ی 90 میلادی ابداع شد و بعدها استفاده از این عبارت با کتاب Refactoring: Improving the Design of Existing Code اثر Martin Fowler افزایش یافت.
چند ابزار هم برای چک کردن کدهایی که استایل نامناسبی دارند و پتانسیل تبدیل شدن به Code smell را دارند وجود دارد از جمله : Checkstyle و PMD و FindBugs که هرسه جهت رفاه حال جاواکاران طراحی شده اند و عموماً متن باز هستند.
منبع :
1- وبلاگ مارتین فاولر
2-کتاب Refactoring: Improving the Design of Existing Code
3- WikiPedia
end.