널 객체 패턴

많은 경우 함수는 null이 될 수 있는 개체 참조를 허용하고, null이 함수에 전달되는 특수한 경우를 처리하고 기본 응답을 제공하거나 아무 작업도 수행하지 않도록 if 문을 추가하는 경향이 있습니다. 다음 예제에서 calculateSpeed ​​함수는 getSpeed ​​함수가 있는 객체를 기대합니다. Javascript에서는 다음과 같이 해야 합니다.

class Car {
  getSpeed(){
    return 100;
  }
}


const calculateSpeed = function(vehicle){
  if(vehicle && typeof vehicle.getSpeed === 'function'){
    return vehicle.getSpeed();
  } else {
    return 50;
  }
}

const car1 = new Car();

console.log(calculateSpeed(car1)); // 100
console.log(calculateSpeed()); // 50

그러나 그것을 달성하는 더 좋은 방법이 있습니다. Null Object Pattern을 사용하여 차량 역할을 하는 클래스를 만들 수 있습니다. 이를 DefaultMovable라고 부르겠습니다.

class DefaultMovable {
  getSpeed(){
    return 50;
  }
}

우리의 DefaultMovable 클래스는 if/else 문을 피할 수 있는 기본 기능(이전 코드 스니펫의 else라고도 함)을 제공합니다.

class Car {
  getSpeed(){
    return 100;
  }
}

class DefaultMovable {
  getSpeed(){
    return 50;
  }
}

const calculateSpeed = function(vehicle = new DefaultMovable()){
  return vehicle.getSpeed();
}

const car1 = new Car();

console.log(calculateSpeed(car1)); // 100
console.log(calculateSpeed()); // 50

이 패턴의 UML 다이어그램은 다음과 같습니다.



Ruby의 동일한 예는 다음과 같습니다.

class Car
  def get_speed
    100
  end
end

class DefaultMovable
  def get_speed
    50
  end
end


def getSpeed(vehicle = DefaultMovable.new)
  vehicle.get_speed();
end

이것은 단지 패턴일 뿐이며 모든 패턴에는 장단점이 있으므로 사용 사례에 따라 신중하게 적용하십시오. (이 예는 패턴을 보여주는 흔들림에 대한 허구입니다)

좋은 웹페이지 즐겨찾기