|
Definition of the Dependency Inversion Principle?
High-level modules should not depend on low-level modules. Both should depend
on the abstraction.
Abstractions should not depend on details. Details should depend on
abstractions.
What is high-level module?
A high-level module is a module which depends on other modules.
Ex: Direct Dependency - A concrete class depends on other
concrete classes.
What is low-level module?
A low-level module is a module which depends on abstraction (abstract
classes/interfaces).
Ex: Inverted Dependency - Concrete class depends only on
abstract class or interfaces.
Lets consider a banking transaction scenario where we provide the feature of
fetching transcation between the given dates.
In the above code
both Account and TransactionService are
concrete classes and Account class is high-level class which
is depending on the low-level
module TransactionService. Account class is
having strong tightly coupled dependency
with TransactionService. Testing frameworks configuration and
code maintenance is typical. Let's refactor the code by adding the Dependency
Inversion Principle rules on the above code.
First let's introduce a new interface which acts as a bridge
between Account and TransactionService classes.
Implement the interface in TransactionService class
Finally use
the ITransactionService in Account class
Here now the Account class is depending on
the ITransactionService which is an abstraction for both
Account and TransactionService.
Advantages:
- It breaks the tight coupling by introducing the abstraction.
- Code maintenance is easier as we are stabling the modules.
- Test Driven Development is easier with the testing frameworks.
- Code-Re-usability.
- Reduces the risk.
Please check my below posts on other SOLID principles for better
understanding
Single Responsibility Principle (SRP)
Open/Closed Principle (OCP)
Liskov Substitution Principle (LSP)
Interface Segregation Principle (ISP)
No comments:
Post a Comment