역할 , 책임 , 협력
-
객체
- 현실의 사물을 추상화 / 모방 ?
- 가상세계의 사물을 창조
-
객체간의 협력
protocol guest{
func order(menu : String){}
}
// 손님 역할
protocol Casher{
func takeOrder(menu : String, money : UInt){}
func deliver(menu : String){}
}
// 캐셔 역할
protocol Barista{
func makeCoffee(menu : String) -> (Coffee){}
}
// 바리스타 역할
-
각각의 역할이 존재하고 그에 해당하는 책임이 있다.
-
하나의 문제를 해결하기 위해서는 여러 객체간의 협력이 필요하다.
-
역할은 외부에서 볼때는 역할이고 , 내부에서 볼때는 일종의 책임에 해당한다.
-
객체간의 협력을 할때는 요청:메시지 로 소통하고 각각의 객체는 처리:메소드를 수행하고 응답한다.
1. 손님이 캐시어에게 주문을 한다. // 요청 2. 캐시어가 바리스타에게 주문 내용을 전달한다 // 요청 3. 바리스타가 커피를 만든다. // 응답 4. 캐시어가 커피의 완성을 알린다. // 응답 5. 손님은 커피를 습득한다. // 문제 해결
-
협력 하고 책임을 수행하는 것 의 의미
-
```swift
- 동일한 역할을 하는 여러 객체가 존재한다.
- 동일한 역할을 하는 객체간에는 대체 가능성이 존재한다. // 동일한 역할을 하는 어느객체이든지 수행가능하다.
- 동일한 역할을 하는 객체간에는 동일한 책임이 적용되나, 그 책임을 수행하는 방식은 차이가 있을 수 있다. // 다형성
- 하나의 객체는 여러 역할을 할 수 있다. // 프로토콜 다중 구현 ```
객체의 자율성
-
스스로 결정하고 , 스스로 책임을 지면 자율적인 존재라고한다.
-
객체는 상태 와 행동 을 가진다.
-
객체는 행동은 외부의 영향을 받지 않고 자신의 상태를 기반으로 행동을 결정한다.
-
객체는 자신의 상태에 대해서 외부의 간섭로 부터 자유로워야한다.
-
외부에서는 해당 객체가 무엇을 수행하는지는 알수 있으나 어떻게 수행하는지에 대해서는 알 수 없다.
#### 하는 것
- 계산
- 행동의 시작
- 다른 객체를 제어
### 아는 것
- 링크된 다른 객체 - 자신에 대한 정보 - 자신이 유도할수 있는 것에 관해 아는 것 - (다른 객체에 보낼수 있는 요청)/역할
- 역할은 밖에서 볼때는 역할이고 안에서 볼때는 책임 이다.
- 역할은 특정 동작을 수행할 의무를 가지고 , 그 동작을 수행한다.
- 역할을 추상화 함으로써 , 인지과부화를 막을 수 있다.
카카오톡은 채팅어플을 만들어야합니다.
부엉이를 고용해서 , 부엉이에게 개발을 맡깁니다.
부엉이는 코딩을 합니다.
부엉이가 급한 일로 해외에 나가게되었습니다.
올빼미를 고용해서, 올빼미에게 개발을 맡깁니다.
채팅어플이 무사히끝납니다.
카카오톡은 , 은행어플을 만들어야합니다.
이번에는 기대하는 흥푸를 고용합니다.
기대하는 흥푸는 이제 코딩을 합니다.
위의 예제에서 굵게 표시된 부분을 제외한 동작은 계속적으로 반복되는 부분입니다.
그렇다면 저 동작을 하는 누구라도 괜찮지 않을까요?
저 동작을 하는 역할을 가진 어느 누구도 괜찮을거 같습니다.
역할로 다시 표현해보겠습니다.
IT기업은 소프트웨어를 만들어야합니다.
개발자를 고용해서 코딩을 시킵니다.
3줄로 줄어들었네요. - 단순해졌네요?
또 앞으로 새로운 개발자가 많이 많이 생겨도 저 위의 논리는 변함이 없을 것입니다. - 유연할 거같습니다.
위의 역할은 꾸준하겠네요 - 재사용이 가능하겠네요
###단순성,유연성,재사용성
추가 공부 : 책임 주도 설게(Responsibility - Driven - Design)
소프트웨어를 설계함에 있어서는 소프트웨어가 할 기능들을 정의해야 겠습니다.
또 그 기능을 구현하기위해서는 협력하는 객체를 만들고 ,
역할과 책임을 모두 알아낸뒤 적절한 객체에 할당을 해주어야 할 것입니다.
객체가 책임을 수행하다가 스스로 처리 못하는 경우 , 다른 객체에게 협력을 요청해야합니다.
이렇게 올바른 소프트웨어를 만들기위해서는 아래와 같은 사항을 지켜주면 좋습니다.
- 시스템이 사용자에게 제공해야할 기능을 파악
- 시스템의 책임을 더 작은 책임으로 분할
- 분할된 책임을 수행할 수 있는 적절한 객체또는 역할을 찾아 책임을 할당
- 역할을 하는 객체들간의 협력을 하여 동작.