1. 이름짓기는 어렵다
회사에서 개발할 때 생각보다 많은 시간을 쓰는게 이름짓기다. 마음에 안들어서 썻다 지웠다를 몇 번 반복하고, 클래스나 메서드를 구현하다가 더 괜찮은 이름이 생각나서 다시 바꾸기도 하고, 어떨 때는 도저히 안떠올라서 func
, temp
이런식으로 일단 임시 이름을 두고 구현을 먼저할 때도 많다. 지금 돌아보면 이름이 딱 안떠오르는 경우는 메서드나 클래스를 만들기로 결정한 순간에 이놈이 뭘 하는 놈인지 책임을 명확하게 생각하지 않았을 확률이 높지않을까 생각한다. 물론 책임은 명확히 알겠는데 어울리는 단어를 못찾은 경우도 많다. 아무튼 하고싶은 말은 이름 짓기는 어렵다. 그래서 이번 과정을 수강하면서 배우고있는 것 중 하나인 이름 짓기에 대해서 배운 것과 내생각을 정리해보려고 한다.
2. 클래스 이름 짓기
클래스 이름을 지을 때 흔히 사용하는 방법이 '무엇을 하느냐'에 기반해서 짓는 것이다.(~er 로 짓는 방식) 예를 들면 현금을 여러 조건에 따라 포매팅해주는 클래스를 만든다고할 때, 이름을 CashFormatter라고 짓는 것이다.(예가 좀 작위적으로 보여도 이해해주세요...)
class CashFormatter {
private int dollars;
public CashFormatter(int dollars) {
this.dollars = dollars;
}
public format() {
return String.format("$ %d", this.dollars);
}
}
이렇게되면 이 클래스는 현금을 포매팅해주는 것에 기능이 제한된다. 사실 현금이라는 것으로 할 수 있는 기능은 얼마든지 더 있는데 말이다. 이런식의 '무엇을 하는가(What it does)'에 집중하기 보다는 무엇인가(What it is)에 집중하는 것이 훨씬 더 능동적인 클래스를 만들 수 있다.
class Cash {
private int dollars;
public Cash(int dollars) {
this.dollars = dollars;
}
public String usd() {
return String.format("$ %d:", this.dollars);
}
위와 같이 지으면 usd
, krw
, jpy
와 같은 형식으로 기능 추가도 수월하고, 포매팅기능 뿐만 아니라 Cash
가 더 능동적인 책임과 기능을 가질 수 있도록 할 수 있다. 내생각에는 다른 이런 저런 이유도 많겠지만 위와 같이 이름을 지어야 프로그래머 스스로가 능동적으로 기능들을 생각하고 추가하기 쉬워지는 것 같다. 또 Formatter 같은 이름으로 지으면 나중에 수많은 Uitls, Formatter들이 추가되고 결국 수정이 더 어려운 코드가 되는게 아닐까... 하는 생각이다.
메서드 이름 짓기는 이어서...