포도가게의 개발일지

Object[2] 본문

Tech

Object[2]

grape.store 2022. 4. 4. 00:10
반응형

chap 2

영화 - 영화에 대한 기본 정보를 표현한다.

상영 - 실제로 관객들이 영화를 관람하는 사건을 표현한다.

 

사용자가 실제로 예매하는 대상은 영화가 아니라 상영이다. 할인정책(금액할인, 비율할인)하나만 적용가능하며 할인 조건은 여러개 적용가능

 

협력, 객체, 클래스

- 대부분의 사람은 클래스를 결정한 후에 클래스에 어떤 속성과 메서드가 필요한지 고민한다. 안타깝게도 객체지향의 본직과는 거리가 멀다. 진정한 객체지향의 패러다임으로의 전환은 클래스가 아닌 객체에 초점을 맞출 때에만 얻을 수 있다.

 

첫째, 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하라. 클래스는 공통적인 상태와 행동을 공하는 객체들을 추상화 한것이다. 즉 클래스의 윤곽을 잡기 위해서는 어떤 객체들이 어떤 상태와 행동을 가지는지를 먼저 결정해야한다. (user class를 먼저 만들어 거기에 필드와 메서드를 설정하는 것이 아니라, user와 관련된 상태와 행동을 공유하는 객체들을 클래스로 추상화해야하는것이 맞는거같다,. 즉 내 경험으로 auth클래스와 user 클래스 나뉘어져있는 상황인데.. 이건 auth, user class를 따로 나누어 먼저 만들어버리게 되어 현재와 같은 현상이 일어난것같다. circular dependency, 굳이 class 명을 정하자면 Management가 아닐까?)

 

둘째 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공통체의 일원으로 봐야한다. (즉 user와 auth는 회원 관리? 기능을 구현하기 위해 협력하는 공통체의 일원으로 봤을때 얘네는 하나의 class로 추상화하는것이 맞는것이 아닌가?) 객체는 홀로 존재하는것 아니다.!!! 다른 객체에게 도움을 주거나 의존하면서 살아가는 협력적인 존재다!!!. 객체를 협력하는 공통체의 일원으로 바라보는 것은 설계를 유연하고 확장 가능하게 만든다.. 객체 지향적으로 생각하고 싶다면 객체를 고립된 존재로 바라보지 말고 협력에 참여하는 협력자로 바라보기 바란다.

 

도메인 : 소프트웨어는 사용자가 원하는 어떤 문제를 해결하기 위해 만들어진다. 이처럼 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야를 도메인이라고 부른다. (즉. 어떤 문제를 해결하기위해 만들어진 프로그램이 사용되는 분야!!)

 

클래스의 내부와 외부를 구분해야하는 이유가 무엇일까? 그 이유는 경계의 명확성이 객체의 자율성을 보장하기 때문이다.

 

자율적인 객체

- 객체가 자율적인 존재로 우뚝 서기위해서는 외부의 간섭을 최소화해야 한다. 외부에서는 객체가 어떤 상태에 놓여있는지, 어떤 생각을 하고있는지 알아서는 안되며, 결정에 직접적으로 개입하려고 해서도 안 된다.

 

캡슐화와 접근 제어는 객체를 두 부분으로 나눈다. 외부에서 접근 가능한 public interface와 외부에서 접근 불가능한 implementation이라고 부른다.

 

객체가 다른 객체와 상호작용할수 있는 유일한 방법은 send a message하는 것 뿐이다. 유연성과 가독성은 트레이드오프 된다.

 

합성

- DI로 이해하면 될듯( 경찰과 총기 종류를 합성한다., 근데 상속은 공무원?이라는 class를 공통분모 상속하는데 쓰이고 합성은 즉 inject는 갈아끼기 편할때 쓰는게아닌가? 왜 discountpolicy를 당연히 주입해야지 상속하는거지? 예제만들려고 억지로 한건가?)

- 합성은 컴파일 타임 관계를 런타임 관계로 변경함으로써 문제를 해결한다.

 

상속

- 상속은 객체지향에서 코드를 재사용하기위해 널리 사용되는 기법이다. 하지만 두가지 관점 캡슐화를 위반하고, 설계를 유연하지 못하게 만든다. 상속을 이용하기 위해서는 부모 클래스의 내부구조를 잘 알고 있어야한다. 또한 부모 클래스를 변경할 때 자식클래스도 함께 변경될 확률을 높인다.

 

내 결론

- 회원을 관리하는 목적으로

user class는 회원의 생성주기를 state, action을 관리한다.

auth class는 회원의 일시적인 token을 발급해준다. 

 

즉, 회원을 관리하는 목적을 이루기 위해(로그인, 회원가입 등) user 객체는와 auth 객체는 협력해야하며 이것을 class로 추상화 한다.

최종적으로 UserMangement class내에 user class와 auth class가 주입되어야 하며, 각 행동은 각각의 객체가 담당한다.

예를들어 로그인의 경우

public async login(){
    // 얘 우리 유저임?
    cosnt user = await this.userService.findOneById(_id);
    if(!user){
        throw new UserNotFoundException();
    }

    // password 맞음?
    const validatePassword = this.isValidatePassword(user.password, password);
    if(!validatePassword){
        throw new PasswordValidateException();
    }

    // 우리 회원이래 token 내놔
    const jwt = this.jwtService.get(option);

    return jwt;
}

'Tech' 카테고리의 다른 글

[Tech] TDD?  (0) 2022.04.12
Object[3]  (0) 2022.04.09
Object[1]  (0) 2022.03.29
Jest  (0) 2022.02.20
Docker?  (0) 2022.02.16
Comments