سلام
دوستان درباره اصل وارونگی وابستگی (Dependency Inversion Principle) ، سئوال داشتم .

SOLID Principles in C#‎ - Dependency Inversion Principle - Code Maze (code-maze.com)

طبق این اصل انگار میگه که :
- ماژول های (فرضا کلاس های) سطح بالا ، نباید (بصورت مستقیم) به ماژول ها (و کلاس های) سطح پایین ، وابسته باشن .
هر دوی این ماژول ها باید به انتزاع (معمولا Interface ها یا شاید هم کلاس های abstract) وابسته باشن .

- دومی هم که دقیق متوجه نشدم میگه که انتزاع نباید به جزئیات وابسته باشه ؛ بلکه باید برعکس باشه .

-----------

جوری که متوجه شدم ، انگار کلاس های سطح پایین ، به کلاس هایی میگن که شی ای از کلاسِ مورد نظر را در خودش نداره .
کلاس های سطح بالا هم کلاس هایی هستن که شی ای از کلاسِ موردِ نظرِ دیگه ای ، درون اونها ساخته میشه .

فرضا در عکس زیر ، کلاس C ، نسبت به کلاس B ، کلاس سطح بالا محسوب میشه چون در کلاس C ، شی ای از کلاس B ساخته میشه .
همچنین خودِ کلاسِ B ، نسبت به کلاس A ، سطح بالا محسوب میشه چون درون کلاس B ، از کلاس A ، شی ساخته میشه .


SOLID.jpg


- دقت کنید که شکل بالا ، رابطه ی ارث بری ندارن ها . رابطه شون این طوره که درون کلاس بالاتر ، شی ای از کلاس پایین ترشون ایجاد میشه .

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

اول از اینکه مطالبی که در بالا گفتم را درست متوجه شدم؟
دوم از اینکه ، اون بخش دوم را که گفتم متوجه نشدم ، کسی توضیحی میده؟

==========


اما مهمترین سئوال ام (که هدف از این تاپیک بود) اینه که اگه در یه پروژه (مخصوصا پروژه های بزرگ) ، این طور بخوایم پیش بریم ، اصلا یه چیزِ قاتی پاتی و گیج کننده ای میشه که .
درست میگم؟

فرضا کنید در شکل بالا که کلاس A ، نسبت به کلاس B ، کلاسی سطح پایین محسوب میشه ، بخاطر این اصل ، کلاس A ، اینترفیسی را پیاده سازی کنه و درون کلاس B هم نوع داده ای را از اون اینترفیس در نظر گرفته بشه اما شی اش از نوع کلاس A داده بشه .

حالا خود کلاسِ B ، نسبت به کلاس C ، کلاسی سطح پایین محسوب میشه . پس این هم باید یه اینترفیس دیگه ای پیاده سازی کنه و درون کلاس C ، نوع داده ای اش ، از نوع اون اینترفیس و شی اش از کلاس B ساخته بشه .

--------


به همین ترتیب ، حتی لایه های دیگه و ارتباط دو لایه هم با هم ، باید این طور بشه دیگه؟ درسته؟

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

اما به وفور میبینیم که خود مایکروسافت هم از نوع کلاس ، به عنوان داده هاش استفاده میکنه (البته از اینترفیس ها هم استفاده میکنه) .

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

اگه این طوره ، این شرایط ، چه شرایطی هستند؟
یعنی در صورتِ وقوعِ چه شرایطی ، اصل وارونگی وابستگی را در پروژه مون اجرا میکنیم؟

تشکر