Taehyeon-Kim / OOP-IN-SWIFT

Object Oriented Programming
Apache License 2.0
6 stars 0 forks source link

[seungchan] 객체지향의 사실과 오해 3 · 4장 #6

Open seungchan2 opened 2 years ago

seungchan2 commented 2 years ago

75p
숭객이 꼭 알아야 하는 사실만 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하는 지하철 노선도를 창조해 낼 수 있었다. -> 예시로 추상화의 개념을 말하고 있다.

seungchan2 commented 2 years ago

80p
앨리스는 정원에 서 있는 다양한 인물들을 계급, 나이, 성격 등의 차이점은 무시한 채 '트럼프'라는 유사성을 기반으로 추상화해서 바라보고 있는 것이다. -> Swift를 기준으로 생각했을 때, 프로토콜을 활용해서 유사 부분을 추상화할 수 있다? 라고 생각

seungchan2 commented 2 years ago

83p
사람들은 본능적으로 공통적인 특성을 기준으로 객체를 여러 그룹으로 묶어 동시에 다뤄야 하는 가짓수를 줄임으로써 상황을 단순화하려고 노력한다. -> 개념(concept)이라는 용어가 등장하는데 객체들을 묶기 위한 그릇이라는 의미이다. 우리가 코드를 짤 떄 어떤 기준으로 객체들을 묶는 것이 효율적일까? 라는 생각이 듦

seungchan2 commented 2 years ago

92p
그렇다면 객체는 데이터인가? 그렇지 않다. 객체에서 중요한 것은 객체의 행동이다.
-> 객체는 상태와 행동을 가지는데 상태는 행동의 결과로 초래된 부수효과를 쉽게 표현하기 위해 도입한 추상적인 개념이다. 중요하게 고려해야할 것은 객체가 이웃하는 객체와 협력하기 위해 어떤 행동을 해야 할 지를 결정하는 것이다.

seungchan2 commented 2 years ago

93p
같은 타입에 속한 객체는 행동만 동일하다면 서로 다른 데이터를 가질 수 있다. 여기서 동일한 행동이란 동일한 책임을 의미하며, 동일한 책임이란 동일한 메시지 수신을 의미한다. 따라서 동일한 타입에 속한 객체는 내부의 데이터 표현 방식이 다르더라도 동일한 메시지를 수신하고 이를 처리할 수 있다. 다만 내부의 표현 방식이 다르기 때문에 동일한 메시지를 처리하는 방식은 서로 다를 수밖에 없고 이것은 다형성에 의미를 부여한다.

seungchan2 commented 2 years ago

94p
행동에 따라 객체를 분류하기 위해서는 객체가 내부적으로 관리해야 하는 데이터가 아니라 객체가 외부에 제공해야 하는 행동을 먼저 생각해야 한다. 이를 위해서는 객체가 외부에 제공해야 하는 책임을 먼저 결정하고 그 책임을 수행을 수행하는 데 적합한 데이터를 나중에 결정한 후, 데이터를 책임을을 수행하는 데 필요한 외부 인터페이스 뒤로 캡슐화해야 한다.



protocol ViewModelInputLogic {
    func userTapAction()
}

protocol ViewModelOutputLogic {
    var backgroundPublisher: AnyPublisher<UIColor, Never> { get }
}

protocol ViewModelLogic: AnyObject {
    var input: ViewModelInputLogic { get }
    var output: ViewModelOutputLogic { get }
}

class ViewModel: ViewModelLogic, ViewModelOutputLogic, ViewModelInputLogic {

    var input: ViewModelInputLogic { self }
    var output: ViewModelOutputLogic { self }

    private let backgroundSubject = PassthroughSubject<UIColor, Never>()
    var backgroundPublisher: AnyPublisher<UIColor, Never> {
        return backgroundSubject.eraseToAnyPublisher()
    }

    func userTapAction() {
        backgroundSubject.send(.red)
    }
}

해당 코드가 잘 설명된 부분이라고 생각을 하는데 ViewModelOutputLogic을 통해 외부에 제공해야 하는 행동을 정의했다. 

그에 따른 데이터인 UIColor를 캡슐화해서 적절히 사용을 하였다.
seungchan2 commented 2 years ago

p97 ~ p100
일반화, 특수화에 대해 설명을 한다. 이 부분을 읽으면서 BaseViewController, BaseProtocol이 생각이 났다.

BaseViewController를 상속받는 VC에서는 필요없는 행동들까지 포함이 되니까 불필요한 특성을 배제에 실패했다고 말할 수 있을 것 같다.

하지만 Protocol로 필요한 공통의 행동들만 합성해서 사용한다면 .. ?

seungchan2 commented 2 years ago

p105
결국 객체지향에서 중요한 것은 동적으로 변하는 객체의 '상태'와 상태를 변경하는 '행위'다
-> 동적, 정적이라는 말이 잘 이해가 가질 않음 . .

seungchan2 commented 2 years ago

p115
크레이그 라만 "객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것"
-> 책임의 기준이 무엇일까 . .