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

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

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

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

디자인 패턴 정리

  • 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

,