SOLID 원칙은 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ€‘μš”ν•œ 섀계 μ›μΉ™μœΌλ‘œ, μ†Œν”„νŠΈμ›¨μ–΄ 개발의 μœ μ§€λ³΄μˆ˜μ„±, ν™•μž₯μ„± 및 관리 κ°€λŠ₯성을 μ¦μ§„μ‹œν‚€λŠ” 데 도움이 λ©λ‹ˆλ‹€. μ•„λž˜μ—μ„œλŠ” 각 원칙을 PHP μ˜ˆμ‹œ μ½”λ“œμ™€ ν•¨κ»˜ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€:

1. 단일 μ±…μž„ 원칙 (SRP)

ν΄λž˜μŠ€λŠ” λ³€κ²½λ˜μ–΄μ•Ό ν•˜λŠ” ν•œ κ°€μ§€ 이유만 κ°€μ Έμ•Ό ν•˜λ©°, 즉 ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ λ‹΄λ‹Ήν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: OrderProcessor ν΄λž˜μŠ€λŠ” μ£Όλ¬Έ 처리만 λ‹΄λ‹Ήν•˜κ³ , λ‘œκΉ…μ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€ 관리와 같은 λ‹€λ₯Έ μ±…μž„μ€ μ²˜λ¦¬ν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

class OrderProcessor {
    public function process(Order $order) {
        // 주문 처리 둜직
    }
}
 
class OrderLogger {
    public function log(Order $order) {
        // μ£Όλ¬Έ 세뢀사항 λ‘œκΉ…
    }
}

2. 개방-폐쇄 원칙 (OCP)

ν΄λž˜μŠ€λŠ” ν™•μž₯μ—λŠ” μ—΄λ € μžˆμ–΄μ•Ό ν•˜μ§€λ§Œ, μˆ˜μ •μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 즉, κΈ°μ‘΄ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: κΈ°λ³Έ ν•„ν„° 클래슀λ₯Ό ν™•μž₯ν•˜λŠ” λ‹€μ–‘ν•œ μœ ν˜•μ˜ ν•„ν„°λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

interface Filter {
    public function apply(array $items);
}
 
class NameFilter implements Filter {
    public function apply(array $items) {
        // 이름 필터링 둜직
    }
}
 
class AgeFilter implements Filter {
    public function apply(array $items) {
        // λ‚˜μ΄ 필터링 둜직
    }
}

3. λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 (LSP)

슈퍼클래슀의 κ°μ²΄λŠ” κ·Έ μ„œλΈŒν΄λž˜μŠ€μ˜ 객체둜 λŒ€μ²΄ν•  수 μžˆμ–΄μ•Ό ν•˜λ©°, 이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ†μƒμ‹œν‚€μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: Bird ν΄λž˜μŠ€μ™€ κ·Έ μ„œλΈŒν΄λž˜μŠ€ Duckμž…λ‹ˆλ‹€. Bird 객체가 μ‚¬μš©λ˜λŠ” λͺ¨λ“  κ³³μ—μ„œ Duck 객체둜 λŒ€μ²΄ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

class Bird {
    public function fly() {
        // λΉ„ν–‰ 둜직
    }
}
 
class Duck extends Bird {
    // Duck은 Bird의 fly λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
}

4. μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙 (ISP)

ν΄λΌμ΄μ–ΈνŠΈλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œμ— μ˜μ‘΄ν•˜λ„λ‘ κ°•μš”λ˜μ–΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λŠ” μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ— νŠΉν™”λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: 큰 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 더 μž‘κ³  ꡬ체적인 μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ‘œ λΆ„ν• ν•©λ‹ˆλ‹€.

interface WorkerInterface {
    public function work();
}
 
interface EaterInterface {
    public function eat();
}
 
class HumanWorker implements WorkerInterface, EaterInterface {
    public function work() {
        // μž‘μ—… κ΅¬ν˜„
    }
 
    public function eat() {
        // 식사 κ΅¬ν˜„
    }
}

5. μ˜μ‘΄μ„± μ—­μ „ 원칙 (DIP)

κ³ μˆ˜μ€€ λͺ¨λ“ˆμ€ μ €μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. λ‘˜ λ‹€ 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•©λ‹ˆλ‹€. μΆ”μƒν™”λŠ” μ„ΈλΆ€ 사항에 μ˜μ‘΄ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λ©°, μ„ΈλΆ€ 사항은 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: DatabaseConnection μΈν„°νŽ˜μ΄μŠ€κ°€ MySQLConnection ν΄λž˜μŠ€μ— μ˜ν•΄ κ΅¬ν˜„λ©λ‹ˆλ‹€. κ³ μˆ˜μ€€ λͺ¨λ“ˆμ€ ꡬ체적인 MySQLConnection이 μ•„λ‹Œ DatabaseConnection μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•©λ‹ˆλ‹€.

interface DatabaseConnection {
    public function connect();
}