소프트웨어 개발에서 객체 지향 설계는 유연하고 확장 가능하며 유지 관리 및 재사용 가능한 코드를 작성할 때 중요한 역할을 한다. SOLID 원칙은 프로그래밍의 코딩 표준이다. 이 원칙은 아래에 주어진 5가지 원칙의 약어이다.
SRP(Single Responsibility Principle)
: 단일 책임 원칙OCP(Open/Closed Principle
: 개방 폐쇄 원칙LSP(Liskov substitution principle)
: 리스코프 치환 원칙ISP(Interface segregation principle)
: 인터페이스 분리 원칙DIP(Dependency inversion principle)
: 의존 관계 역전 원칙모든 클래스는 단일 책임 또는 단일 작업 또는 단일 목적을 가져야 한다. 클래스에 많은 책임이 있는 경우 책임 중 하나를 변경하면 사용자도 모르게 다른 클래스에 영향을 줄 수 있으므로 버그 가능성이 높아진다. 이 원칙은 변경의 결과로 버그가 발생하더라도 관련 없는 다른 동작에 영향을 미치지 않도록 동작을 분리하는것을 목표로 한다.
클래스는 확장에는 열려 있고, 수정에는 닫혀 있어야 한다. 클래스의 현재 동작을 변경하면 해당 클래스를 사용하는 모든 시스템에 영향을 미친다. 클래스가 더 많은 기능을 수행하도록 하려면 이상적인 접근 방식은 이미 존재하는 기능을 변경하지 않고 추가하는 것이다. 이 원칙은 클래스의 기존 동작을 변경하지 않고 클래스의 동작을 확장하는 것을 목표로 한다. 이는 클래스가 사용되는 모든 곳에서 버그가 발생하지 않도록 하기 위한것이다.
파생 또는 하위 클래스는 기본 또는 상위 클래스로 대체 가능해야 한다. 간단히 말해서 클래스 A가 클래스 B의 하위 유형인 경우, 프로그램 동작을 방해하지 않고 B를 A로 대체할 수 있어야 한다. 이 원칙은 부모 클래스의 자식인 모든 클래스를 예기치 않은 동작 없이 부모 대신 사용할 수 있도록 한다.
농부의 아들은 아버지로부터 농사 기술을 물려받아 필요하면 아버지를 대신할 수 있어야 한다는 의미로 이해할 수 있다. 아들이 농부가 되고 싶다면 아버지를 대신할 수 있지만, 크리켓 선수가 되고 싶다면 둘 다 같은 가족 계층에 속하더라도 분명히 아버지를 대신할 수 없다.
클라이언트가 사용하지 않는 방법에 의존하도록 강요해서는 안 된다. 클래스가 유용하지 않은 작업을 수행해야 하는 경우 낭비이며, 클래스에 이러한 작업을 수행할 능력이 없으면 예기치 않은 버그가 발생할 수 있다. 클래스는 역할을 수행하는 데 필요한 작업만 수행해야 한다. 다른 작업은 나중에 다른 클래스에서 사용할 수 있는 경우 완전히 제거하거나 다른 곳으로 옮겨야 한다. 이 원칙은 클래스가 필요한 작업 집합만 실행하도록 일련의 작업을 더 작은 집합으로 분할하는것을 목표로 한다.
상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 된다. 둘 다 추상화에 의존해야 한다. 추상화는 세부 사항에 의존해서는 안 되고, 세부 사항은 추상화에 따라 달라진다. 이 원칙은 인터페이스를 도입하여 하위 클래스에 대한 상위 클래스의 종속성을 줄이는 것을 목표로 한다.