اصول SOLID در برنامه نویسی - اصل D

اصول SOLID، SOLID در برنامه نویسی، آموزش برنامه نویسی، برنامه نویسی حرفه ای 1404/3/3
نویسنده: مدرس بهمن آبادی

 

اصل وارونگی وابستگی (Dependency Inversion Principle)

اصول SOLID در برنامه نویسی 

اصول SOLID در برنامه نویسی

اصل D از مجموعه اصول SOLID که مخفف Dependency Inversion Principle (اصل وارونگی وابستگی) است، یکی از پنج اصل اساسی در طراحی شیءگرا و مهندسی نرم‌افزار است که به بهبود معماری و انعطاف‌پذیری کد کمک می‌کند. این اصل بیان می‌کند که ماژول‌های سطح بالا نباید به ماژول‌های سطح پایین وابسته باشند، بلکه هر دو باید به abstractions (مانند رابط‌ها یا کلاس‌های انتزاعی) وابسته باشند. همچنین، جزئیات پیاده‌سازی باید به abstractions وابسته باشند، نه برعکس. در این مقاله، به بررسی این اصل، اهمیت آن، و مثال‌هایی به زبان سی‌شارپ می‌پردازیم.

مفهوم اصل وارونگی وابستگی

اصل D بر این ایده تمرکز دارد که وابستگی‌های بین کلاس‌ها باید از طریق abstractionها (مانند رابط‌ها یا کلاس‌های انتزاعی) مدیریت شوند، نه از طریق کلاس‌های مشخص (concrete). این کار باعث می‌شود که کد انعطاف‌پذیرتر، قابل تست، و قابل نگهداری باشد. به عبارت دیگر:

  • ماژول‌های سطح بالا (مانند منطق تجاری برنامه) نباید مستقیماً به کلاس‌های سطح پایین (مانند دسترسی به دیتابیس یا سرویس‌های خارجی) وابسته باشند.
  • جزئیات پیاده‌سازی (مانند نحوه ذخیره‌سازی داده‌ها) باید به abstractionها وابسته باشند، نه به ماژول‌های سطح بالا.

این اصل به کاهش وابستگی‌های تنگاتنگ (tight coupling) و افزایش قابلیت جایگزینی اجزای سیستم کمک می‌کند. مهندس بهمن‌آبادی در دوره جامع برنامه‌نویسی وب به طور مفصل توضیح داده‌اند که چگونه استفاده از این اصل می‌تواند طراحی نرم‌افزار را بهبود بخشد و از مشکلات وابستگی‌های غیرضروری جلوگیری کند.

چرا اصل D مهم است؟

این بحث بسیار مهم هست و مدرس بهمن آبادی در دوره جامع برنامه‌نویسی وب چندین بار در جلسات مختلف این مبحث با مثالهای مختلف تشریح کرده اند.

استفاده از اصل وارونگی وابستگی مزایای متعددی دارد:

  1. انعطاف‌پذیری: با استفاده از رابط‌ها، می‌توان پیاده‌سازی‌های مختلف را به راحتی جایگزین کرد.
  2. قابلیت تست: تست واحد (Unit Testing) ساده‌تر می‌شود، زیرا می‌توان وابستگی‌ها را با Mockها جایگزین کرد.
  3. کاهش کوپلینگ: وابستگی‌های تنگاتنگ بین کلاس‌ها کاهش می‌یابد، که نگهداری کد را آسان‌تر می‌کند.

برای مثال، اگر یک برنامه به یک سرویس دیتابیس خاص وابسته باشد، تغییر دیتابیس (مثلاً از SQL Server به MongoDB) دشوار خواهد بود. اصل D این مشکل را با معرفی یک رابط حل می‌کند. مهندس بهمن‌آبادی در دوره جامع برنامه‌نویسی وب، با مثال‌های عملی، نشان داده‌اند که چگونه این اصل می‌تواند در پروژه‌های واقعی وب پیاده‌سازی شود.

مثال عملی در سی‌شارپ

فرض کنید یک سیستم مدیریت کاربران داریم که اطلاعات کاربران را از دیتابیس می‌خواند. بدون رعایت اصل D، ممکن است کد به این شکل باشد:

 

در این کد، UserService مستقیماً به UserRepository وابسته است. اگر بخواهیم دیتابیس را عوض کنیم (مثلاً به MongoDB)، باید UserService را تغییر دهیم، که نقض اصل D است.

حالا بیایید این کد را با رعایت اصل D بازنویسی کنیم. ابتدا یک رابط تعریف می‌کنیم:

سپس، پیاده‌سازی‌های مختلف برای این رابط ایجاد می‌کنیم:

حالا UserService را به گونه‌ای بازنویسی می‌کنیم که به رابط وابسته باشد، نه به پیاده‌سازی خاص:

در این حالت، UserService به رابط IUserRepository وابسته است، نه به پیاده‌سازی خاص. می‌توانیم به راحتی SqlUserRepository یا MongoUserRepository را تزریق کنیم. این روش که به Dependency Injection معروف است، یکی از تکنیک‌های کلیدی برای پیاده‌سازی اصل D است. مهندس بهمن‌آبادی در دوره جامع برنامه‌نویسی وب، مثال‌های مشابهی را با جزئیات و در پروژه‌های وب واقعی توضیح داده‌اند تا نشان دهند چگونه این اصل در عمل پیاده‌سازی می‌شود.

استفاده از Dependency Injection

برای استفاده عملی از اصل D، معمولاً از یک ظرف DI (Dependency Injection Container) مانند Microsoft.Extensions.DependencyInjection در سی‌شارپ استفاده می‌شود. در مثال زیر، نحوه تنظیم DI را نشان می‌دهیم:

در این کد، SqlUserRepository به عنوان پیاده‌سازی IUserRepository ثبت شده است. اگر بخواهیم دیتابیس را به MongoDB تغییر دهیم، کافی است خط ثبت سرویس را به MongoUserRepository تغییر دهیم، بدون نیاز به تغییر کد UserService، مثالهای عملی در دوره جامع برنامه‌نویسی وب وجود دارد.

مزایا و چالش‌ها

مزایا:

  • قابلیت گسترش: افزودن پیاده‌سازی‌های جدید (مثلاً یک دیتابیس جدید) بدون تغییر کد موجود ممکن است.
  • تست‌پذیری: با استفاده از Mockها، تست واحد ساده‌تر می‌شود.
  • نگهداری آسان: تغییرات در یک ماژول تأثیر کمتری بر ماژول‌های دیگر دارد.

چالش‌ها:

  • پیچیدگی اولیه: استفاده از رابط‌ها و DI ممکن است در پروژه‌های کوچک پیچیدگی غیرضروری ایجاد کند.
  • نیاز به دانش بیشتر: توسعه‌دهندگان باید با مفاهیم DI و abstractions آشنا باشند.

نتیجه‌گیری

اصل وارونگی وابستگی (Dependency Inversion Principle) یکی از اصول کلیدی SOLID است که به کاهش وابستگی‌های تنگاتنگ و افزایش انعطاف‌پذیری و تست‌پذیری کد کمک می‌کند. با استفاده از رابط‌ها و تکنیک‌هایی مانند Dependency Injection، می‌توان سیستمی طراحی کرد که به راحتی قابل تغییر و گسترش باشد. مثال‌های ارائه‌شده در سی‌شارپ نشان می‌دهند که چگونه این اصل در عمل پیاده‌سازی می‌شود. برای یادگیری عمیق‌تر و مثال‌های عملی بیشتر، دوره جامع برنامه‌نویسی وب مهندس بهمن‌آبادی منبع ارزشمندی است که این مفاهیم را به صورت کامل و کاربردی توضیح داده است.