اصول SOLID: بوی بد کد: Couplers (وابسته کننده ها) - کوییز
بوی بد کد: Couplers (وابسته کننده ها)
- کلاسهایی که به ندرت تغییر میکنند و وابستگی کمی به کلاسهای دیگر دارند.
- کلاسهایی که به شدت به جزئیات پیادهسازی کلاسهای دیگر وابسته هستند و تغییر در یک کلاس، باعث تغییرات گسترده در کلاسهای دیگر میشود.
- کلاسهایی که فقط از طریق واسطهای (Interfaces) انتزاعی با یکدیگر ارتباط برقرار میکنند.
- کلاسهایی که مسئولیتهای مشخص و محدودی دارند و به خوبی از سایر بخشهای سیستم جدا شدهاند.
گزینه صحیح: 2
توضیح: بوی بد کد 'Couplers' زمانی رخ میدهد که کلاسها به شدت به جزئیات پیادهسازی یکدیگر وابسته باشند. این وابستگی شدید، تغییر در یک کلاس را دشوار و پرخطر میکند، زیرا ممکن است باعث ایجاد اشکالات زنجیرهای در کلاسهای دیگر شود.
- کلاسهایی که مسئولیتهای زیادی دارند و به سختی قابل تغییر هستند.
- کلاسهایی که وابستگی زیادی به کلاسهای دیگر دارند و تغییر در یک کلاس، باعث تغییرات گسترده در کلاسهای دیگر میشود.
- کلاسهایی که بسیار کوچک هستند و وظایف بسیار جزئی انجام میدهند.
- کلاسهایی که کدهای تکراری زیادی در خود دارند.
گزینه صحیح: 2
توضیح: بوی بد کد 'Couplers' به کلاسهایی اشاره دارد که وابستگی شدیدی به یکدیگر دارند. این وابستگی زیاد باعث میشود که تغییر در یک کلاس، نیاز به تغییر در چندین کلاس دیگر را ایجاد کند که این موضوع نگهداری و توسعه نرمافزار را دشوار میسازد.
- کلاسی که متدها و خصوصیات زیادی از کلاس دیگر را فراخوانی میکند.
- کلاسی که متدهای استاتیک زیادی دارد.
- کلاسی که دارای تعداد زیادی کامنت است.
- کلاسی که از وراثت چندگانه استفاده میکند.
گزینه صحیح: 1
توضیح: بوی بد کد Couplers زمانی رخ میدهد که یک کلاس وابستگی زیادی به جزئیات پیادهسازی کلاس دیگر پیدا میکند، مثلاً با فراخوانی مکرر متدها یا دسترسی به خصوصیات آن کلاس.
- Single Responsibility Principle (SRP) - اصل مسئولیت واحد
- Open/Closed Principle (OCP) - اصل باز/بسته
- Dependency Inversion Principle (DIP) - اصل وارونگی وابستگی
- Liskov Substitution Principle (LSP) - اصل جایگزینی لیسکوف
گزینه صحیح: 3
توضیح: اصل وارونگی وابستگی (DIP) بیان میکند که ماژولهای سطح بالا نباید به ماژولهای سطح پایین وابسته باشند؛ هر دو باید به انتزاعات (Abstractions) وابسته باشند. این اصل به کاهش وابستگی مستقیم به جزئیات پیادهسازی کمک کرده و در نتیجه با بوی بد 'Couplers' مقابله میکند.
- Single Responsibility Principle (SRP) - اصل مسئولیت واحد
- Open/Closed Principle (OCP) - اصل باز/بسته
- Dependency Inversion Principle (DIP) - اصل وارونگی وابستگی
- Interface Segregation Principle (ISP) - اصل تفکیک رابط
گزینه صحیح: 3
توضیح: اصل وارونگی وابستگی (DIP) بر جداسازی ماژولهای سطح بالا از ماژولهای سطح پایین تمرکز دارد و هر دو را به انتزاعات (Abstractions) وابسته میکند. این رویکرد وابستگی مستقیم بین کلاسها را کاهش داده و به رفع بوی بد 'Couplers' کمک میکند.
- استفاده از الگوهای طراحی مانند Strategy یا Observer برای کاهش وابستگی مستقیم.
- تبدیل تمام متدها به متدهای private.
- حذف وراثت و استفاده از Composition به جای آن.
- استفاده از متدهای private برای همه خصوصیات کلاس.
گزینه صحیح: 1
توضیح: الگوهای طراحی مانند Strategy و Observer به کلاسها اجازه میدهند تا بدون نیاز به دانستن جزئیات پیادهسازی یکدیگر، با هم تعامل داشته باشند و وابستگی مستقیم را کاهش دهند.
- کد قابلیت نگهداری (Maintainability) بالایی دارد و تست کردن آن آسان است.
- تغییرات کوچک در یک قسمت سیستم، نیازمند تغییرات در بخشهای زیادی از سیستم است.
- سیستم انعطافپذیر است و به راحتی میتوان قابلیتهای جدیدی به آن اضافه کرد.
- کد به صورت ماژولار (Modular) طراحی شده و اجزای آن به خوبی از هم جدا شدهاند.
گزینه صحیح: 2
توضیح: وابستگی شدید بین کلاسها (Couplers) باعث میشود که تغییر در یک کلاس، نیاز به تغییرات گسترده در کلاسهای وابسته داشته باشد. این امر نگهداری و توسعهٔ سیستم را دشوار و هزینهبر میکند.
- Large Class (کلاس بزرگ)
- Feature Envy (حسادت ویژگی)
- Couplers (وابسته کنندهها)
- Data Clumps (دستههای داده)
گزینه صحیح: 3
توضیح: تعامل مستقیم 'UserManager' با 'DatabaseManager' نشاندهنده وابستگی قوی بین این دو کلاس است. اگر 'DatabaseManager' تغییر کند، 'UserManager' نیز تحت تأثیر قرار خواهد گرفت. این نمونهای کلاسیک از بوی بد 'Couplers' است.
- اصل وارونگی وابستگی (Dependency Inversion Principle - DIP).
- اصل تک مسئولیتی (Single Responsibility Principle - SRP).
- اصل باز بودن/بسته بودن (Open/Closed Principle - OCP).
- اصل جایگزینی لیسکوف (Liskov Substitution Principle - LSP).
گزینه صحیح: 1
توضیح: اصل وارونگی وابستگی (DIP) توصیه میکند که ماژولهای سطح بالا نباید به ماژولهای سطح پایین وابسته باشند؛ هر دو باید به انتزاعات (abstractions) وابسته باشند. این امر وابستگی مستقیم و در نتیجه بوی بد Couplers را کاهش میدهد.
- استفاده از کلاسهای بزرگ و جامع که تمام منطق مورد نیاز را در خود جای دهند.
- استفاده از واسطهای (Interfaces) انتزاعی و تزریق وابستگی (Dependency Injection).
- کپی کردن کد به جای استفاده از ارثبری (Inheritance).
- کاهش تعداد کلاسها و ادغام منطقهای مرتبط در یک کلاس.
گزینه صحیح: 2
توضیح: استفاده از واسطهای انتزاعی به جای وابستگی مستقیم به کلاسهای مشخص، و همچنین استفاده از تکنیک تزریق وابستگی، به سیستم اجازه میدهد تا با انتزاعات کار کند و نه با پیادهسازیهای خاص، که این امر وابستگیها را کاهش میدهد.
- استفاده از واسطها (Interfaces) و کلاسهای انتزاعی (Abstract Classes)
- تزریق وابستگی (Dependency Injection)
- افزایش تعداد متدهای درون یک کلاس
- استفاده از الگوهای طراحی مانند Strategy یا Observer
گزینه صحیح: 3
توضیح: افزایش تعداد متدهای درون یک کلاس معمولاً به بوی بد 'Large Class' منجر میشود و ارتباطی به کاهش وابستگی بین کلاسها ندارد. در حالی که سایر گزینهها به طور مستقیم به کاهش وابستگی و رفع 'Couplers' کمک میکنند.
- کلاسی که مستقیماً به جزئیات پیادهسازی کلاس دیگر دسترسی پیدا میکند، مثلاً `other_object.internal_data = new_value`.
- کلاسی که از متد `print()` برای نمایش خروجی استفاده میکند.
- کلاسی که یک تابع را با استفاده از `lambda` تعریف میکند.
- کلاسی که از دیکشنری برای ذخیره دادهها استفاده میکند.
گزینه صحیح: 1
توضیح: دسترسی مستقیم به دادههای داخلی یک شیء دیگر (`internal_data`) نشاندهندهٔ وابستگی شدید و جزئی به پیادهسازی آن شیء است که مصداق بوی بد Couplers است.
- Feature Envy (حسادت ویژگی)
- Couplers (وابسته کننده ها)
- Long Method (متد طولانی)
- Data Clumps (تودههای داده)
گزینه صحیح: 2
توضیح: وابستگی مستقیم `OrderProcessor` به پیادهسازی `DatabaseLogger` نشاندهندهٔ وابستگی بالا و سفت و سخت بین دو کلاس است که یکی از مصادیق بوی بد 'Couplers' محسوب میشود.
- Divergent Change (تغییر واگرا)
- Couplers (وابسته کنندهها)
- Parallel Inheritance Hierarchies (سلسله مراتب ارثبری موازی)
- Message Chains (زنجیرههای پیام)
گزینه صحیح: 2
توضیح: این سناریو دقیقاً مصداق بوی بد 'Couplers' است. وابستگی شدید بین سرویس 'EmailService' و کلاسهای مصرفکننده آن، باعث میشود تغییر در یک بخش، منجر به زنجیرهای از تغییرات در بخشهای دیگر شود.
- تعریف اینترفیسها (interfaces) یا کلاسهای انتزاعی (abstract classes) که رفتار مشترک را مشخص میکنند.
- استفاده از متدهای private برای پنهان کردن جزئیات.
- نوشتن کد به صورت کوتاهتر و فشردهتر.
- استفاده از متغیرهای سراسری (global variables).
گزینه صحیح: 1
توضیح: انتزاعات، مانند اینترفیسها، مشخص میکنند که چه عملیاتی باید انجام شود بدون اینکه نحوهٔ انجام آن را مشخص کنند. این به کلاسها اجازه میدهد تا به جای پیادهسازیهای خاص، به این انتزاعات وابسته شوند.
- تغییر نام متدهای `DatabaseLogger` تا با `OrderProcessor` همخوانی بیشتری داشته باشند.
- ایجاد یک واسط (Interface) مانند `ILogger` و تزریق آن به `OrderProcessor`.
- انتقال منطق لاگ کردن به داخل کلاس `OrderProcessor`.
- حذف کامل قابلیت لاگ کردن برای سادهسازی کد.
گزینه صحیح: 2
توضیح: با تعریف یک واسط `ILogger` و استفاده از آن در `OrderProcessor`، میتوان انواع مختلفی از لاگرها (مثلاً `DatabaseLogger` یا `FileLogger`) را بدون تغییر در `OrderProcessor` به آن تزریق کرد. این رویکرد وابستگی را معکوس کرده و بوی بد 'Couplers' را کاهش میدهد.
- افزایش سرعت اجرای برنامه.
- کاهش مصرف حافظه.
- افزایش قابلیت نگهداری (Maintainability) و انعطافپذیری (Flexibility) کد.
- بهبود رابط کاربری (User Interface).
گزینه صحیح: 3
توضیح: کاهش وابستگی بین کلاسها، نگهداری کد را آسانتر میکند زیرا تغییرات در یک بخش، تأثیر کمتری بر بخشهای دیگر دارد. همچنین، انعطافپذیری کد را افزایش میدهد و اضافه کردن قابلیتهای جدید را سادهتر میسازد.
- Dependency Injection (تزریق وابستگی).
- Singleton (تکنمونه).
- Factory Method (متد کارخانه).
- Adapter (آداپتور).
گزینه صحیح: 1
توضیح: Dependency Injection (DI) یک تکنیک است که در آن وابستگیهای یک شیء به جای اینکه توسط خود شیء ایجاد شوند، از خارج به آن داده میشوند. این امر وابستگی بین کلاسها را به شدت کاهش میدهد.
- Single Responsibility Principle (SRP)
- Open/Closed Principle (OCP)
- Dependency Inversion Principle (DIP)
- Interface Segregation Principle (ISP)
گزینه صحیح: 3
توضیح: Dependency Inversion Principle (DIP) مستقیماً بر وارونگی وابستگی تأکید دارد، به این معنی که ماژولهای سطح بالا و پایین باید به انتزاعات وابسته باشند، نه به یکدیگر. این اصل به طور مؤثری وابستگیهای سفت و سخت را کاهش میدهد.
- Liskov Substitution Principle (LSP) - اصل جایگزینی لیسکوف
- Interface Segregation Principle (ISP) - اصل تفکیک رابط
- Open/Closed Principle (OCP) - اصل باز/بسته
- Dependency Inversion Principle (DIP) - اصل وارونگی وابستگی
گزینه صحیح: 3
توضیح: اصل باز/بسته (OCP) بیان میکند که نرمافزار باید برای توسعه باز باشد اما برای تغییر بسته. با استفاده از انتزاعات و جلوگیری از تغییر کلاسهای موجود، OCP به طور طبیعی وابستگی به جزئیات پیادهسازی را کاهش داده و به رفع 'Couplers' کمک میکند.
- اگر کلاسی مسئولیتهای زیادی داشته باشد، ممکن است برای انجام وظایف خود به جزئیات پیادهسازی کلاسهای دیگر وابسته شود.
- اگر کلاسی فقط یک مسئولیت داشته باشد، هیچ وابستگیای ایجاد نمیکند.
- SRP مستقیماً با Couplers ارتباطی ندارد.
- تعداد متدها در کلاس را افزایش میدهد.
گزینه صحیح: 1
توضیح: وقتی یک کلاس مسئولیتهای متعددی را بر عهده میگیرد، ممکن است برای انجام هر یک از این مسئولیتها نیاز به تعامل با بخشهای مختلف سیستم داشته باشد و در نتیجه وابستگیهای ناخواستهای ایجاد کند.
- Singleton (تکنمونه)
- Factory Method (متد کارخانه)
- Adapter (آداپتور)
- All of the above (همه موارد)
گزینه صحیح: 4
توضیح: الگوهای طراحی مانند Singleton، Factory Method و Adapter همگی میتوانند به مدیریت وابستگیها و کاهش coupling بین کلاسها کمک کنند. Singleton برای مدیریت دسترسی به یک نمونهٔ واحد، Factory Method برای انتزاع فرآیند ایجاد اشیاء، و Adapter برای ایجاد سازگاری بین واسطهای ناسازگار استفاده میشوند.
- Factory Pattern (الگوی کارخانه)
- Singleton Pattern (الگوی تکنسخه)
- Dependency Injection (تزریق وابستگی) - که اغلب با الگوهایی مانند Factory یا Service Locator پیادهسازی میشود.
- Observer Pattern (الگوی ناظر)
گزینه صحیح: 3
توضیح: تزریق وابستگی (DI) یک الگوی طراحی است که هدف اصلی آن مدیریت وابستگیها بین اشیاء است. این الگو با جدا کردن فرآیند ایجاد وابستگیها از کلاسهایی که به آنها نیاز دارند، وابستگی مستقیم را کاهش داده و به رفع 'Couplers' کمک میکند.
- کاهش وابستگیها باعث میشود تغییر در یک بخش از سیستم، کمتر بر بخشهای دیگر تأثیر بگذارد و توسعه آسانتر شود.
- کد با وابستگی زیاد، سریعتر اجرا میشود.
- کاهش Couplers باعث افزایش پیچیدگی کد میشود.
- این موضوع فقط برای پروژههای کوچک اهمیت دارد.
گزینه صحیح: 1
توضیح: سیستمهایی با وابستگی کم (low coupling) انعطافپذیرتر هستند؛ تغییر در یک کامپوننت به راحتی قابل انجام است بدون اینکه نیازی به بازنویسی بخشهای دیگر سیستم باشد.
- میزان درهمتنیدگی (interconnectedness) منطق و داده بین کلاسها.
- توانایی یک کلاس برای تغییر رفتار بدون تأثیر بر کلاسهای دیگر.
- میزان استقلال (independence) یک کلاس از سایر کلاسها در سیستم.
- تعداد متدهایی که یک کلاس ارائه میدهد.
گزینه صحیح: 1
توضیح: Couplers به درجهای اشاره دارد که کلاسها به جزئیات پیادهسازی یکدیگر وابسته هستند. این وابستگی بالا باعث درهمتنیدگی منطق و داده بین کلاسها میشود و تغییر در یکی، به راحتی بر دیگری تأثیر میگذارد.
- یک کلاس که از یک سرویس خارجی از طریق یک API استاندارد استفاده میکند.
- یک کلاس که به طور مستقیم به فیلدهای عمومی (Public Fields) کلاس دیگر دسترسی دارد.
- یک کلاس که از یک کتابخانه استاندارد (مانند کتابخانه ریاضی) استفاده میکند.
- یک کلاس که از طریق یک واسط (Interface) با کلاس دیگری ارتباط برقرار میکند.
گزینه صحیح: 2
توضیح: دسترسی مستقیم به فیلدهای عمومی (Public Fields) یک کلاس، وابستگی شدیدی ایجاد میکند. هر تغییری در نام یا نوع آن فیلد، نیاز به تغییر در تمام کلاسهایی که به آن دسترسی دارند، خواهد داشت. این یک نشانه قوی از بوی بد 'Couplers' است.
- استفاده از یک API Gateway و الگوهای ارتباطی غیرهمزمان (asynchronous communication) مانند صف پیام (message queues).
- استفاده از یک دیتابیس مرکزی برای تمام سرویسها.
- ارسال مستقیم درخواستهای HTTP بین سرویسها بدون هیچ لایهٔ واسط.
- استفاده از متدهای private در تمام سرویسها.
گزینه صحیح: 1
توضیح: API Gateway به عنوان یک نقطه ورود واحد عمل میکند و الگوهای ارتباطی غیرهمزمان، وابستگی مستقیم بین سرویسها را کاهش داده و به سیستم اجازه میدهد تا با انعطافپذیری بیشتری کار کند.
- Single Responsibility Principle (SRP)
- Open/Closed Principle (OCP)
- Dependency Inversion Principle (DIP)
- Interface Segregation Principle (ISP)
گزینه صحیح: 4
توضیح: Interface Segregation Principle (ISP) بیان میکند که هیچ کلاینتی نباید مجبور باشد به متدهایی وابسته باشد که از آنها استفاده نمیکند. این اصل با تشویق به ایجاد واسطهای کوچک و مخصوص، وابستگیهای غیرضروری را کاهش داده و به رفع بوی بد 'Couplers' کمک میکند.
- با بزرگتر کردن رابطها تا همه عملیات مورد نیاز را شامل شوند.
- با ایجاد رابطهای کوچک و تخصصی که هر کدام فقط متدهای مربوط به یک وظیفه خاص را تعریف میکنند.
- با حذف کامل رابطها و استفاده مستقیم از کلاسها.
- با ادغام چندین رابط کوچک در یک رابط بزرگ.
گزینه صحیح: 2
توضیح: اصل تفکیک رابط (ISP) بیان میکند که هیچ کلاینتی نباید مجبور باشد به متدهایی وابسته باشد که از آنها استفاده نمیکند. ایجاد رابطهای کوچک و تخصصی، وابستگی را کاهش میدهد زیرا کلاسها فقط به آن بخشهایی از رابط که نیاز دارند، متکی میشوند و این به کاهش 'Couplers' کمک میکند.
این مطلب برگرفته از محصول آموزشی «شناسایی بوی بد کد (Code Smells) و رفع آنها با SOLID» است
برای مشاهده توضیحات کامل، جزئیات دوره و دریافت محصول، روی دکمه زیر کلیک کنید.
اطلاعات بیشتر و دریافت محصول