Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
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
Archives
Today
Total
관리 메뉴

개발자일기

객체 지향 생활 체조 원칙 규칙 8 : 일급 컬렉션 본문

개발

객체 지향 생활 체조 원칙 규칙 8 : 일급 컬렉션

ka0oll 2020. 5. 17. 13:05

일급 컬렉션이란?

특정 필터된 콜렉션 값을 래핑한 클래스를 의미한다.

규칙

콜렉션 이외에 다른 멤버변수는 없어야 한다.

이점

비지니스에 종속적인 자료구조

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에 대한 요구 사항 변경시 해당 클래스에만 반영하면 된다.

Comments