-
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 등과 같은 단어는 피하고 동사는 사용하지 X8. 메서드 이름
- 메서드 이름은 동사나 동사구나 적합하다.
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