LUMI_dev
객체지향 생활 체조 원칙 9가지 (타 기술 블로그 내용 공부) 본문
아래 참조 블로그에서 공부하기 위해서 정리한 내용입니다.
(https://jamie95.tistory.com/99)
1. 한 메서드에 오직 한 단계의 들여쓰기만
메서드는 맡은 일이 적을수록(잘게 쪼갤수록), 재사용성이 높고 디버깅도 용이
2. else 키워드를 쓰지 않는다.
조건문은 복제의 원인이 되기도 함 / 가독성도 좋지 않음
디자인 패턴의 Strategy 패턴
- 상태에 대한 분기가 몇 군데 걸쳐 중복돼 있을 때 Strategy 패턴 유용
- 간단한 경우엔 guard clause(보호 구문) 사용
: if에 return을 쓸 것(다만, 많이 쓰면 간결함 해침)
수정 전
public class JamieObject {
String JamieStatus(int hour, boolean isStudy) {
String status = "";
if (hour > 4 && hour <= 12) {
status = "취침";
} else {
if (isStudy) {
status = "공부";
} else {
status = "여가";
}
}
return status;
}
수정 후
public class JamieObject {
String JamieStatus(int hour, boolean isStudy) {
if (hour > 4 && hour <= 12) {
return "취침";
}
return isStudy ? "공부" : "여가";
}
}
3. 모든 원시값과 문자열을 포장(wrap)한다.
원시형 변수(ex. int, double, boolean) 로는 컴파일러가 의미적으로 맞는 프로그램 작성을 안내할 수 없음
원시 타입들은 값 자체만 저장하고 있어서, 값에 대한 추가적인 정보(메타데이터)를 제공할 수 없음
int num = 10; // 원시 타입
Integer wrappedNum = 10; // 포장된 객체
포장한 객체로라면 아주 사소하더라도 컴파일러와 개발자에게
해당 값이 어떤 값이며 왜 쓰는지에 대해 정보 전달할 수 있음
4. 한 줄에 점을 하나만 찍는다.
어느 코드 한 곳에서 점이 둘 이상 있다면, 해당 부분을 다시 리팩토링
다른 두 개의 객체를 동시 조작하고 있는 것일 수도 있음
자신 소유의 객체, 자신이 생성한 객체, 그리고 누군가 준(파라미터로) 객체에만 메시지를 보낼 것
그렇지 않을 경우, 다른 객체에 너무 깊숙이 관여하게 됨 : 캡슐화를 어기는 것
메시지를 받는 객체는 자신의 속을 오픈하기보다는, 작업을 해주도록 해야 함
수정 전
public class JamieObject {
void getMoney() {
jamieWallet.getTotalMoney().getMoney(); //. 두번 실행 다른 객체에 너무 깊이 관여
}
}
class JamieWallet {
private final JamieMoney totalMoney;
JamieMoney getTotalMoney() {
return totalMoney;
}
}
class JamieMoney {
private final int money;
int getMoney() {
return getMoney();
}
}
수정 후
public class JamieObject {
void getMoney() {
jamieWallet.getTotalMoney();
}
}
class JamieWallet {
private final JamieMoney totalMoney;
int getTotalMoney() {
return totalMoney.getMoney();
}
}
class JamieMoney {
private final int money;
int getMoney() {
return getMoney();
}
}
5. 줄여쓰지 않는다
과도한 축약은 코드 가독성을 저해
메서드의 이름이 긴 이유는
1) 책임을 너무 많이 갖고 있거나,
2) 적절한 클래스의 아래에 위치하지 않아서 일 수 있음
다음과 같은 규칙으로 작성
1) 한 두 단어정도로 되어있는 경우엔, 축약을 하지 말 것
ex. englishName이 길다고 굳이 EName으로 변경하지 말 것
2) 또한 문맥상 중복되는 단어는 자제할 것
ex. Jamie의 printJamieName의 경우 문맥상 중복이므로 printName으로!
수정 전
public class Jamie {
void printJamieName() {
String EName = "Jamie";
String KName = "제이미";
}
}
6. 모든 Entity는 작게 유지하기
50줄 이상되는 클래스 혹은 10개 파일 이상의 패키지는 없어야 함
- 50줄 이상인 경우 보통 클래스는 한 가지 일만 하지 않음
- 스크롤을 내리지 않아도 한 눈에 들어옴
패키지
- 하나의 목적을 달생하기 위한 연관된 클래스들의 모임
- 작게 유지하면 패키지가 진정한 정체성을 가지게 된다.
7. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 말기
새로운 인스턴스 변수를 가진 클래스는 응집도가 떨어짐
* 인스턴스 변수는 기본형 또는 자료구조형 객체들인 것으로, 일급 컬렉션이나 wrapper객체는 해당되지 않음
인스턴스 변수의 분해는 여러 개의 관련 인스턴스 변수의 공통성을 이해하게 하여
자료구조형으로 묶어 일급 컬렉션으로 생성할 수 있게 해주기
인스턴스 변수들의 집합을 갖고 있는 것에서, 협
력 객체(일급 컬렉션/Wrapper 객체)의 계층 구조로 분해하면 더 효율적인 객체 모델
1) 객체를 상관 관계가 있는 반(half)씩 나누거나
2) 인스턴스 변수를 둘 골라서 그로부터 하나의 객체를 만드는 등을 하는 것
수정 전
public class Jamie {
private final String name;
private final String job;
private final int age;
public Jamie(String name, String job, int age) {
this.name = name;
this.job = job;
this.age = age;
}
}
수정 후
public class Jamie {
private final Name name;
private final Job job;
private final Age age;
public Jamie(Name name, Job job, Age age) {
this.name = name;
this.job = job;
this.age = age;
}
}
8. 일급 컬렉션을 쓰기
컬렉션을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 함
9. getter/setter/property를 쓰지 않는다.
도메인 객체끼리의 사용을 하지 않는 것이 중요하다!
DTO / Controller 등엔 해당되지 않음
객체에 메시지를 던져서 작업을 해야지, 값을 가져와서 다른 곳에서 작업을 하지 말자
메서드(기능들)가 객체 내부 한 곳에서 관리되므로 변경을 한 곳에서 하면 됨
참고 블로그
https://jamie95.tistory.com/99
[Java] 객체지향 생활 체조 원칙 9가지 (from 소트웍스 앤솔러지)
1. 한 메서드에 오직 한 단계의 들여쓰기만 한다. 한 메서드에 들여쓰기가 여러 개 존재한다면, 해당 메서드는 여러가지 일을 하고 있다고 봐도 무관하다. 메서드는 맡은 일이 적을수록(잘게 쪼
jamie95.tistory.com