این مبحث یکی از پرتکرار ترین سوال هایی هست که تو مصاحبه های استخدامی از من شده.
چه اینور آب چه انور آب و اگه شما به این مبحث مسلط باشید و خوب بتونید توضیح بدید و حقوق پرت نزده باشید شانستون برای جذب اون کار بالا میره.
منهای بحث استخدامی اگر شما dependency inversion رو خوب درک کنید و خوب بتونید رعایت کنید میتونید کدهایی بنویسید که این کد ها testable هستن و به راحتی میشه تست خوبی بنویسد.
ضمنا کد هایی بنویسید که قابلیت کتابخونه شدن هستن. بقیه قابلیت Extend شدن هستن و کاری بکنید که بقیه بتونن برای شما Plugin بنویسین البته این مورد پیچیدگی خودشو داره. البته هر کدی انقدر منعطف نیست که به راحتی بشه روش Plugin نصب بشه و اجزا اون بشه از هم جدا بشن و طبق نیاز با اجزای جدید تری استفاده بشن.
مزیت بعدی اینه شما میتونید کدتون رو جوری دربیارید که کد هاتون از یه پروژه به پروژه بعدی قابل انتقال باشه.
اگر یه سری امکانات نوشتید و پروژه بعدی همون امکانات رو میخواست ، مستقلا این امکانات رو به پروژه دوم انتقال دهید.
خلاصه بخوام بگم فهمیدن مفهموم dependency inversion و رعایت کردن اون code quality و کیفت کدی که شما به عنوان مهندس نرم افزار مینویسید و نگهداری میکنید از این رو به اون رو میشه.
فقط باید قبلش چند تا مفهوم پایه ای رو مرور کنیم.
اصلا بفهمیم dependency یعنی چی.
ابتدا باید مفهوم module رو بفهمیم و مرز ها رو بتونیم خیلی خوب توی سیستم مشخص کنیم. حالا این مرز ها چی هستن رو جلوتر خدمتتون عرض میکنم.
بعد مفهوم inversion رو بفهمیم. inversion یعنی برعکس بودن.
بعد این دوره اگر کسی از شما پرسید dependency inversion چیه و برعکس بودن وابستگی ها چیه باید خیلی خوب بتونید توضیح بدید.
کل این قاعده تو دو جمله در ویکیپیدا توضیح داده شده
High-level modules should not import anything from low-level modules. Both should depend on abstractions (e.g., interfaces).
Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions.
این مفهوم جامع ترین مفهومی هست که میشه درباره این مفهوم صحبت کرد.
اینجا درباره high level و low level رو مشخص کرده ما کی باید high بنویسم و کی باید low بنویسم.
اکثر برنامه نویس های درباره high level و low level چیزی نمیدونن و اصلا نمیدونن کدوم کد به چه صورت هست و زمانی که یه فایل باز میکنی میبینی یه خط درمیون high level و low level نوشته و رفته جلو.
و تجربه ای که من داشتم با همکارام که high level و low level رو جلو میکنم و میرم جلو با موجی از مخالفت های همکارام متوجه میشم که چرا امدی سیستم روییچیده طراحی کردی و همه چی ساده بنویس بره.
در واقع زمانی که کد رو ساده اما منعطف طراحی میکنی میان اعتراض میکنم که چرا اینجوری طراحی کردی. حالا بالا برو پایین بیا که چرا اینجوری زدی و ساده ننوشتی.
تو همون توضیح wiki که بالا گفتم شما باید مفهوم abstraction بدونید تو پرانتز eg interfaces
حالا ممکنه شما بگید من میدونم abstraction چیه یعنی همون interfaces.
این حرف درسته اما فقط interfaces ها فقط abstraction نیستن.
پس خیلی خوب باید اول abstraction ها رو بفهمم که چیا هستن. معنی deepend رو بفهمیم که یعنی چی. معنی high level و low level رو بفهمیم. باید بفهمیم فرق abstraction با detail چیه. این concrete implementations رو درست درک کنیم.
تا بتونیم از dependency inversion در نهایت به صورت درست و بجا در کدمون استفاده کنیم و کدی بنویسم که هر کسی دید بگه چه کدی.