반응형

공통

  • 자바는 기본적으로 카멜케이스를 따른다.
  • 통상적으로 자주 사용하는 약어는 사용해도 좋지만 약어 사전에 등록을 해놓아 다른 사람과 충돌이 안 생기게 한다.[ 이건 다들 작업을 시작 하기전에 미리 정의해야 할 사항 ]
  • 협업자와 함께 개발을 하는 경우에는 이름을 통해 그것이 무엇인지 나타내야 한다.
  • 로직이 끝나면 한 줄을 띄어준다 (보기 편하게 하는데 의의가 있음 너무 남발해도 좋지 않다.)
    def get_librosa_mfcc(filepath, n_mfcc = 40, del_silence = False, input_reverse = True):
        if filepath.split('.')[-1] == 'pcm':
            pcm = np.memmap(filepath, dtype='h', mode='r')
            sig = np.array([float(x) for x in pcm])
        elif filepath.split('.')[-1] == 'wav':
            sig, _ = librosa.core.load(filepath, sr=16000)
        else:
            raise ValueError("Invalid format !!")
        if del_silence:
            non_silence_ids = librosa.effects.split(sig, top_db=30)
            sig = np.concatenate([sig[start:end] for start, end in non_silence_ids])
        mfcc = librosa.feature.mfcc(sig, sr=16000, hop_length=160, n_mfcc=n_mfcc, n_fft=400, window='hamming')
        if input_reverse:
            mfcc = mfcc[:,::-1]
        return torch.FloatTensor( np.ascontiguousarray( np.swapaxes(mfcc, 0, 1) ) )​

 → 못된 사례

def get_librosa_mfcc(filepath, n_mfcc = 40, del_silence = False, input_reverse = True):
    if filepath.split('.')[-1] == 'pcm':
        pcm = np.memmap(filepath, dtype='h', mode='r')
        sig = np.array([float(x) for x in pcm])

    elif filepath.split('.')[-1] == 'wav':
        sig, _ = librosa.core.load(filepath, sr=16000)

    else:
        raise ValueError("Invalid format !!")

    if del_silence:
        non_silence_ids = librosa.effects.split(sig, top_db=30)
        sig = np.concatenate([sig[start:end] for start, end in non_silence_ids])

    mfcc = librosa.feature.mfcc(sig, sr=16000, hop_length=160, n_mfcc=n_mfcc, n_fft=400, window='hamming')

    if input_reverse:
        mfcc = mfcc[:,::-1]

    return torch.FloatTensor( np.ascontiguousarray( np.swapaxes(mfcc, 0, 1) ) )

 → 잘된 사례

 

 

클래스

  • 동사를 넣지 않는다.
  • 명사나 명사구로 작성한다.

 

메소드

  • 동사로 시작한다.
  • 카멜케이스 규정을 따른다.
  • 어떤 행동을 하는지에 대한 내용이 있어야한다.
  • 함수는 하나의 동작만 해야한다. → printBankName(String bankName)

 

 

변수명

  • 전치사를 최대한 생략한다. [ to는 자주 쓰이므로 괜찮다 ]
  • 굳이 관사를 넣지 않는다.
  • 단수와 복수를 구분한다
  • 상수는 모두 대문자 표시
  • 변수명이 길어지더라도 정확한 의미를 내포해야한다.
  • 동사를 넣지 않는다.
  • List와 같은 배열 타입일 경우 복수형으로 표시한다. → ArrayList<String> item(x) ArrayList<String> items(o)

 

Bool [참고]

  • isExecuting (실행 중인가?)
  • isShinhanBank (신한은행인가?)
  • isEditable (수정할 수 있는가?)
  • hasVideo (비디오를 가지고 있는가?)
  • canBecomeFirstResponder (첫번째 응답자가 될 수 있는가?)
  • shouldReinstallProduct (제품을 재설치해야 하는가?)
  • allowedAccess (허용된 엑세스인가?)

상수

  • 상수는 대문자로 표시한다 →  int MAIN_WIDTH = 1024

 

 

자바 메소드와 클래스명 주석 팁

@method  : 메소드명 or 클래스명
@brief      : 함수 or 클래스 설명
@detail     : 함수 or 클래스 상세 설명
@author   : 작성자
@since     : 작성일자
@param   : 인자(매개변수)
@return   : 반환값
@why      : 만든 이유

 

 

Interface 팁

1. 함수의 확장성(교체성)이 있다면 Interface로 만든다

   예) 피자 : 5000원, 햄버거 : 50000원 → 피자    5000

                                                    햄버거  50000   [출력기준이 바뀔 수 있는 경우]

 

2. 동일한 함수기능이(내용물은 살짝 달라도 동일한 기능) 여러 클래스에서 쓰이는 경우 Interface로 구성한다.

if (bank.equals("KB")){
  for(int i = 0 ; i < 10; i++){
    if()
  }
}else if (bank.equals("NH"){
  for(int i = 0 ; i < 10; i++){
    if()
  }
}else if (bank.equals("SH"){
  for(int i = 0 ; i < 10; i++){
    if()
  }
}

→  이런식이면 엄청 복잡하다

 

 

첫번째 if문, 두번째 else if , 세번째 else if
→  동일한 부분을 interface로 만든다.

interface BankImpl{
  public void print();
}

class KB{
    @Override
    public void printBankName() {
        System.out.println("KB!!");
    }
}

class NH{
    @Override
    public void printBankName() {
        System.out.println("KB!!");
    }
}

class SH{
    @Override
    public void printBankName() {
        System.out.println("KB!!");
    }
}
    Map<String, Alphabet> typeMap = new HashMap<>();

    typeMap.put("KB", new KB());
    typeMap.put("NH", new NH());
    typeMap.put("SH", new SH());

    String type = "NH";

    typeMap.get(type).printBankName();

이럴경우 들어온 값에 따라 은행이름을 출력하는구나 간단하게 알 수 있다.

 

 

 

 

반응형