در برنامه نویسی و توسعه نرم افزار، الگوهای طراحی رایجی وجود دارد. این الگوهای طراحی مشکلات مشخصی را حل میکنند و بین توسعهدهندگان متداول هستند. به این روشها رویکردهای برنامهنویسی مطلوب میگویند. در مقابل، الگوهای طراحی نامطلوبی هم وجود دارد که به عنوان ضد الگو شناخته میشوند. به طور خلاصه ضد الگوها شیوههای برنامهنویسی نامطلوب و چالشزا هستند. در این مقاله از وبلاگ آسا درباره ضدالگوها در معماری نرمافزار صحبت میکنیم و سعی میکنیم انواع و راهحل برطرف کردن آنها را توضیح دهیم.
مفهوم ضد الگو یا Anti-Pattern
در مسیر توسعه نرمافزار، مراحل مختلفی از بازبینی یا Refactor وجود دارد. برای اینکه بتوانید روشهای صحیح بازبینی را توصیف و اجرا کنید، باید Anti-Patternها را بشناسید. مثلا، فرض کنید که میخواهید با استفاده از روش برنامه نویسی شیگرا، یک نرمافزار را توسعه دهید. روش عمومی این است که نرم افزار را به قطعههای کوچکی به نام شی تقسیم کنید. بنابراین، ضدالگو در برنامهنویسی شیگرا یک شی کلی و بزرگ است و عملکردهای زیادی هم دارد.
چرا باید ضدالگوها را بشناسید؟
شناخت Anti-Patternها به شما کمک میکند که الگوهای اشتباه برای ساخت یک برنامه را بشناسید. آشنایی با ضد الگوها در مسیر پیشرفت شما در برنامهنویسی هم تاثیر دارد. علاوه بر این برای اینکه بتوانید به برنامهنویس خوبی تبدیل شوید، باید با الگوهای اشتباه آشنا شوید و روش درست را اجرا کنید. با این کار، ساختار درست را پیدا میکنید و میتوانید معماری نرمافزار را در زمان مناسب و به شیوه درستی تحویل دهید.
انواع ضد الگوها
اولین مرحله در شناخت ضد الگوها، آشنایی با انواع آنها است. این Anti-patternها باعث بروز مشکل در نگهداری نرم افزار میشوند و خطاهای منطقی و باگها را افزایش میدهند. در ادامه ۱۲ مورد از متداولترین ضدالگوها را به همراه توضیح مختصری آوردهایم.
۱- God Object یا God Class
این ضدالگو مجموعهای از کارهای متنوع و زیاد است که تعداد زیادی متد دارد. مثلا، کلاسی را تصور کنید که کارهای زیادی در آن تعریف شده است و سازماندهی درستی ندارد. God Object اصول SOLID را نقض میکند. این اصول مجموعهای از دستورالعملهای درست برای توسعه نرمافزار هستند و کیفیت نرم افزار را تضمین میکنند.
طبق اصول SOLID، هر ماژول، کلاس یا متد فقط یک کار مشخص انجام میدهد. مشکلات بزرگ به بخشهای کوچکتر تقسیم شده و باعث حذف کارهای تکراری میشوند. ضدالگوی God Object دقیقا برعکس این رویکرد است و یک کلاس بزرگ و همهکاره ایجاد میکند.
اگر معماری نرمافزار شامل این ضد الگو باشد، بدهیهای فنی زیاد میشوند و کلاس به طور کامل میشکند. بهعلاوه، اگر God Object در کار شما باشد، فضای رم اشغال میشود و کارایی و عملکرد سیستم هم کاهش پیدا میکند.
۲- Spaghetti Code
به کدهایی که ساختار نامنظمی دارند، Spaghetti Code میگویند. خواندن و عیبیابی این کدها سخت است و به منابع و زمان زیادی احتیاج دارد.
۳- Magic Numbers
طبق این ضد الگو اگر در برنامهنویسی از اعداد و مقادیر ثابت استفاده کنید و توضیحات مناسب ارائه نکنید، کد شما نامفهوم میشود. بنابراین، در آینده نمیتوانید از آن کد به خوبی استفاده کنید.
۴- Golden Hammer
در این حالت، کدهای شما به ابزار، فناوری یا روش خاصی بیشازحد وابسته هستند. مثلا، ممکن است شما از یک ابزار خاص برای کدنویسی استفاده کنید و آن ابزار همیشه مناسب و پاسخگو نباشد. برای حل این مشکل باید سراغ برنامهنویسها و اعضای تیم توسعه نرمافزار بروید. در این حالت، هر یک از اعضای تیم باید به فکر راهحل دیگری باشند و روش قبلی را کنار بگذارند.
۵- Blob یا Big Ball of Mud
اگر ساختار و سیستم نرمافزار نامشخص باشد و درک معماری نرم افزار سخت باشد، احتمالا در کدهای شما Blob وجود دارد. Big Ball of Mud در اثر فشارهای تجاری، جایگزینشدن توسعهدهندگان و Software Rot به وجود میآید.
در صورتیکه کدها را بهروزرسانی نکنید، ممکن است دچار ضدالگوی Blob شوید. مثلا، تصور کنید که توسعهدهنده جدیدی وارد تیم میشود و نمیتواند ساختار و معماری سیستم را تشخیص دهد، در این حالت Blob Anti-pattern وجود دارد. برای حل این مشکل باید تحقیق کنید و پروژه مشابه پیدا کنید.
۶- Copy-Paste Programming
گاهی وقتها برنامهنویسها به جای ایجاد Abstraction و استفاده مجدد از کد یا Reuse، کدها را کپی میکنند و از آنها در جاهای مختلف استفاده میکنند. به این کار ضدالگوی Copy-Paste Programming میگویند. اگر این ضد الگو در ساختار نرمافزار وجود داشته باشد، فرایند نگهداری، توسعه و بهروزرسانی کدها و سیستم سخت میشود.
۷- Reinventing the Wheel
در دنیای برنامهنویسی بعضی از مسائل از قبل حل شدهاند و راهحل آنها مشخص است. بنابراین، اگر به جای استفاده از راهحل مشخص سراغ راهکار جدیدی بروید، گرفتار ضدالگوی Reinventing the Wheel میشوید. این Anti-Pattern باعث هدر رفتن هزینه و انرژی میشود.
۸- Shotgun Surgery
اگر برای ایجاد یک تغییر کوچک یا اضافه کردن یک ویژگی، کلاسهای زیادی را تغییر دهید، ضدالگوی Shotgun Surgery رخ میدهد. این Anti-Pattern برخلاف اصل انتزاع یا Abstraction Principle است. طبق این اصل، تکرارهای برنامه باید به حداقل برسد و هر بخش و عملکرد در یک جا نوشته شوند.
۹- Boat Anchor
ضد الگوی Boat Anchor به معنای وجود کدها و ویژگیهای غیرضروری است و باعث افزایش پیچیدگیها و هزینه میشود. این Anti-Pattern زمانی رخ میدهد که توسعهدهنده تصور میکند که به این کدها بعدا احتیاج دارد، بنابراین آنها را در برنامه نگه میدارد. راهکار برطرف کردن این مشکل حذف کدهای اضافه است.
بیشتر بخوانید: معماری میکروسرویس چیست؟
۱۰- Tight Coupling
در این حالت، دو یا چند کامپوننت یا ماژول به شدت به یکدیگر وابسته هستند. بنابراین، اگر آنها را تغییر دهید، کدها میشکنند و برنامه از کار میافتد. وجود ضدالگوی Tight coupling نگهداری، توسعه و بهروزرسانی نرمافزار را سخت میکند.
۱۱- Death by Planning
ریشه این ضدالگو به مشکلات مدیریتی برمیگردد. در این حالت، زمان انجام پروژه با برنامه همخوانی ندارد. برنامه مدیریتی بسیار دقیق و کامل نوشته شده است، ولی تیم توسعه نمیتواند در زمان تعیینشده پروژه را تحویل بدهد.
وقتی تیم توسعه گرفتار Death by Planning میشود، تصور میکند که باید قبل از شروع پروژه، همه اطلاعات را جمعآوری کند. همین مسئله باعث کمبود وقت میشود. با استفاده از توسعه بخشهای تکراری و ارائه حداقل محصول قابل پذیرش یا Minimum Viable Product میتوانید از وقوع این ضدالگو جلوگیری کنید.
۱۲- Gold Plating
اگر برنامهنویس یا توسعهدهندهای بیشازحد روی یک کد یا Feature خاصی وقت بگذارد، ممکن است گرفتار Gold Plating شود. در این حالت، تیم توسعه یا کاربر به آن ویژگی احتیاج ندارد و عملا کار برنامهنویس بیفایده است. در ضدالگوی Gold Plating، برنامهنویس ساعتها روی کد خاصی وقت میگذارد، ولی فعالیت او هیچ کمکی به پروژه و هدف نهایی نمیکند.
سخن آخر
در این مقاله درباره ضد الگوها در توسعه نرمافزار صحبت کردیم. برای اینکه بتوانید از این مشکلات در برنامهنویسی جلوگیری کنید، باید استراتژیهای بلندمدت داشته باشید و فرایندهای طراحی، برنامهنویسی و ترکیب را اولویتبندی کنید. هرچقدر بیشتر روی الگوهای طراحی تسلط داشته باشید و آنها را بشناسید، بهتر میتوانید با Anti-Patternها مقابله کنید.
منابع:
دیدگاهتان را بنویسید