본문 바로가기
개발/Architecture & Design Pattern

C++ - 최소 지식 원칙 (The Principle of Least Knowledge)

by 피로물든딸기 2024. 2. 25.
반응형

C, C++ 전체 링크

Architecture & Design Pattern 전체 링크

 

참고

- 퍼사드 패턴

 

최소 지식 원칙 (The Principle of Least Knowledge) = 디미터의 법칙 (Law of Demeter)

- 객체가 다른 객체와 직접적으로 상호 작용하는 것보다는 가능한 다른 객체들과의 관련을 최소화해야 한다.

- 객체는 해당 객체와 직접 관련된 정보만을 알아야 하고, 다른 객체의 내부 동작에 대해 세부 사항을 알 필요가 없다.

- 객체와 다른 객체는 인터페이스를 통해 간접적으로 상호 작용을 유지해야 한다.


먼저 최소 지식 원칙 위반 사례를 보자.

#include <iostream>

using namespace std;

class Engine 
{
public:
	void work() { cout << "Engine started." << endl; }
};

class Car 
{
private:
	Engine engine;
public:
	Engine getEngine() { return engine; }	
};

class Driver
{
private: 
	Car car;
public:
	void move() 
	{ 
		Engine engine = car.getEngine();
		engine.work();

		// or car.getEngine().work(); 
	}
};

int main() 
{
	Driver* driver = new Driver();
	driver->move();

	return 0;
}

 

Driver 클래스가 Car를 움직이게 하기 위해 Engine에 대해서 너무 많은 것을 알고 있다.

Car 객체에서 Engine 객체를 직접 받아, work() 메서드를 직접 호출하기 때문이다.

class Driver
{
private: 
	Car car;
public:
	void move() 
	{ 
		Engine engine = car.getEngine();
		engine.work();

		// or car.getEngine().work(); 
	}
};

 

최소 지식 원칙을 준수하기 위해 Car 클래스에서 Engine을 동작하는 메서드를 제공하면 된다.

class Car 
{
private:
	Engine engine;
public:
	Engine getEngine() { return engine; }	
	void startEngine() { engine.work(); }
};

 

DriverCar 객체에서 제공하는 엔진을 시작하는 메서드만 호출하면 된다.

class Driver
{
private: 
	Car car;
public:
	void move() { car.startEngine(); }
};

 

즉, 최소 지식 원칙을 지키기 위해서는 아래 메서드만 호출하면 된다.

 

1) 객체 자체의 메서드 (Driver의 메서드)

2) 객체가 가지고 있는 구성 요소의 메서드 (Driver가 가지고 있는 Car의 메서드)

3) 메서드에 매개변수로 전달된 객체의 메서드 (move가 만약 Engine을 전달 받았다면 호출 가능)

4) 객체 자체 메서드에서 새로 생성된 객체의 메서드 (move 내부에서 new Engine을 했다면 호출 가능)

5) global 또는 static 메서드

 

전체 코드는 다음과 같다.

#include <iostream>

using namespace std;

class Engine 
{
public:
	void work() { cout << "Engine started." << endl; }
};

class Car 
{
private:
	Engine engine;
public:
	Engine getEngine() { return engine; }	
	void startEngine() { engine.work(); }
};

class Driver
{
private: 
	Car car;
public:
	void move() { car.startEngine(); }
};

int main() 
{
	Driver* driver = new Driver();
	driver->move();

	return 0;
}
반응형

댓글