SOLID 원칙은 국내에서 클린시리즈의 저자로 유명한 로버트 C 마틴(엉클밥)이 2000년 논문에서 소개했습니다. SOLID 라는 약어는 마이클 패터스에 의해 소개되었습니다.
이 디자인 원칙은 약어 그대로 견고한 원칙입니다. 이 원칙을 지킨다면 우리는 보다 유지 보수가 쉽고, 확장과 변경에 유연한 소프트웨어을 만들 수 있습니다.
결과적으로 애플리케이션의 크기가 커짐에 따라 복잡성을 줄이고 많은 골치 아픈 일들을 줄일 수 있습니다.
아래에서는 스프링에 주로 초점을 맞춰 SOLID를 하나씩 살펴보겠습니다.
아래의 5가지 개념이 SOLID 원칙입니다.
public class Book {
private String name;
private String author;
private String text;
//constructor, getters and setters
// 북 클래스의 properties 에 직접 연관된 메서드(상태변경)
public String replaceWordInText(String word, String replacementWord){
return text.replaceAll(word, replacementWord);
}
public boolean isWordInText(String word){
return text.contains(word);
}
// SRP 위반
void printTextToConsole(){
// our code for formatting and printing the text
}
}
public class BookPrinter {
// methods for outputting text
void printTextToConsole(String text){
//our code for formatting and printing the text
}
void printTextToAnotherMedium(String text){
// code for writing to any other location..
}
}
public class WeiredRocketCar implements Car {
@Override
void accelerate(){
if(this.speed >= 100) {
this.speed *= 2;
}
}
}
public class NormalCar implements Car {
@Override
void accelerate(){
if(this.speed >= 100) {
this.speed += 2;
}
}
}
public class CarApp {
public static void main (String[] args) {
// 어쨋든 코드를 변경해야하네.......
//Car car1 = new WeiredRocketCar();
Car car1 = new NoramalCar();
car1.accelerate();
}
}
Liskov substitution priciple
public interface Car {
void turnOnEngine();
void accelerate();
}
public class MotorCar implements Car {
private Engine engine;
//Constructors, getters + setters
public void turnOnEngine() {
//turn on the engine!
engine.on();
}
public void accelerate() {
//move forward!
engine.powerOn(1000);
}
}
public class WeiredRocketCar implements Car {
public void turnOnEngine() {
engline.off(); //???????
}
public void accelerate() {
engline.powerOn(-10000); //??????
}
}
Interface segregation principle
public interface TigerKeeper {
void washTheTiger();
void feedTheTiger();
void petTheTiger();
}
public interface TigerCleaner {
void washTheTiger();
}
public interface TigerFeeder {
void feedTheTiger();
}
public interface TigerPetter {
void petTheTiger();
}
public class TigerCarer implements TigerCleaner, TigerFeeder {
public void washTheTiger() {
//wash hard.....
}
public void feedTheTiger() {
//meat Monday....
}
}
Dependency Inversion Principle