개발자 99% 커뮤니티에서 수다 떨어요!
오늘 공부한 범위 : 2장. 의미 있는 이름
위 코드는 암암리에 독자가 다음과 같은 정보를 안다고 가정한다.
그릇된 정보를 피하라
특수한 의미가 있는 단어는 사용할 때 주의한다.
여러 계정 그룹을 묶을 때, 실제 List가 아니라면 accountList라 명명하지 않는다. => accountGroup, bunchOfAccounts, 아니면 단순히 Accounts라 명명한다.
서로 흡사한 이름을 사용하지 않도록 주의한다.
ex) XYZControllerForEfficientHandlingOfStrings와 XYZControllerForEfficientStorageOfStrings
숫자 1처럼 보이는 소문자 l, 숫자 0처럼 보이는 대문자 O를 사용할 때는 주의한다.
검색하기 쉬운 이름을 사용하라
ex) 그냥 숫자 7은 찾기어려움 => MAX_CLASSES_PER_STUDENT = 7 과 같이 사용하면 검색하기 용이할 뿐만아니라 의도도 파악 가능하다.
인터페이스 이름은 접두어를 붙이지 않는 편이 좋다고 생각한다.
ex) IShapeFactory보다는 ShapeFactoryImp나 CShapeFactory가 보기 좋다.
한 개념에 한 단어를 사용하라
똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다.
한 단어를 두 가지 목적으로 사용하지 마라. 다른 개념에 같은 단어를 사용한다면 그것은 말장난에 불과하다.
add 메서드 : 기존 값 두 개를 더하거나 이어서 새로운 값을 만든다고 가정한다.
집합에 값 하나를 추가하는 새로운 메서드를 작성하려고 하는데 과연 이 메서드를 add라고 불러도 괜찮을까?
답 : No! => 새 메서드는 기존 add 메서드와 맥락이 다르기 때문에 insert나 append라는 이름이 적당하다.
코드를 읽을 사람도 프로그래머이기 때문에 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜찮다!
우수한 프로그래머와 설계자라면 해법 영역(프로그래머가 알아볼 수 있는 영역)과 문제 영역(domain)을 구분할 줄 알아야한다. 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야한다.
의미있는 맥락을 추가하라
firstName, lastName, street, houseNumber, city, state, zipcode라는 변수를 보면 주소라는 사실을 알 수 있다. 하지만 만약 어느 메서드에서 state라는 변수 하나만 사용한다면 변수 state가 주소 일부라는 사실을 알 수 있을까?
답 : No! => addr라는 접두어를 추가해주거나 Address라는 클래스를 생성해 의미있는 맥락을 추가해줄 수 있다. (접두어보다는 클래스 생성이 좋음.)
클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
Customer, WikiPage, Account, AddressParser 등 좋은 예
Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않음.
메서드 이름은 동사나 동사구가 적합하다.
postPayment, deletePage, save 등이 좋은 예
접근자(Accessor), 변경자(Mutator), 조건자(Predicate)는 javabean 표준에 따라 값 앞에 get, set, is를 붙임.
ex)
string name = employee.getName();
customer.setName("mike");
if (paycheck.isPosted())...
생성자(Constructor)를 중복정의(Overload)할 때는 정적 팩토리 메서드를 사용한다.
Complex fulcrumPoin = Complex.FromRealNumber(23.0)
아래 코드보다 좋다.
Complex fulcrumPoint = new Complex(23.0)
참고로 생성자 사용을 제한하려면 해당 생성자를 private으로 선언!
"위 코드는 암암리에 독자가 다음과 같은 정보를 안다고 가정한다."라는 구절을 보니 예전에 읽었던 [완벽한공부법(저자 고영성, 신영준)]의 지식의 저주가 생각이 난다. 지식의 저주란 어떤 개인이 다른 사람들과 의사소통을 할 때 다른 사람도 이해할 수 있는 배경을 가지고 있다고 자신도 모르게 추측하여 발생하는 인식적 편견이다.(위키백과) 내가 코드를 짜는 이상 간단한 테스트코드를 짜더라도 다른 프로그래머가 본다면 항상 이 코드가 의미하는 것이 무엇인지 정확하게 알 수 있도록 노력해야겠다고 느꼈다.
항상 코드를 짤 때 변수명, 함수명 등을 어떻게 해야 지어야할지 고민이 많았는데 이번 장에서 정말 디테일하게 설명이 되어있어 적극 활용해야겠다라는 생각을 했다.
Manager, Processor, Data, Info 이러한 단어는 왜 피해야하는지에 대한 자세한 설명이 없어 잘 이해가가지 않음.
정적 팩토리 메소드란 무엇인가?
정적 팩토리 메서드란 객체 생성의 역할을 하는 클래스 메서드
참고자료
"JobQueue를 모르는 프로그래머가 있을까?" 라는 말에 JobQueue가 궁금해서 찾아봤다.
개별적으로 실행되는 스크립트 블럭을 하나의 잡(Job)이라고 하고 이러한 잡들(Jobs)를 적재하는 FIFO큐가 바로 잡큐(JobQueue)