اصل وابستگی معکوس (DIP) یکی از پنج اصل برنامه نویسی و طراحی شیء گرا است که به عنوان SOLID شناخته می شود. این اصل بیان می کند که ماژول های سطح بالا نباید به ماژول های سطح پایین وابسته باشند، بلکه هر دو باید به انتزاعات وابسته باشند. علاوه بر این، انتزاعات نباید به جزئیات وابسته باشند، بلکه جزئیات باید به انتزاعات وابسته باشند.
به عبارت دیگر، DIP پیشنهاد می کند که شما باید کد خود را با وابستگی به انتزاعات به جای پیاده سازی های قطعی جداسازی کنید. این می تواند باعث شود کد شما انعطاف پذیرتر و آسان تر در تغییر باشد، زیرا شما می توانید پیاده سازی های مختلف انتزاع را تغییر دهید بدون اینکه کد سطح بالایی که به آن وابسته است را تحت تأثیر قرار دهید.
در اینجا یک مثال وجود دارد که نشان می دهد چگونه DIP را در C ++ اعمال کنید:
#include <iostream> #include <memory> // رابط انتزاعی برای یک logger class ILogger { public: virtual ~ILogger() = default; virtual void log(const std::string& message) = 0; }; // پیاده سازی قطعی logger که به console لاگ می کند class ConsoleLogger : public ILogger { public: void log(const std::string& message) override { std::cout << "Log: " << message << std::endl; } }; // کلاس سطح بالایی که به انتزاع ILogger وابستگی دارد class MyClass { public: MyClass(std::shared_ptr<ILogger> logger) : logger_(logger) {} void doSomething() { // ... logger_->log("Doing something"); // ... } private: std::shared_ptr<ILogger> logger_; }; int main() { auto logger = std::make_shared<ConsoleLogger>(); MyClass myClass(logger); myClass.doSomething(); return 0; }
در این مثال، ما یک رابط ILogger داریم که یک رابط انتزاعی برای logger تعریف می کند. سپس ما یک کلاس ConsoleLogger داریم که با لوگ کردن پیام ها به console ، پیاده ساز