내가 이해한 디자인 패턴이란?

: 의사 소통 수단이자, 설계에 대한 설명을 간략화 시켜주는 전문 용어.

: 협업을 위한 수단일 수 있겠지만, 패턴을 남발하는 것은 좋지 않다.

: 패턴을 쓰기보다 더 간결하고 이해하기 쉬운 코드와 설명을 준비하는 게 좋다고 생각하고 있다. 

디자인 패턴 정리

  • Template Method 패턴
  • Startegy 패턴
  • State 패턴
  • Composite 패턴
  • Iterator 패턴
  • Singleton 패턴

'Programming > Design Pattern' 카테고리의 다른 글

코드 패턴 공부 순서(임시)  (0) 2021.01.12
블로그 이미지

RIsN

,

1개의 함수는 1개의 역할

: 코드가 늘어나는 것을 우려하지 말 것

: 다른 사람에게 이게 어떤 상황인지를 알려주는 것을 우선적으로 삼을 것

// :: 합계와 평균 계산
void SumAndAverage(std::vector<int>& a, int& total, float& avg) {
	// :: 합계 계산
    total = std::accumulate(a.begin(), a.end(), 0);
    // :: 평균 계산
    avg = !a.empty() ? ((float)total / a.size()) : 0.0f;
}

=>

// :: 합계 계산
int sum(std::vector<int>& a) {
	return std::accumulate(a.begin(), a.end(), 0);
}

// :: 평균 계산
float average(std::vector<int>& a) {
	return !a.empty() ? ((float)sum(a) / a.size()) : 0.0f;
}

 

블로그 이미지

RIsN

,

case 내부의 함수화

: 코드가 늘어나는 것을 우려하지 말 것

: 다른 사람에게 이게 어떤 상황인지를 알려주는 것을 우선적으로 삼을 것

// :: 플레이어 클래스
class Player {
	...생략
    void update(float deltaTime) {
    	switch(state) {
  		case STATE_RUN: // :: 걷기 상태
        	if(input.isLeft())
            	velocity.x = -RUNNING_SPEED;
        	if(input.isRight())
            	velocity.x = RUNNING_SPEED;
            velocity.y = 0.0f;
            if(input.isJump()) {
            	velocity.y = -JUMP_SPEED;
                state = STATE_JUMP;
            }
            position += velocity * deltaTime;
            break;
        case STATE_JUMP: // :: 점프 상태
        	position += velocity * deltaTime;
            velocity.y += GRAVITY * deltaTime;
            if(isLanding())
            	state = STATE_RUN;
            break;
        case STATE_DAMGE: // :: 데미지 상태
        	...생략
            break;
        }
    }
};

=>

void update(float deltaTime) {
	switch(state) {
    case STATE_RUN: run(deltaTime); break;
    case STATE_JUMP: jump(deltaTime); break;
    case STATE_DAMAGE: damage(deltaTime); break;
    }
}

 

'Programming' 카테고리의 다른 글

[용어] 얕은 복사, 깊은 복사  (0) 2022.03.12
[Code] 1개의 함수는 1개의 역할  (0) 2021.02.13
[Code] 검색 반복문 분리  (0) 2021.02.13
[Code] if가 필요없는 가위바위보  (0) 2021.02.11
[Code] 조기 리턴 활용  (0) 2021.02.10
블로그 이미지

RIsN

,

검색 반복문 분리

: 코드가 늘어나는 것을 우려하지 말 것

: 다른 사람에게 이게 어떤 상황인지를 알려주는 것을 우선적으로 삼을 것

// :: 공격 범위 내부에 있는 캐릭터를 검색하고 공격
for(iter i = actors.begin(); i != actors.end(); ++i) {
	if((*i)->distance(position) <= 5) {
    	attack(*i);
        break;
    }
}

=>

auto target = findTarget(position, 5);
if(target != nullptr) {
	attack(target);
}

 

블로그 이미지

RIsN

,

if가 필요없는 가위바위보

// :: 0 : 바위, 1 : 가위, 2 : 보
Result Judgement(Hand my, Hand target) {
	// :: 가위바위보 판정
    static const Result result[3][3] = {
    	// :: 바위, 가위, 보(상대방)
    	{Draw, Win, Lose}, // :: 바위
        {Lose, Draw, Win}, // :: 가위
        {Win, Lose, Draw} // :: 보
    }
    return result[my][target];
}

출처 : C와 C++ 게임 코드로 알아보는 코딩의 기술

'Programming' 카테고리의 다른 글

[Code] case 내부의 함수화  (0) 2021.02.13
[Code] 검색 반복문 분리  (0) 2021.02.13
[Code] 조기 리턴 활용  (0) 2021.02.10
[Code] 보기 쉬운 Code를 만드는 법  (0) 2021.02.10
[Code] 중복 사용 조건식 함수화  (0) 2021.02.10
블로그 이미지

RIsN

,

조기 리턴 활용

: 코드가 늘어나는 것을 우려하지 말 것

: 다른 사람에게 이게 어떤 상황인지를 알려주는 것을 우선적으로 삼을 것

void update() {
	if(health > 0) { // :: 체력이 있는 지 확인
    	if(lifeTime > 0) { //:: 수명이 남아있는지 확인
        
        	// :: 살아있을 때의 처리
        }
    }
}

=>

void update() {
	if(health <= 0) return; // :: 체력이 없다면 리턴
    	if(lifeTime <= 0) return; // :: 수명이 없다면 리턴
    
    	// :: 살아있을 때의 처리
}

 

블로그 이미지

RIsN

,

전제조건

  • 각 개인의 차이가 있다고 생각하며, 어디까지나 이것은 개인 취향에 부합한 것들로 정리
  • 주석 없는 코드 보다 주석 있는 코드가 좋다고 생각하는 취향

Code 작성 순서

  1. 일단 작성해보기
  2. 처음 작성했던 함수를 밑그림으로 다시 제대로 함수를 제작
  3. 함수의 핵심이 무엇인지 이해
  4. 읽는 사람의 관점에서 이해가 가능한지 다시 확인

보기 쉬운 Code를 만드는 법


문서작성 : 2021-02-10

업데이트 : 2021-02-13

참고문헌 : C와 C++ 게임 코드로 알아보는 코딩의 기술

'Programming' 카테고리의 다른 글

[Code] 검색 반복문 분리  (0) 2021.02.13
[Code] if가 필요없는 가위바위보  (0) 2021.02.11
[Code] 조기 리턴 활용  (0) 2021.02.10
[Code] 중복 사용 조건식 함수화  (0) 2021.02.10
[Code] 설명 전용 변수 사용  (0) 2021.02.10
블로그 이미지

RIsN

,

중복 사용 조건식 함수화

: 코드가 늘어나는 것을 우려하지 말 것

: 다른 사람에게 이게 어떤 상황인지를 알려주는 것을 우선적으로 삼을 것

: 중복 사용이 되는 것을 기준으로 삼을 것

if (speed >= 10.0f && !(y > 0.0f) && state != STATE_DAMAGE) {
	생략
}

=>

// :: 점프 중인지 확인(간단하게 y = 0의 위치를 지면으로 설정)
bool isJump() {
	return y > 0.0f;
}

// :: 데미지 중인지 확인
bool isDmage() {
	return state == STATE_DAMAGE;
}

// :: 대시 중인지 확인
bool isDash() {
	if(isJump()) return false;
    if(isDamage()) return false;
    if(speed < 10.0f) return false;
    return true;
}

if(isDash()) {
	생략
}

 

 
 

 

 

'Programming' 카테고리의 다른 글

[Code] 검색 반복문 분리  (0) 2021.02.13
[Code] if가 필요없는 가위바위보  (0) 2021.02.11
[Code] 조기 리턴 활용  (0) 2021.02.10
[Code] 보기 쉬운 Code를 만드는 법  (0) 2021.02.10
[Code] 설명 전용 변수 사용  (0) 2021.02.10
블로그 이미지

RIsN

,

설명 전용 변수 사용

: 코드가 늘어나는 것을 우려하지 말 것

: 다른 사람에게 이게 어떤 상황인지를 알려주는 것을 우선적으로 삼을 것

if (speed >= 10.0f && !(y > 0.0f) && state != STATE_DAMAGE) {
	생략
}

=>

const bool isJump = y > 0.0f;
const bool isDamage = state == STATE_DAMAGE;
const bool isDash = (speed >= 10.0f) && !isJump && !isDamage;
if(isDash) {
	생략
}

 

블로그 이미지

RIsN

,
[디자인 패턴]
명령
경량
관찰자
프로토타입
싱글턴
상태

[순서 패턴]
이중 버퍼
게임 루프
업데이트 메서드

[행동 패턴]
바이트 코드
하위 클래스 샌드박스
타입 객체

[디커플링 패턴]
컴포넌트
이벤트 큐
서비스 중개자

[최적화 패턴]
데이터 지역성
더티 플래그
객체 풀
공간분할

 

참고 : 책정보, 게임 프로그래밍 패턴 : 네이버 책 (naver.com)

 

게임 프로그래밍 패턴

비슷한 기능을 매번 새롭게 코딩하는 개발자들에게 바치는 트리플 A 게임을 지탱하는 설계 방법론[게임 프로그래밍 패턴]은 20년 경력의 개발자가 게임을 만들며 발견한 13가지 패턴을 정리한 책

book.naver.com

'Programming > Design Pattern' 카테고리의 다른 글

[Design Pattern] 디자인 패턴 정리  (0) 2021.02.16
블로그 이미지

RIsN

,