1) 응집도를 저해하는 것들
static 메서드는 인스턴스 변수를 사용할 수 없습니다. 따라서 데이터와 데이터 로직사이에 괴리가 생깁니다. 즉 응집도가 낮아집니다.
static 메서드는 로그 출력 전용메서드, 포맷 변환 전용 메서드, 팩토리 메서드등 응집도와 관계없는 기능을 static 으로 정의하면 좋습니다.
private 생성자, 팩토리 메서드를 사용해 목적에 따라 초기화 하기
올바른예
class GiftPoint {
private static final int MIN_POINT = 0;
private static final int STANDARD_MEMBERSHIP_POINT = 3000;
private static final int PREMIUM_MEMBERSHIP_POINT = 10000;
private GiftPoint(final int point){
if (point < MIN_POINT) {
throw new IllegalArgumentException("포인트는 0 이상이어야 합니다.");
}
value = point;
}
static GiftPoint forStandardMembership(){
return enw GiftPoint(STANDARD_MEMBERSHIP_POINT);
}
static GiftPoint forPremiumMembership(){
return new GiftPoint(PREMIUM_MEMBERSHIP_POINT);
}
}
이렇게 만들면 신규가입 포인트와 관련된 로직이 모입니다.
그래도 생성로직이 너무 많아지게 되면 해당 클래스가 무엇을 하는 클래스인지 알지못합니다. 생성로직이 너무 많아지는 것 같다면 생성 전용 팩토리 클래스를 분리하는 방법을 고려하는 것도 좋습니다.
2) 횡단관심사는 어플리케이션 모든 동작에 필요한 기능입니다.
- 로그출력
- 오류확인
- 디버깅
- 예외처리
- 캐시
- 동기화
- 분산 처리
이러한 기능은 범용코드로 만들어도 좋습니다. 굳이 인스턴스화 할 필요가 없습니다.
3) 매개변수(입력용)를 출력용으로 사용해버리면 메서드 내부의 로직을 일일이 확인해봐야 합니다. 매개변수는 Class 또는 Method에서 별로 정의 하여 사용하는 것이 좋습니다.
4) 기본자료형을 고집할 경우에 중복코드가 발생하는 경우가 있습니다.
잘못된 예
class Common {
int discountedPrice(int regularPrice, float discountRate) {
if (regularPrice < 0) {
throw new IllegalArgumentException();
}
if (discountRate < 0.0f) {
throw new IllegalArgumentException();
}
}
}
class Util {
boolean isFairPrice(int regularPrice) {
if(regularPrice < 0) {
throw new IllegalArgumentException();
}
}
}
정가 regularPrice값의 유효성 체크 로직이 중복되어 들어가 있습니다.
정가라는 구체적인 자료형을 설계 해보겠습니다. 그래서 class 자료형을 전달하겠습니다.
올바른예
class RegualrPrice {
final int amount;
RegularPrice(final int amount){
if(amount < 0){
throw new IllegalArgumentException();
}
this.amount = amount;
class DiscountedPrice {
final int amount;
DiscountedPrice(final RegularPrice regularPrice, final DiscountRate discountRate) {
...
5) 의미있는 단위는 모두 클래스로 만들기
매개변수가 많을때는 인스턴수 변수로 만들면 좋습니다.
올바른예
class MagicPoint {
private int currentAmount;
private int originalAmount;
private final List<Integer> MaxIncrements;
int current(){
return currentAmount;
}
int max(){
int amount = originalMaxAmount;
for (int each : maxIncrements) {
amount += each;
}
return amount;
}
void recover(final int recoveryAmount) {
currentAmount = Math.min(currentAmount + recoveryAmount, max());
}
void consume(final int consumeAmount){...}
}
'Programming > 기타' 카테고리의 다른 글
MSA API 호출 성능개선 방안 - Redis 활용 (0) | 2023.09.18 |
---|---|
코드 품질올리기, 코드 설계 - 3 성숙한 클래스 만들기 (3/3) (0) | 2023.08.30 |
코드 품질올리기, 코드 설계 - 3 성숙한 클래스 만들기 (1/3) (0) | 2023.08.30 |
코드 품질올리기, 코드 설계 - 2 분기중접 줄이기 (3/3) (0) | 2023.08.28 |
코드 품질올리기, 코드 설계 - 2 분기중접 줄이기 (2/3) (0) | 2023.08.28 |