Interface Segregation
The Interface Segregation Principle (ISP) is one of the SOLID principles of object-oriented design, emphasizing that a class should not be forced to implement interfaces it does not use. It promotes the idea of creating client-specific interfaces to prevent classes from being burdened with methods they do not need.
Key principles of the Interface Segregation Principle (ISP):
Client-Specific Interfaces:
- Instead of creating large, general-purpose interfaces, design interfaces that are specific to the needs of the clients (classes or modules) that use them.
- This ensures that each class is only obligated to implement the methods relevant to its specific requirements.
Avoidance of Fat Interfaces:
- Fat interfaces contain more methods than a class might need, leading to unnecessary dependencies and potential implementation of irrelevant methods.
- ISP suggests breaking down interfaces into smaller, focused ones, reducing the chance of forcing classes to implement unnecessary functionality.
Reduced Dependency:
- By adhering to ISP, classes become less dependent on methods they don't use, reducing coupling between different parts of the system.
- Reducing dependencies contributes to a more modular and maintainable codebase.
Flexibility in Implementations:
- ISP allows for flexibility in implementing interfaces, enabling classes to implement only what is required for their specific functionality.
- This flexibility promotes adaptability to changes and simplifies future modifications.
Example:
Consider a scenario where you have an Worker
interface that includes methods for both manual and automated tasks. Without following ISP, a class like Robot
may be forced to implement methods irrelevant to its nature.
# Without ISP
class Worker:
def do_manual_work(self):
pass
def operate_machine(self):
pass
class HumanWorker(Worker):
def do_manual_work(self):
# Human-specific manual work
def operate_machine(self):
# Human cannot operate a machine
class RobotWorker(Worker):
def do_manual_work(self):
# Robot does not perform manual work
def operate_machine(self):
# Robot-specific machine operation
Following ISP, we can create separate interfaces for manual work and machine operation, allowing classes to implement only the relevant methods:
# With ISP
class ManualWorker:
def do_manual_work(self):
pass
class MachineOperator:
def operate_machine(self):
pass
class HumanWorker(ManualWorker, MachineOperator):
def do_manual_work(self):
# Human-specific manual work
def operate_machine(self):
# Human-specific machine operation
class RobotWorker(MachineOperator):
def operate_machine(self):
# Robot-specific machine operation
Now, classes can implement only the interfaces that are relevant to their nature, adhering to the Interface Segregation Principle.