항상 표준 명명 규칙을 따라야 한다.
최우선으로 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 지어야 한다.
긴 이름은 피하자.
모든 메서드는 각각 자신의 소임을 다해야 한다.
메서드가 너무 많은 클래스나 인터페이스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다.
확신이 서지 않으면 만들지 말자.
4개 이하가 좋다.
같은 타입의 매개변수 여러 개가 연달아 나오는 경우가 특히 해롭다.
//지정된 범위의 부분리스트에서의 인덱스 찾기
public int findIndex (int fromIndex , int toIndex , Object element ) { ... }
List <String > list = List .of ("짱구" , "짱아" , "흰둥이" , "액션가면" );
int index = list .findIndex (0 , 2 , "짱구" );
//부분리스트 반환하기
public List <String > subList (int fromIndex , int toIndex ) { ... }
//인덱스 찾기
public int indexOf (Object element ) { ... }
List <String > list = List .of ("짱구" , "짱아" , "흰둥이" , "액션가면" );
int index = list .subList (0 , 2 )
.indexOf ("짱구" );
잘못하면 메서드가 너무 많아질 수 있지만, 직교성을 높여 준다.
직교성이 높다 == 공통점이 없는 기능들이 잘 분리되어 있다
List
인터페이스는 지정된 범위의 부분리스트에서의 인덱스를 찾는 메서드를 제공하는 대신 subList
와 indexOf
메서드를 제공한다.
매개변수 여러 개를 묶어주는 도우미 클래스를 만들자
//도우미 클래스 사용 X
public void calculate (int height , int weight ) { ... }
짱구 키: 184 , 몸무게: 65
예상 BMI : 19.19
실수로 키랑 몸무게랑 위치 바뀜;;;
find (65 , 184 ); //BMI: 435.50
public void calculate (Bmi bmi ) { ... }
private static class Bmi {
int height ;
int weight ;
}
잇따른 매개변수 몇 개를 독립된 하나의 개념으로 볼 수 있을 때 추천하는 기법이다.
객체 생성에 사용한 빌더 패턴 을 메서드 호출에 응용하자.
매개변수가 많을 때, 특히 그중 일부는 생략해도 괜찮을 때 도움이 된다.
매개변수의 타입으로는 클래스보다는 인터페이스가 더 낫다.
매개변수의 타입 - 클래스
public void buy (Btc btc ) { ... }
buy (btc ); //가능
buy (xrp ); //불가능
매개변수의 타입 - 인터페이스
public void buy (Coin coin ) { ... }
buy (btc ); //가능
buy (xrp ); //가능
buy (eth ); //쌉가능
특정 구현체만 사용하도록 제한하지 말고 인터페이스를 사용하자.
HashMap
대신 Map
을 넘기면 TreeMap
, ConcurrentHashMap
등 모든 Map
구현체를 인수로 건넬 수 있다.
다형성!!!
boolean보다는 원소 2개짜리 열거 타입이 낫다
//변경 전
true - 콜라
false - 사이다
웰치스는????
//변경 후
public enum Beverage { 콜라, 사이다, 웰치스, 파워에이드 }
열거 타입을 사용하면 코드를 읽고 쓰기가 더 쉬워진다.
나중에 선택지를 추가하기도 쉽다.