اصل وارونگی وابستگی

در طراحی شیءگرا، اصل وارونگی وابستگی (به انگلیسی: dependency inversion principle) شکل خاصی از جفتگری در برنامه‌نویسی ماژولی است. هنگام پیروی از این اصل، ماژول‌های سطح بالا مستقل از جزئیات پیاده‌سازی ماژول سطوح پایین ارائه می‌شوند. این اصل می‌گوید:[۱]

  1. ماژول‌های سطح بالاتر نباید به ماژول‌های سطح پایین‌تر وابسته باشند. ماژول‌ها در هر دو سطح باید به انتزاع (abstract) وابسته باشند.
  2. انتزاع نباید به جزئیات بستگی داشته باشد. جزئیات باید به انتزاع وابسته باشد.

با بیان اینکه آبجکت‌های سطوح بالا و پایین باید به انتزاع یکسان وابسته باشند، این اصل طراحی، طرز تفکر برخی از افراد دربارهٔ برنامه‌نویسی شیءگرا را وارونه می‌کند.[۲]

اصل وارونگی وابستگی‌ها به این معنا است که بجای اینکه ماژول‌های سطح پایین سیستم، رابط‌های قابل استفاده‌ای از خود را در اختیار سطوح بالاتر سیستم قرار دهند، ماژول‌های قرار گرفته در سطوحی بالاتر، اینترفیس‌هایی (interface) را تعریف می‌کنند که توسط ماژول‌های سطح پایین پیاده‌سازی خواهند شد.

الگوی لایه های سنتی

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

الگوی وارونگی وابستگی

با معرفی یک لایه انتزاعی، هر دو لایه سطح بالا و سطح پایین، وابستگی‌های سنتی از بالا به پایین را کاهش می‌دهند. با این وجود، مفهوم "وارونگی" به این معنا نیست که لایه‌های سطح پایین‌تر مستقیماً به لایه‌های سطح بالاتر وابسته باشند. بلکه، هر دو لایه باید به انتزاع‌هایی وابسته باشند که رفتار مورد نیاز لایه‌های سطح بالاتر را آشکار می‌کنند.

در کاربرد مستقیم وارونگی وابستگی، انتزاع‌ها متعلق به لایه‌های بالاتر/سیاست‌گذاری هستند. این معماری، اجزای بالاتر/سیاست‌گذاری و انتزاع‌هایی را که خدمات پایین‌تر را تعریف می‌کنند، با هم در یک بسته گروه‌بندی می‌کند. لایه‌های سطح پایین‌تر با ارث‌بری/پیاده‌سازی این کلاس‌های انتزاعی یا واسط‌ها ایجاد می‌شوند. وارونگی وابستگی‌ها و مالکیت، استفاده مجدد از لایه‌های بالاتر و سیاست‌گذاری را تشویق می‌کند. لایه‌های بالاتر می‌توانند از پیاده‌سازی‌های دیگری از خدمات پایین‌تر استفاده کنند. هنگامی که اجزای لایه سطح پایین‌تر بسته هستند یا زمانی که برنامه نیاز به استفاده مجدد از خدمات موجود دارد، معمول است که یک آداپتور بین خدمات و انتزاع‌ها میانجی‌گری کند.

پیاده سازی

دو پیاده‌سازی رایج از الگوی وارونگی وابستگی از معماری منطقی مشابهی استفاده می‌کنند اما پیامدهای متفاوتی دارند. یک پیاده‌سازی مستقیم، کلاس‌های سیاست‌گذاری را به همراه کلاس‌های انتزاعی سرویس در یک کتابخانه واحد بسته‌بندی می‌کند. در این پیاده‌سازی، اجزای سطح بالا و اجزای سطح پایین در بسته‌ها/کتابخانه‌های جداگانه‌ای توزیع می‌شوند. در اینجا، واسط‌هایی که رفتار/سرویس‌های مورد نیاز اجزای سطح بالا را تعریف می‌کنند، متعلق به کتابخانه اجزای سطح بالا بوده و در آنجا قرار دارند. پیاده‌سازی واسطِ اجزای سطح بالا توسط اجزای سطح پایین، نیازمند این است که بسته اجزای سطح پایین برای جمع آوری شدن به اجزای سطح بالا وابسته باشد، و بدین ترتیب رابطه وابستگی متداول را معکوس می‌کند.

جستارهای وابسته

منابع

  1. ↑ Martin, Robert C. (2003). Agile Software Development, Principles, Patterns, and Practices. Prentice Hall. pp. 127–131. ISBN 978-0-13-597444-5.
  2. ↑ Freeman, Eric; Freeman, Elisabeth; Kathy, Sierra; Bert, Bates (2004). Hendrickson, Mike; Loukides, Mike (eds.). Head First Design Patterns (paperback). 1. O'REILLY. ISBN 978-0-596-00712-6. Retrieved 2012-06-21.