CafeM0ca

[디자인패턴] reverse OOP 본문

Programming/디자인패턴

[디자인패턴] reverse OOP

M0ca 2018. 7. 1. 23:24
반응형

재밌는 영상을 봐서 정리해본다. 



reverse OOP

- .h와 .cpp파일을 나눠쓰는 C++의 특성을 이용하여 상속관계에서 발생하는 virtual함수의 단점을 없앤다. 주로 게임엔진에서 씀.


위 영상을 보고 적당한 예시를 생각해보았다. 멀티플랫폼을 대상으로 작업해본게 없어서 적당한지는 모르겠지만 아무튼. 


예를 들어 어떤 멀티플랫폼용 프로그램에서 간단하게 콘솔화면을 정리해주는 함수를 사용하게 되었다고 가정하자.

윈도우에서는 system("cls") 를 사용하고 리눅스에서는 system("clear") 를 사용한다.

환경에 맞춰서 제공해주기 위해 다음과 같이 상속했다. 



일반적으로 자식 클래스들은 플랫폼 입맛에 맞게 consoleclean() 가상함수를 오버라이딩 할 것이다. (그러나 우리는 가상함수가 느리다는 사실을 잘 알고 있다.)

영상을 보기 전까지는 일반적으로 생각할 수 있는 상속구조다.


그럼 reverse OOP는 이것과 어떻게 다를까?


일단 platform.h에 consoleclean()이 virtual 키워드를 때고 선언한다.

그리고 이에 대한 정의는 각 파생 클래스의 .cpp파일에 다음과 같이 정의한다.


//window.cpp

void platform::consoleclean()

{

system("cls");

}



//linux.cpp

void platform::consoleclean()

{

system("clear");

}

리눅스환경에서 inux.cpp를 컴파일하면 문제없다!
윈도우환경에서 window.cpp를 컴파일하면 문제없다!

그리고 ps4나 윈도우에서 사용하는 디바이스는 다르다. ps4는 조이스틱 같은거지만 윈도우나 리눅스는 보통 키보드를 사용한다.
따라서 이 디바이스들(멤버 변수)을 분리해줘야 하는데 각 파생클래스의 .h에 정의한다.

 



ospaltform.h를 하나 만들고 운영체제에 알맞게 전처리기로 OS를 정의한다.



osplatform.h를 include 하고 platform클래스가 OS를 상속하면 linux 환경에서는 public linux, windows 환경에서는 public Windows를 상속하게 되는 형태가 된다.



각 기초클래스(window,linux)들이 멤버 변수들을 protected로 선언하면 platform은 접근 가능하다.

이런식으로 구축하면 가상테이블 같은게 필요없어진다. -> 성능상 이점 + 관리 편안(OOP 지킬껀 다 지키니까!)~

반응형

'Programming > 디자인패턴' 카테고리의 다른 글

[디자인패턴] Bridge 패턴  (0) 2020.12.05
[디자인패턴]싱글톤  (0) 2018.01.22
Comments