본문 바로가기

개발 공부 유니티, C#/스터디

클린 코드 정리

변수명 작명

  • 변수의 의도를 명확히
  • 검색하기 쉬운 네이밍 사용
  • 유추하기 힘든 기발한 이름을 사용하지 마라
  • 한 개념에 한 단어 사용
    • 가져오는 것을 fetch, retrieve, get을 혼용해서 쓴다던가 하는 것들을 통일하기
  • 해법 영역에서 가져온 이름 사용
    • VISITOR, JobQueue 등 프로그래밍 외에도 전산 용어, 알고리즘 등에서 쓰이는 보편적인 용어들로 작명

 

함수

  • SRP(Single Responsibility Principle) : 한 가지 일만 하도록 작게 만들기
  • 매개변수를 최소화
  • 명령과 조회를 분리
    • 뭔가를 수행하던지, 뭔가에 답하던지 둘 중 하나만 하기
  • 오류 코드보다 예외 사용 (요건 경우에 따라 좀 다른것 같기도 함)
  • 코드 중복 방지

 

주석

  • 주석은 나쁜 코드를 보완하지 못한다.
  • 좋은 주석
1. TODO
2. 법적 설명 Copyright (C) 2023 Object Mentor

3. 정보 제공 주석
//테스트 중인 Responder 인스턴스를 반환한다.
protected abstract Responder responderInstance();

4. 의도를 설명하는 주석
return 1; //우선순위가 높음
  • 나쁜 주석
    • 코드에 뻔히 설명된 내용 주석
    • HTML주석
    • 소설가

컨벤션을 지킬 것

 

경계 처리

타팀, 라이브러리(외부 코드) 사용시 경계 부분 처리

 

경계를 어댑터 패턴으로 보완하기

예제 원문 : https://jusungpark.tistory.com/22

//어댑터 패턴 예제
//콘센트 어댑터처럼 사용하는 것을 떠올리면 용이

public interface Duck 
{
	public void quack();
  	public void fly();
}
 
public class MallardDuck implements Duck 
{
      @Override
      public void quack() 
      {
           System.out.println("Quack");
      }

      @Override
      public void fly() 
      {
           System.out.println("I'm flying");
      }
}

public interface Turkey 
{
    public void gobble();
    public void fly();
}

public class WildTurkey implements Turkey
{
    @Override
    public void gobble() 
    {
        System.out.println("Gobble gobble");
    }

    @Override
    public void fly() 
    {
        System.out.println("I'm flying a short distance");
	}
}

//Turkey를 Duck으로 사용하기 위한 Adapter
public class TurkeyAdapter implements Duck 
{
    Turkey turkey;

    public TurkeyAdapter(Turkey turkey) 
    {
        this.turkey = turkey;
    }
    @Override
    public void quack()
    {
        turkey.gobble();
    }
    @Override
    public void fly() 
    {
        turkey.fly();
    }
 }
 
 //클라이언트에서 사용
public class DuckTestDrive 
{
    public static void main(String[] args) 
    {
        MallardDuck duck = new MallardDuck();

        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey);

        System.out.println("The turkey says...");
        turkey.gobble();
        turkey.fly();
        System.out.println("The Duck says...");
        testDuck(duck);
        System.out.println("The TurkeyAdapter says...");
        testDuck(turkeyAdapter);
    }

    public static void testDuck(Duck duck)
    { 
       duck.quack();
       duck.fly();
    }
}

 

두 클래스 다이어 그램에서 Target은 Duck, Adaptee는 Turkey

 

학습 테스트

외부 코드를 테스트 클래스를 선언

우리 코드의 문제인지 외부의 문제인지 쉽게 파악할 수 있음.

 

클래스

  • 클래스도 SRP를 따라야 함.
  • 변수, 함수가 클래스가 하기 적합한 일인지 확인
  • 변수, 함수의 갯수가 적어야 함

 

쓰레드를 이용한 동기 작업에서 SRP원칙을 지키고 독립적으로 작동해야만 문제가 발생하지 않는다.

critical section은 작게 만들기 (성능 저하를 유발)