ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Clean Code - 1장 깨끗한 코드 & 2장 의미 있는 이름
    Clean Code 2024. 8. 18. 23:43
    반응형

    Clean Code 를 작성하려면 가장 중요한것은
    중복 줄이기, 한 기능만 수행하기, 제대로 표현하기, 초반부터 간단하고 작게 추상화 하기 이다.

    (Unity는 public 필드, 열거형, 클래스, 메서드에 파스칼 표기법을, private 변수에는 카멜 표기법을 사용하도록 권장)


    1. 의도가 분명해야한다.

    - 변수, 함수, 클래스는 존재 이유, 수행 기능, 사용 방법이 명확해야한다.

     

    수정 전

    public int AliveCount;
    public bool Alive;
    private List<SpawnPoint> point;
    private Item data;

     

     

    수정 후

    public int CurrentEnemyAliveCount;
    public bool IsPlayerAlive;
    private List<SpawnPoint> enemySpawnPoints
    private FoodItem soup;

     


    2. 그릇된 정보를 피하라

    int a = 1;
    if (O == l) // 대문자 'O'와 소문자 'l'
    	a = O1;
    else
    	l = 01;


    소문자 l과 대문자 O가 숫자 0과 1이랑 혼동되는 경우 


    3. 의미 있게 구분하라 

    수정 전

    private void UpdatePlayerStatus(int status1, int status2, int status3)
    {
    	// 플레이어 상태 업데이트 로직
    }
    
    private GameObject enemy1;
    private GameObject enemy2;
    private GameObject enemy3;

     

     

    수정 후

    private void UpdatePlayerStatus(int health, int stamina, int mana)
    {
    	// 플레이어의 체력, 스태미너, 마나 업데이트
    }
    
    private GameObject melleEnemy;  // 근접 공격을 하는 적 캐릭터
    private GameObject rangedEnemy; // 원거리 공격을 하는 적 캐릭터
    private GameObject bossEnmey;   // 보스 적 캐릭터

     


    4. 발음하기 쉬운 이름을 사용하라

     

    수정 전

    private int bgSound;
    private GameObject playerCh;

     

    수정 후

    private int backGroundSound;
    private GameObject playerCharacter;

     


    5. 검색하기 쉬운 이름을 사용해라

     

    수정 전

    for (int i = 0; i < 3; i++)
    {
        playerAtkDamage += 5;
    }

     

     

    수정 후 

     

    const int MAX_BUFF_COUNT = 3;
    const int ATTACK_DAMAGE_PER_BUFF = 5;
    
    for (int buffCount = 0; buffCount < MAX_BUFF_COUNT; buffCount++)
    {
        playerAtkDamage += ATTACK_DAMAGE_PER_BUFF;
    }

    6. 인코딩을 피해라 

     

    수정 전

    private bool bIsAlive;
    private string strPlayerName;

     

    수정 후

    private bool isAlive;
    private string playerName;

    7. 클래스 이름

    - 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.

    - Customer, WikiPage, Account , AddressParser등이 좋은 예
    - Manager, Processor, Data, Info 등과 같은 단어는 피하고 동사는 사용하지 X

     

    8. 메서드 이름

    - 메서드 이름은 동사나 동사구나 적합하다. 

     

    9. 한 개념에 한 단어를 사용하라 
    - 동일 코드 기반에 controller, manager, driver를 섞어 쓰면 혼란스러움

     

    10. 말장난을 하지 마라
    모두가 기존 값 두개를 더하거나 이어서 새로운 값을 만드는 add 메서드
    새로 작성한 메서드는 집합에 값 하나를 추가 

    -> 새 메서드는 기존 add 메서드와 맥락이 다르기 때문에 insert나 append라는 이름이 적당

     


    11. 의미 있는 맥락을 추가하라

     

    수정 전

    private void printEnemy(int enemyCount) {
        String enemyNum;
        String enemyType;
    
        if (enemyCount == 0) {
            enemyNum = "0";
            enemyType = "";
        } else if (enemyCount == 1) {
            enemyNum = "1";
            enemyType = "boss";
        } else {
            enemyNum = enemyCount.ToString();
            enemyType = "slimes";
        }
    
        String message = $"Enemy Num: {enemyNum}, Enemy Type: {enemyType}";
        print(message);
    }

     

    수정후

    private class EnemyStatisticsMessage {
        String enemyNum;
        String enemyType;
    
        public String make(int enemyCount) {
            setEnemyInfo(enemyCount);
            return $"Enemy Num: {enemyNum}, Enemy Type: {enemyType}";
        }
    
        private void setEnemyInfo(int count) {
            if (count == 0) {
                thereAreNoEnemies();
            } else if (count == 1) {
                thereIsOneEnemy();
            } else {
                thereAreManyEnemies(count);
            }
        }
    
        private void thereAreNoEnemies() {
            enemyNum = "0";
            enemyType = "";
        }
    
        private void thereIsOneEnemy() {
            enemyNum = "1";
            enemyType = "boss";
        }
    
        private void thereAreManyEnemies(int count) {
            enemyNum = count.ToString();
            enemyType = "slimes";
        }
    }

     

    - 클래스 사용으로 맥락 명확화 : EnemyStatisticsMessage라는 클래스를 사용하여, 적의 상태와 관련된 정보를 다루는 역할을 알려줌
    - 함수 분리로 역할 명확화


    12. 불필요한 맥락을 없애라 (중복 없애기)

     

    수정 전

    public class Player
    {
        private string playerName;
        private int playerHealth;
        private int playerScore;
    }

     

     

    수정 후

    public class Player
    {
        private string name;
        private int health;
        private int score;
    }

     

     

     

    public class AccountAddress { // 클래스 내용 }

    public class CustomerAddress { // 클래스 내용 }
    클래스 이름이 불필요하게 길고 중복된 정보를 포함하고 있음

    public class Address{ } 로 간단하게 합칠수 있음

    다양한 종류의 주소가 존재하고, 이를 명확히 구분할 필요가 있다면 더 구체적인 이름을 사용할 수 있음.
    public class PostalAddress
    {
        // 우편 주소 관련 내용
    }
    public class MACAddress
    {
        // MAC 주소 관련 내용
    }
    public class URI
    {
        // 웹 주소(URI) 관련 내용

    }
    이런식으로 나눌 수 있다.

    반응형

    'Clean Code' 카테고리의 다른 글

    Clean Code - 의미 있는 이름  (0) 2024.08.18
    Clean Code를 작성하려면 & 의미 있는 변수명  (0) 2024.08.18
Designed by Tistory.