https://www.youtube.com/watch?v=J6F8plGUqv8&list=PL412Ym60h6uvqYiCVKk5NiEFpDEwOMQFX&index=9

디자인 패턴 기원

디자인 패턴 연구는 gang of Four 에서 출발
네 명의 사람이 연구한 거고
이 사람들이 낸 gof 어쩌구 책에서 출발한 거임



+


SOLID Principles 솔리드 원칙

게임 뿐만 아니라 모든 소프트웨어는 이 솔리드 법칙을 지켜야 한다

꼬여버리지 않게 하기 위한 약속



단일 책임 원칙 (Single Responsibility Principle, SRP)
"하나의 클래스는 딱 하나의 역할만 맡자."

맥가이버 칼 처럼 다 하는 것 보단
주방 조리기구 처럼 각각 따로 쓰는 게 효율적이다


개방-폐쇄 원칙 (Open/Closed Principle, OCP)
"확장에는 열려있고, 수정에는 닫혀있어야 한다."

핸드폰 케이스 부착시킬 땐 핸드폰 본체를 뜯는 사람은 없다


리스코프 치환 원칙 (Liskov Substitution Principle, LSP)
"자식 클래스는 부모 클래스 역할을 완벽하게 대신할 수 있어야 한다."

오리 를 만들 었는데 날개도 없고 부리도 없으면 안된다
새 의 기본 기능을 탑재하고 있어야 한다


인터페이스 분리 원칙 (Interface Segregation Principle, ISP)
"한꺼번에 다 담지 마라, I 인터페이스를 잘게 쪼개라."

식당에서 짜장면 하나만 시키려는데
모든 메뉴판을 다 읽어야 한다면 불편하다


의존역전 원칙 (Dependency Inversion Principle, DIP)
"또렷한 것에 의존하지 말고, 추상적인 것(I 인터페이스)에 의존해라."

전기 플러그를 꽂을 때, 콘센트 구멍만 맞으면 되지 
그 전기가 화력발전소에서 왔는지 원자력발전소에서 왔는지 따지지 말 것


 

+

 

 


사실 여기서 더 깊게 생각하자면,
부모 자식 관게는 칼로 물베기임


뭐가 하이레벨이냐 뭐가 로우레벨이냐
딱 정확히 가를 순 없음

 

 

 

+

 

세부 부연 설명 추가

 

단일 책임 원칙  Single Responsibility Principle, SRP

 

 

인스펙터 창 컴포넌트가 그 예시다

 

코드 300 줄 이하, 간결해야 한다

 

모듈처럼 분리되어 있다

 

그래서 자식으로 부착이 쉽다

 

 

이렇게 하나의 class 안에 모든 걸 다 때려박으면 불 편

 

 

 

class 를 여러개 만들어 나누는 게 좋다

PlayerAudio

PlayerInput

PlayerMovement 

 

 

+

 

 

개방-폐쇄 원칙 (Open/Closed Principle, OCP)

 

 

실무에선 DLL, 라이브러리 를 직접 수정하지 않는다

 

원본은 냅두고

모드, 모듈만 갈아치우는 느낌으로 만든다

 

 

 

 

 

원본으로 잡은 건 Shape, 추상적인 개념

 

Rectangle : Shape

Circle : Shape

쉐이프 밑 자식을 추가함

네모와 동그라미를 자식으로 배치하는 느낌으로 만듦

 

 

 

 

 


림월드 모딩의 헉스립 PatchOperation 를 예로 들면,

더하고 , 빼는 것도 있음
원본을 수정 하는 것도 있음

원본 수정을 패치 를 통해서 하기도 함


+

 

 


Liskov subs 원칙

부모님이 죽으면 자식이 그 사회에서 역할을 대신할 수 있어야 한다

서브 클래스 만들 때 기능을 제거하지 마라

abstract 추상화 할 땐 단순하게 유지하라
추상화 된 걸 복잡하게 만들면 아무데도 못 쓰는 빈 껍데기 코드만 남음

 


팩토리 패턴 비슷한 개념이다

 


Vehicle 탈 것 아래엔
Car 도 있고 Train 도 있다

 


하지만 그냥 이렇게 만들면
어? 기차는 좌회전 우회전 못하는데? 하며 충돌 일어남

 

 

부모인 Vehicle 을 둘로 쪼개서

ITurnable IMovable 로 나눔

 


ITurnable 좌우 방향 조절 가능

IMovable 앞 뒤 이동 가능





+

 


인터페이스 분리 원칙 Interface Segregation

큰 덩어리 인터페이스들을 구체적이고 작은 단위로 분리
꼭 필요한 메서드만 이용할 수 있게 함

내부에 의존하지 말고 유연하게 할 수 있게 됨


I 인터페이스 뜻
청사진, 계약서, 큰 틀 


 IDamageable
피해를 입을 수 있는 것
이펙트 총알 말고, 플레이어 몬스터 를 뜻함

TakeDamage
피해를 입다

IExplodable
폭발할 수 있는것, 화약 통 같은 거

 

 

 

폭발통 의 경우

데미지 입을 수 있고, 폭발할 수 있음

 

적 유닉 의 경우

데미지 입을 수 있고, 이동할 수 있고, 유닛 스탯도 있음

 

 

 

 

+

 

 

의존역전 원칙 (Dependency Inversion Principle, DIP)

추상화, abstraction 에 의존하자

클래스 간에 서로 끈끈하게 연결이 되는 걸 피하라
되도록 서로 나눠져야 함

철수가 영희의 하위 변수를 쓰고, 
영희가 영수의 하위 함수를 쓰고
이렇게 서로 꼬이는 걸 피하라

이렇게 서로 꼬여져 있는 걸 결합, coupling 이라고 함

서로 꼬여져 있으면
수정할 때마다 이 파일 저 파일 뒤져야 함

 

 

 

문 같은 on. off  스위치 구현 할 때의 예시

 

Switch 와 ISwitchable 을 따로 뻬는 전략을 써서 서로 분리하기

 

Switch 안엔 

ISwitchable client;  한줄만 넣어버리는 거다

 

 

 

주의점

 

 

 

 

abstract 상속은 두개 이상 못한다

그래서 abstract 와 interface 를 같이 써서 다중 상속을 구현한다

 

 

 

abstract 추상 클래스 i interface 차이

 

 

반응형
Posted by 이름이 익명
: