새소식

반응형
Study/오브젝트

[Object] 1장 : 객체, 설계

  • -
반응형

티켓 판매 애플리케이션 구현

소프트웨어 모듈이 가져야 하는 세 가지 기능(로버트 마틴) 

  • 실행 중에 제대로 동작하는 것
  • 변경을 위해 존재하는 것
  • 코드를 읽는 사람과 의사소통하는 것

 

무엇이 문제인가

예상을 빗나가는 코드 

이해 가능한 코드는 우리의 예상에서 크게 벗어나지 않는 코드

하나의 클래스에서 너무 많은 세부적인 내용들을 다루면 생기는 문제 

  • 이해하기 어렵다
  • 변경에 취약하다

변경에 취약한 코드 

  • 의존성(dependency)이 높은 코드
    • 어떤 객체가 변경될 때, 그 객체에 의존하는 객체도 변경될 수 있음 
  • 결합도(coupling)가 높은 코드
    • 결합도가 높다: 의존성이 강하다
    • 결합도가 낮다: 합리적인 수준으로 의존한다 

객체지향 설계의 목표: 객체 사이의 결합도를 낮춰 변경이 용이한 설계는 만드는 것 

 

설계 개선하기

자율성을 높이자 

개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것을 캡슐화 

변경하기 쉬운 객체를 만듦 

객체 내부로의 접근을 제한 -> 객체와 객체 사이의 결함도를 낮춤 

 

객체를 인터페이스와 구현으로 나누고 인터페이스만을 공개하는 것 

-> 객체 사이의 결합도를 낮추고 변경하기 쉬운 코드를 작성하기 위해 따라야 하는 가장 기본적인 설계 원칙

무엇이 개선됐는가 

우리의 예상과도 일치하고 변경 용이성 측면에서도 개선되었다. 

어떻게 한 것인가 

자기 자신의 문제를 스스로 해결하도록 코드를 변경해서 응집도를 높였다. 

캡슐화와 응집도 

응집도 높은 객체가 되려면 자율적인 존재가 되어야 한다. 

자율적인 객체란 객체 내부 상태를 캡슐화하고 객체 간에 오직 메시지를 통해서 상호작용하는 객체를 말한다.

절차지향과 객체지향

절차적 프로그래밍(Procedural Programming)

  • 프로세스(Process)와 데이터(Data)가 별도 모듈에 위치
  • 프로세스가 필요한 모든 데이터에 의존하게 되어 변경에 취약

객체지향 프로그래밍(Object-Oriented Programming)

  • 프로세스와 데이터가 동일한 모듈 내부에 위치
  • 객체 내부의 변경이 객체 외부에 파급되지 않도록 제어 가능
  • 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮춘다

책임의 이동(shift of responsibility)

책임 기능을 가리키는 객체지향 세계의 용어

객체지향 설계에서는 각 객체에 책임이 적절하게 분배되어 자신을 스스로 책임진다.

따라서 쉬운 구조와 가독성 있는 코드를 얻는다.

더 개선할 수 있다

설계는 여러 가지 방법으로 가능하다.

각 설계에 따른 트레이드오프가 존재한다.

그래, 거짓말이다!

의인화(anthropomorphism)

모든 생물처럼 소프트웨어는 태어나고, 삶을 영위하고, 그리고 죽는다.

현실에서 수동적인 존재는 객체지향의 세계에서 능동적이고 자율적인 존재가 된다.

훌륭한 객체지향 설계는 소프트웨어를 구성하는 모든 객체들이 자율적으로 행동하는 설계이다.

 

객체지향 설계

설계란 코드를 배치하는 것이다. 

좋은 설계란 오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계다. 

 

객체지향 프로그래밍은 의존성을 효율적으로 통제할 수 있는 다양한 방법을 제공함으로써 변경에 좀 더 수월하게 대응할 수 있게 해 준다. 

변경 가능한 코드란 이해하기 쉬운 코드다. 

객체지향 패러다임은 예상하는 방식대로 객체가 행동하리라는 것을 보장함으로써 코드를 좀 더 쉽게 이해할 수 있게 한다. 

 

애플리케이션은 객체들로 구성되며 애플리케이션의 기능은 객체들 간의 상호작용을 통해 구현된다. 

이 상호작용은 객체 사이에 주고받는 메시지로 표현된다. 

메시지를 전송하기 위해 알고 있어야 하는 것들이 두 객체를 결합시켜 의존성을 만든다. 

 

데이터와 프로세스를 하나의 덩어리로 모으는 것은 객체지향 설계의 첫걸음이다. 

훌륭한 객체지향 설계란 협력하는 객체 사이의 의존성을 적절하게 관리하는 설계다.

 

 

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.