개발자가 코딩 시 가장 난해하게 생각하는 네이밍 중에서 메서드(함수)에 대해 정리해 보았습니다.
메서드를 작성하기 전 주석을 먼저 작성해 해당 메서드가 무엇을 할지 정의하고 주석을 기반으로 네이밍 및 코딩을 해야 간결하고 읽기 쉬운 코드를 작성할 수 있습니다. 하지만 주석만으로는 부족하고 네이밍 단어 선택의 기준을 잡고 네이밍해야 일관성 있는 네이밍이 가능하여 가독성을 올릴 수 있습니다.
아래는 메서드 네이밍의 저만의 기준입니다.
(파스칼 표기법, 카멜 표기법에 대해서는 언급하지 않습니다. 선택은 각 언어의 룰을 따르시거나 자신이 편한 쪽으로 선택하는 걸 추천드립니다)
동사를 사용해서 지어라
메서드는 행위를 나타내기 때문에 항상 동사로 시작하는 것이 좋습니다.
그리고 메서드는 어떤 일을 하는지를 나타내는 것이 중요하며 파라미터 및 반환되는 데이터는 굳이 네이밍이 포함시키지 않습니다. 만약 파라미터 및 반환되는 데이터를 표시해야만 메서드가 하는 역할을 알 수 있다면 객체의 설계를 다시 한번 검토해봐야 합니다.
GET/SET
get/set은 항상 클래스의 속성에 접근할 때만 사용합니다.
1
2
3
4
5
6
|
public class User {
private string userName; // 속성
public string getUserName() { return userName; }
public void setUserName(string name) { userName = name; }
}
|
cs |
get/set을 남용하여 어떤 것을 가져오면 무조건 get을 접두사로 붙이는 경우가 많은데 좋지 않다고 봅니다.
예로 Count() 메서드를 getCount()로 작성하는 경우를 종종 봅니다. get/set을 사용하면 네이밍이 편하기 때문에 많이 쓰게 되는 것이죠.
하지만 객체의 속성에 접근할 때만 get/set을 사용하고 이 외에는 get/set을 접두사로 사용하지 않습니다. 언어의 특성상 Java와 다르게 C#의 경우 Property가 별도 존재해서 get/set 메서드의 의미가 다르기 하지만 C#에서도 사용하지 않는 걸 추천합니다.
GET/SET을 사용하지 않기 위해서는 메서드 이름은 무조건 동사를 사용해서 시작한다는 원칙을 버려야 합니다. 실제 객체를 반환하는 경우 객체명을 그대로 메서드 명으로 작성해야 가독성이 올라갑니다.
데이터베이스 접근하는 경우 (CRUD)
쿼리를 질의하는 메서드 앞에는 select, insert, update, delete 접두사를 붙입니다.
사용자의 명령을 받는 메서드 앞에는 Add(추가), Browse(주사/보기), Change(변경), Delete(삭제), Read(하나만 읽을 때), Find(검색) 접두사를 붙입니다.
UI에서 객체에 접근할 때
Find(get), Change(set), Next, Previous, Parent, Child를 사용합니다.
객체를 생성할 때는 Create, 객체를 초기화할 때는 Initialize, 해당 객체의 초기 데이터를 불러올 때는 Load, 해당 객체를 다른 객체로 변환할 때는 To를 사용합니다.
FindUserNameButton
ChangeBackgroundColorUserNameButton
CreateUserNameButton
InitializeUserNameButton
UserNameButton.ToString()
계산되는 값을 얻는 경우
계산되는 값이 명확한 경우에는 동사 원칙을 파기하고 sum(합계), average(평균), size(크기), location(위치), calculate(계산), diff(차이) 등 단일 명사로 명명합니다.
Compute라는 접두사를 사용하는 것을 추천하는 경우도 있는데 compute는 추상적이라 사용하지 않습니다.
Boolean 메서드
참/거짓을 반환하는 메서드로 긍정의 표현을 기본으로 합니다. 긍정의 표현을 기본으로 하는 이유는 부정의 표현이 조건식에서 부정되는 경우 가독성이 떨어지기 때문입니다.
boolean isNotError // 에러가 아니라면
if(isNotError == false) ... // 에러가 아니라면이 아니라면
만약 조건식에서 항상 참의 값을 기준으로 분기한다면 부정의 표현을 사용해도 무방합니다.
boolean isNotError
if(isNotError) ...
맞는지 틀린 지를 판단할 때는 is, 데이터를 가지고 있는지 없는지는 has, 할 수 있는지 없는지는 can을 접두사로 사용합니다.
isNumber
hasData
canOrder
메서드의 길이
간결하게 짓는 것을 원칙으로 합니다. 그렇다고 축약어를 사용하거나 너무 간결하게 짓는 것을 지양해야 합니다.
list.getNumberOfItems (X)
list.count(O)
list.verify (X)
list.ContainsNull (O)
메서드 명을 지을 때는 객체와 함께 생각해서 이름을 지어야 합니다. 예를 들어 메일을 발송하다를 sendMail로 지었는데 해당 메서드가 Mail이라는 객체에 있다면 sendMail을 Send로 변경합니다.
Mail.sendMail (X)
Mail.send (O)
한 번에 여러 가지 일을 하는 경우
And나 Or로 여러 가지 일을 나타내는 네이밍을 하지 않습니다. 메서드는 하나의 일만 하는 것이 대원칙입니다.
mail.verifyAddressAndSend (X)
mail.verifyAddress (O)
mail.send (O)
// verifyAddressAndSend 의 기능이 verifyAddress 와 Send 메소드로 분리된 후 request 메소드로 변경
mail.request (O)
이벤트 핸들러 관련 네이밍
이벤트는 과거형, 진행형과 같이 동사의 시제로 네이밍 하는 것이 좋습니다.
예를 들어 사용자가 버튼을 클릭했을 때, 창이 열릴 때처럼 과거형으로 표현하거나, 현재 작업이 진행 중처럼 진행의 시제를 사용하여 표현하는 것이 코드를 이해하는데 좋습니다.
이벤트 핸들러 선언
delegate를 사용하여 이벤트는 선언할 때는 'EventHandler' 접미사를 붙입니다.
1
|
public deledate void CompletedEventHandler(object sender, EventArgs e):
|
cs |
이벤트 변수
과거형/진행형으로 작성합니다.
1
|
public event CompletedEventhandler completed;
|
cs |
이벤트를 발생시키는 메서드
raise 접두사를 사용합니다.
1
2
3
4
5
|
private void raiseCompleted(object sender, EventArgs e){
if(completed != null){
completed(sender, e);
}
}
|
cs |
이벤트는 처리하는 메서드
On 접두사를 사용합니다.
1
2
3
|
private void OnComplete(object sender, EventArgs e){
Console.WriteLine("Completed...");
}
|
cs |
네이밍이 정말 중요합니다. 클린 코드를 작성할 때나 리펙터링을 언급할 때에 무조건 맨 처음 언급되는 내용입니다.
'IT > 아키텍처' 카테고리의 다른 글
결합도(Coupling)과 응집도(Cohesion) (0) | 2022.07.13 |
---|---|
객체 설계의 원칙(SOLID) (0) | 2022.07.04 |
Bad smells in code(마틴 파울러의 코드의 악취) (0) | 2022.06.24 |
리팩터링(Refactoring) (0) | 2022.06.24 |
네이밍 룰 - 메소드 [2편, 단어] (0) | 2022.05.26 |
댓글