밤에 쓴 코드

OOP) 역할 , 책임 , 협력 본문

OOP

OOP) 역할 , 책임 , 협력

붱이🦉 2019. 4. 22. 16:50

역할 , 책임 , 협력


  • 객체
    • 현실의 사물을 추상화 / 모방 ?
    • 가상세계의 사물을 창조
  • 객체간의 협력
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. 손님은 커피를 습득한다. // 문제 해결
  • 협력 하고 책임을 수행하는 것 의 의미

  • 1. 동일한 역할을 하는 여러 객체가 존재한다.  
    2. 동일한 역할을 하는 객체간에는 대체 가능성이 존재한다. // 동일한 역할을 하는 어느객체이든지 수행가능하다.
    3. 동일한 역할을 하는 객체간에는 동일한 책임이 적용되나, 그 책임을 수행하는 방식은 차이가 있을 수 있다. // 다형성
    4. 하나의 객체는 여러 역할을 할 수 있다.         // 프로토콜 다중 구현

객체의 자율성

  • 스스로 결정하고 , 스스로 책임을 지면 자율적인 존재라고한다.

  • 객체는 상태행동 을 가진다.

  • 객체는 행동은 외부의 영향을 받지 않고 자신의 상태를 기반으로 행동을 결정한다.

  • 객체는 자신의 상태에 대해서 외부의 간섭로 부터 자유로워야한다.

  • 외부에서는 해당 객체가 무엇을 수행하는지는 알수 있으나 어떻게 수행하는지에 대해서는 알 수 없다.


    하는 것

    • 계산
    • 행동의 시작
    • 다른 객체를 제어

    아는 것

    • 링크된 다른 객체
    • 자신에 대한 정보
    • 자신이 유도할수 있는 것에 관해 아는 것 - (다른 객체에 보낼수 있는 요청)/

역할

  • 역할은 밖에서 볼때는 역할이고 안에서 볼때는 책임 이다.
  • 역할은 특정 동작을 수행할 의무를 가지고 , 그 동작을 수행한다.
  • 역할을 추상화 함으로써 , 인지과부화를 막을 수 있다.

카카오톡채팅어플을 만들어야합니다.

부엉이를 고용해서 , 부엉이에게 개발을 맡깁니다.

부엉이는 코딩을 합니다.

부엉이가 급한 일로 해외에 나가게되었습니다.

올빼미를 고용해서, 올빼미에게 개발을 맡깁니다.

채팅어플이 무사히끝납니다.

카카오톡은 , 은행어플을 만들어야합니다.

이번에는 기대하는 흥푸를 고용합니다.

기대하는 흥푸는 이제 코딩을 합니다.


위의 예제에서 굵게 표시된 부분을 제외한 동작은 계속적으로 반복되는 부분입니다.

그렇다면 저 동작을 하는 누구라도 괜찮지 않을까요?

저 동작을 하는 역할을 가진 어느 누구도 괜찮을거 같습니다.

역할로 다시 표현해보겠습니다.


IT기업소프트웨어를 만들어야합니다.

개발자를 고용해서 코딩을 시킵니다.


2줄로 줄어들었네요. - 단순해졌네요?

또 앞으로 새로운 개발자가 많이 많이 생겨도 저 위의 논리는 변함이 없을 것입니다. - 유연할 거같습니다.

위의 역할은 꾸준하겠네요 - 재사용이 가능하겠네요

단순성,유연성,재사용성


추가 공부 : 책임 주도 설게(Responsibility - Driven - Design)

소프트웨어를 설계함에 있어서는 소프트웨어가 할 기능들을 정의해야 겠습니다.

또 그 기능을 구현하기위해서는 협력하는 객체를 만들고 ,

역할과 책임을 모두 알아낸뒤 적절한 객체에 할당을 해주어야 할 것입니다.

객체가 책임을 수행하다가 스스로 처리 못하는 경우 , 다른 객체에게 협력을 요청해야합니다.

이렇게 올바른 소프트웨어를 만들기위해서는 아래와 같은 사항을 지켜주면 좋습니다.

  • 시스템이 사용자에게 제공해야할 기능을 파악
  • 시스템의 책임을 더 작은 책임으로 분할
  • 분할된 책임을 수행할 수 있는 적절한 객체또는 역할을 찾아 책임을 할당
  • 역할을 하는 객체들간의 협력을 하여 동작.

'OOP' 카테고리의 다른 글

OOP ) SOLID - 객체지향 5원칙  (0) 2019.05.18
OOP ) 타입, 추상화  (0) 2019.04.28
OOP ) 상태 , 행동 , 식별자  (0) 2019.04.26
OOP ) Class,객체간의 소통  (0) 2019.04.07
OOP ) 클래스 / 인스턴스 / 객체  (0) 2019.04.02
Comments