
SOLID 원칙은 아래 단어들의 약어이다.
각각이 어떤 의미를 띄는지 알아보자.

적용 전
Result 클래스는 checkResult, isValidate, getRequest, show라는 각기 다른 기능을 모두 가지고 있음class Result {
String checkResult() {...}
void isValidate() {...}
String getRequest() {...}
void show() {...}
}
적용 후
class Result {
String checkResult() {...};
...
}
class Validate {
void isValidate() {...};
...
}
class Network {
String getRequest() {...}
...
}
class Printing {
void show(){...}
...
}

적용 전
class VehicleMileage {
void showMileage(dynamic anyVehicle) {
if(anyVehicle is Bike) {
print(anyVehicle.getBikeMileage());
} else if(anyVehicle is Car) {
print(anyVehicle.getCarMileage());
}
}
}
class Bike {
String getBikeMileage() = "45km/l";
}
class Car {
String getCarMileage() = "14km/l";
}
적용 후
class VehicleMileage {
void showMileage(Vehicle vehicle) {
print(vehicle.getMileage());
}
}
class Bike extends Vehicle {
String getMileage() = "45km/l";
}
class Car extends Vehicle{
String getMileage() = "14km/l";
}
abstract class Vehicle {
String getMilage();
}

적용 전
checkResult(), codingTestResult())abstract class Result {
checkResult();
codingTestResult();
}
class MechanicalBranch extends Result {
checkResult() {...}
codingTestResult() {...}
}
class ComputerScienceBranch extends Result {
checkResult() {...}
codingTestResult() {...}
}
적용 후
abstract class OfflineResult {
checkResult();
}
abstract class CodingResult {
codingTestResult();
}
class MechanicalBranch implements OfflineResult {
checkResult() {...}
}
class ComputerScienceBranch implements OfflineResult, CodingResult {
checkResult() {...}
codingTestResult() {...}
}

적용 전
MechanicalBranch의 codingTestResult()는 아무런 클래스에서도 사용되지 않은 메소드Result라는 추상 클래스에서 두개의 다른 역할을 수행abstract class Result {
checkResult();
codingTestResult();
}
class MechanicalBranch implements Result {
checkResult() {...}
// 사용하지 않는 메소드라고 가정
codingTestResult() {...}
}
class ComputerScienceBranch implements Result {
checkResult() {...}
codingTestResult() {...}
}
적용 후
abstract class OfflineResult {
checkResult();
}
abstract class CodingResult {
codingTestResult();
}
class MechanicalBranch implements OfflineResult {
checkResult() {...}
}
class ComputerScienceBranch implements OfflineResult, CodingResult {
checkResult() {...}
codingTestResult() {...}
}

적용
CheckOut클래스는 Payment 클래스가 어떤 방식으로 작동되는지 알지 못하는 상태 pay.payment()라는 메소드를 사용하여 Payment 클래스에 접근 가능abstract class Payment {
payment();
}
class PaymentViaCreditCard implements Payment {
payment() {...}
}
class PaymentViaDebitCard implements Payment {
payment() {...}
}
class PaymentViaBhimUPI implements Payment {
payment() {...}
}
class Checkout {
checkOut(Payment pay){
pay.payment();
}
}