본문 바로가기

LANGUAGES, METHODLOGY/STUDY

[객체지향] 최소 지식의 원칙

퍼사드 패턴 리뷰에 앞서 책에서 객체지향의 최소 지식의 원칙에 대해 짚고 넘어가는 곳이 있어 리뷰 후에 넘어가고자 한다.

 

우선 최소 지식의 원칙은 드미트리의 원칙이라고도 불리며, 아래의 네 가지 규칙을 준수하는 것이 포인트이다.

  • 자기 자신만의 객체 사용
  • 메서드에 전달된 매개변수 사용
  • 메서드에서 생성된 객체 사용
  • 객체에 속하는 메서드 사용

적어두고 생각해보면 알겠지만, 네 가지 원칙을 준수하게 될 경우에 가질 수 있는 장점은 결합도를 낮추는 것이 될 것이다.

 

우선적으로 자기 자신만의 객체를 사용하고, 필요한 외부 데이터가 있는 경우 이를 매개변수로써 전달받기 때문에, 

 

특정한 다른 클래스를 사용하게 되는 경우에 사용하는 클래스가 변경됨으로써 가질 수 있는 불이익으로부터 자유로운 것이다.

(이는 메서드에 전달된 매개변수만을 이용할 시에 취할 수 있는 장점이 될 것이다)

 

 

아래는 위 원칙에 기반해 책의 예제를 코틀린으로 옮긴 것이다.

 

package com.example.algorithmstudy.pattern.structure.facade

/**
 *  최소 지식의 원칙!
 *
 *  - 자기 자신만의 객체 사용
 *  - 메서드에 전달된 매게변수 사용
 *  - 메서드에서 생성된 객체 사용
 *  - 객체에 속하는 메서드 사용
 */
class Car {

    // 메서드에서 생성된 객체 사용
    private lateinit var engine: Engine

    constructor(engine: Engine) {
        this.engine = engine
    }

    fun start(key: Key) {

        // 메서드에서 생성된 객체의 사용
        val doors = Doors()
        
        // 매개변수로 전달된 객체의 메서드 사용
        val authorized = key.turns()
        
        if (authorized) {
            
            // 객채에 속하는 메서드 사용
            engine.start()
            
            // 객체 내에 있는 메서드의 사용
            updateDashboardDisplay()
            
            // 객체에 속하는 메서드 사용
            doors.lock()
        }
    }
    
    fun updateDashboardDisplay() {
        
    }

    inner class Engine {
        fun start() {}
    }
    
    inner class Doors {
        fun lock() {}
    }
}
package com.example.algorithmstudy.pattern.structure.facade

class Key {

    fun turns(): Boolean {
        return true
    }
}