Thu. Nov 21st, 2024

SOLID is a set of five principles that guide software design to create more maintainable, scalable, and robust systems. These principles are often associated with object-oriented programming (OOP) and help developers write cleaner code that is easier to understand, modify, and extend. SOLID is an acronym where each letter represents one principle:


1. Single Responsibility Principle (SRP)

A class should have only one reason to change.

  • Explanation: Each class or module should focus on a single responsibility or functionality. This makes the code easier to understand and reduces the risk of bugs when changes are made.
  • Example:
    • A class handling file operations (reading/writing) should not also handle logging.
FileManager { 
fun saveFile(data: String)
{ /* Save file logic */ }
}
class Logger {
fun log(message: String)
{ /* Logging logic */ }
}

2. Open/Closed Principle (OCP)

Software entities (classes, modules, functions) should be open for extension but closed for modification.

  • Explanation: You should be able to add new functionality without altering existing code. This prevents introducing bugs into the existing system while adding new features.
  • Example:
    • Use inheritance or interfaces to extend behavior.
{ 
fun draw()
}
class Circle : Shape {
override fun draw()
{ /* Draw circle logic */ }
}
class Rectangle : Shape {
override fun draw()
{ /* Draw rectangle logic */ }
}
fun renderShapes(shapes: List<Shape>)
{ shapes.forEach { it.draw() }
}

3. Liskov Substitution Principle (LSP)

Derived classes must be substitutable for their base classes.

  • Explanation: Subtypes must be usable in place of their base types without altering the correctness of the program.
  • Example:
    • If Bird is a base class, all subclasses (e.g., SparrowPenguin) should behave like a Bird.
class Bird { 
open fun fly() { println("Flying...")
}
}
class Sparrow : Bird()
{ /* Sparrow can fly */ }
class Penguin : Bird() {
override fun fly()
{ throw UnsupportedOperationException("Penguins can't fly!")
}
}
  • This violates LSP because Penguin cannot truly replace Bird without causing runtime issues.

4. Interface Segregation Principle (ISP)

A class should not be forced to implement interfaces it does not use.

  • Explanation: Split large interfaces into smaller, more specific ones so that classes only need to implement methods they actually use.
  • Example:
Printer { fun print() 
} interface Scanner {
fun scan()
}
class MultiFunctionPrinter : Printer, Scanner
{ override fun print()
{ /* Printing logic */ }
override fun scan() { /* Scanning logic */ }
} class SimplePrinter : Printer {
override fun print() { /* Printing logic */ }
}
  • This avoids forcing SimplePrinter to implement scan().

5. Dependency Inversion Principle (DIP)

High-level modules should not depend on low-level modules; both should depend on abstractions.

  • Explanation: Depend on interfaces or abstractions rather than concrete implementations. This makes the system more flexible and easier to modify or test.
  • Example:
interface NotificationService { 
fun send(message: String)
} class EmailService : NotificationService {
override fun send(message: String) {
println("Sending email: $message") }
} class NotificationManager(private val service: NotificationService){
fun notify(message: String) {
service.send(message)
}
}
fun main() {
val emailService = EmailService() val manager = NotificationManager(emailService) manager.notify("Hello, SOLID!")
}

Why Use SOLID Principles?

  1. Improved Maintainability: Code is easier to understand, debug, and modify.
  2. Scalability: Simplifies adding new features without breaking existing functionality.
  3. Testability: Encourages decoupled designs, making unit testing more effective.
  4. Reusability: Promotes smaller, modular, and reusable components.
  5. Flexibility: Adapts more easily to changing requirements.

By following SOLID principles, developers can create systems that are less prone to bugs and easier to evolve over time.

By Rajashekar

I’m (Rajashekar) a core Android developer with complimenting skills as a web developer from India. I cherish taking up complex problems and turning them into beautiful interfaces. My love for decrypting the logic and structure of coding keeps me pushing towards writing elegant and proficient code, whether it is Android, PHP, Flutter or any other platforms. You would find me involved in cuisines, reading, travelling during my leisure hours.

Leave a Reply

Your email address will not be published. Required fields are marked *