Dependency Injection و Dependency Inversion

اصول dependency injection و dependency inversion، دو اصل مهم در طراحی نرم‌افزار به منظور تفکیک و جداسازی کلاس‌ها و وابستگی‌ها از یکدیگر است. بسیاری این دو را یکسان در نظر می‌گیرند ولی در واقع هر کدام با تکیه بر قواعدی متفاوت، تفکیک و انتزاعی‌سازی کد را جهت قابلیت استفاده مجدد و تست نویسی ساده‌تر، انجام می‌دهند.

تکنیک Dependency Injection یا DI برای دستیابی به تفکیک چسبندگی بین کلاس‌ها و وابستگی‌هایشان استفاده می‌شود. در این تکنیک، وابستگی‌ها، به جای اینکه در داخل خود کلاس تعریف شوند، از بیرون تزریق می‌شوند.

اصل Dependency Inversion Principle یا DIP یک اصل طراحی سطح بالا و پنجمین اصل SOLID است که به دنبال جداسازی ماژول‌های سطح بالا از ماژول‌های سطح پایین است. بر اساس این اصل، ماژول‌های سطح بالا نباید به ماژول‌های سطح پایین وابسته باشند؛ هر دو باید به انتزاعات وابسته باشند.

یکی از نکات مهم برای استفاده از اصول مربوط به dependency، قابلیت تست نرم‌افزار است زیرا در صورت عدم استفاده از این اصول امکان استفاده از mock نیز به سادگی امکان پذیر نخواهد بود.

هدف من از این نوشته، بیان تفاوت بین این دو اصل می‌باشد. در ادامه نحوه‌ی استفاده این قواعد در کنار یکدیگر در نمونه کدهای go، نشان داده می‌شود.

در نمونه کد اول، هیچکدام از قواعد dependency injection و dependency inversion رعایت نشده است. Logger، به صورت مستقیم در تابع UserService تعریف شده که اصل dependency injection را نقض می‌کند و همچنین استراکت UserService، بجای وابستگی به یک interface، مستقیما به ماژول سطح پایین Logger وابسته شده است.

نمونه کد اول
نمونه کد اول


در نمونه کد دوم dependency injection رعایت شده، و Logger از بیرون برای تابع ارسال شده ولی dependency inversion رعایت نشده است.

نمونه کد دوم
نمونه کد دوم


در نمونه کد سوم، dependency injection و dependency inversion رعایت شده است. در واقع در این کد Logger از نوع اینترفیس ساخته شده و برای استفاده نیز از این اینترفیس استفاده می‌شود، در نتیجه کد به انتزاعات تکیه دارد. و همچنین برای استفاده از Logger در NewUserService، این اینترفیس به عنوان پارامتر ورودی تعریف شده و به طور مستقیم در تابع ساخته نشده است در نتیجه dependency injection نیز رعایت شده است.

نمونه کد سوم
نمونه کد سوم