Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- di
- JSON
- spring
- AOP
- Exception
- JWT
- SOA
- redis
- MSA
- IOC
- Java
- *
- OOP
- ddd
- mockito
- bounded context
- Transaction
- Rest
- bytecode
- PSA
- reflection
- Spring Data Redis
- rest api
- 서명
- Generic
- jvm
- junit5
Archives
- Today
- Total
개발자일기
객체 지향 생활 체조 원칙 규칙 8 : 일급 컬렉션 본문
일급 컬렉션이란?
특정 필터된 콜렉션 값을 래핑한 클래스를 의미한다.
규칙
콜렉션 이외에 다른 멤버변수는 없어야 한다.
이점
비지니스에 종속적인 자료구조
public class UserCars{
private final List<Car> cars;
public UserNames(List<Car> cars) {
if(cars.size() > 10) {
throw new Exception();
}
this.cars = cars;
}
}
컬렉션에 대해 비스니스 적인 제약을 둘수 있다.
예제와 같이 소유가능한 자동차의 갯수는 사이즈는 10개 미만으로 제한되도록 강제화 할수 있다.
해당 컬렉션에 대한 불변을 보장
as-is
List<Car> userCars = Arrays.as(new Car(), new Car())
userNames.add(new Car()); // 불변을 보장하지 못한다.
to-be
public class UserCars{
private final List<Car> cars;
public UserNames(List<Car> cars) {
if(cars.size() > 10) {
throw new Exception();
}
this.cars = cars;
}
}
cars접근하지 못하게 해 불변을 유지 할수 있다.
상태와 행위를 한곳에서 관리 할수 있어, 응집도가 높아진다.
as-is
public class User{
private List<Car> cars;
private Car getMainCar(){
return cars.stream().filter(isMain).findFirst();
}
}
public class Company{
private List<Car> cars;
private Car getMainCar(){
return cars.stream().filter(isMain).findFirst();
}
}
cars에 대한 상태와 행위가 한곳에서 이루어 지지 않아 코드에 중복이 발생햇다.
to-be
public class User{
private Cars cars;
private Car getMainCar(){
return cars.getMainCar();
}
}
public class Company{
private Carscars;
private Car getMainCar(){
return cars.getMainCar();
}
}
public class Cars {
private final List<Car> cars;
public Cars(List<Car> cars) {
this.cars = cars;
}
public getMainCar() {
retrun cars.stream().filter(isMain).findFirst();
}
}
Cars 일급 콜렉션 객체에서 상태와 행위가 관리되어지고 있다. 중복코드가 줄어들었다.
이름이 있는 컬렉션
as-is
List<Car> userCars = createUserCars();
List<Car> companyCars = createCompanyCars();
to-be
UserCars userCars = createUserCars();
CompanyCars companyCars = createCompanyCars();
변수명보단 클래스의 명으로 의미를 부여 하는게 더 용이하다.
변수명은 개발자마다 다를수도 있기때문이다.
CompanyCars에 대한 요구 사항 변경시 해당 클래스에만 반영하면 된다.
'개발' 카테고리의 다른 글
생성자 대신 정적 팩토리 메소드를 고려하자 (0) | 2020.05.22 |
---|---|
객체지향 생활 체조 원칙 3: 모든 원시값과 문자열을 포장한다. (0) | 2020.05.22 |
DB 트랜잭션과 lock (0) | 2020.05.10 |
도메인 주도 개발 (0) | 2020.04.30 |
java generic, 슈퍼 타입 토큰 (0) | 2020.04.16 |
Comments