객체의 역할, 책임, 협력
개요
객체지향의 사실과 오해를 읽었다. 굉장히 좋은 내용이라 정리하며 읽느라 꽤 긴 시간이 소모되었고, 다 읽은 후 감상은 나는 객체지향을 오해하고 있던게 맞았다.
이 책을 처음부터 끝까지 관통하는 주제를 가지고 정리 해보자.
객체지향의 핵심
객체지향의 핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력체계를 구축하는 것이다. 객체지향은 '객체' 지향 프로그래밍 패러다임인 것이지, '클래스'가 전제로 깔린 패러다임이 아니다.
클래스는 객체를 만드는데 필요한 구현 매커니즘이다. 클래스가 없어도 객체는 있으며, 예를 들어 자바스크립트는 프로토타입 기반 객체지향이다.
중요한 것은 객체의 역할과 책임과 협력이다. 그렇다면 어떻게 해야 객체 공동체가 적절히 협력하고, 변경에 유연하며, 견고한 구조를 가질 수 있을까?
역할, 책임, 협력
우선 역할, 책임, 협력을 짚고 넘어가야 한다.
일반적으로 하나의 문제를 해결하기 위해선 다수의 역할간 협력이 필요하다. 협력이라는 문맥안에서 역할은 자신의 책임을 수행한다.
이때, 책임을 수행하는 것은 역할이다. 역할이 자기 책임을 잘 수행할 수 있다면 어떤 객체가 역할을 맏아도 상관 없다.
그리고 책임은 자율적이다. 역할을 수행하기 위해서 객체가 어떤 방식을 사용하든 책임을 수행하라는 요청을 보낸 수신자는 책임만 잘 수행되면 된다.
역할을 어떤 객체가 수행해도 상관이 없다는 것은 할 수 있다면 한 객체가 여러 역할을 수행할 수 있다는 의미도 된다.
자율적인 객체들이 서로 협력하여 자신의 역할을 따라 책임을 수행하는 것이 곧 객체지향이다.
자율
객체들이 건강한 협력을 하기 위해서 필요한 건 객체의 자율성이다. 자율?
자율이란 자신의 행동을 스스로 결정하고 책임지는 것이다. 객체는 목표를 달성하기 위해 협력하지만 자신의 결정과 판단에 따라 움직인다.
행동
그러면 좋은 객체지향 공동체를 설계하기 위해선 어디에 초점을 맞춰야 할까? 행동이다. 행동이 상태를 결정한다.
객체는 다른 객체와 협력하기 위해 존재하고, 행동은 객체가 협력에 참여하는 유일한 수단이다. 행동을 결정한 후에야 행동에 필요한 정보가 무엇인지를 고려하게 되며 이 과정에서 필요한 상태를 선택하게 된다.
협력 안에서 객체의 행동은 객체가 협력에 참여하면서 완수해야 하는 책임을 의미한다. 따라서 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야 한다.
여기서 놓치지 말아야 할 점은 객체의 세계에서는 협력이라는 문맥이 객체의 행동방식을 결정한다는 점이다.
책임-주도 설계
객체지향 설계란 어플리케이션의 기능을 구현하기 위한 협력 관계를 고안하고, 협력에 필요한 역할과 책임을 식별한 후 이를 수행할 수 있는 적절한 객체를 식별해 나가는 과정이다.
책임 주도 설계는 시스템의 책임을 객체의 책임으로 변환하고, 각 객체가 책임을 수행하는 중 필요한 정보나 서비스를 제공해줄 협력자에게 책임을 할당하는 방식으로 객체 공동체를 구축한다.
객체들 간에 주고받는 메시지를 기반으로 적절한 역할과 책임, 협력을 발견하는 것이다. 이 설계의 핵심은 어떤 행위가 필요한지 결정한 뒤에 행위를 수행할 객체를 결정하는 것이다.
메시지를 먼저 결정하고 객체가 메시지를 따르게 하는 설계 방식은 송신자와 수신자가 느슨하게 결합한다. 오로지 수신자와 송신자는 서로를 잘 모른다. 오로지 메시지만으로 결합하게 된다.
왜 더 나은 설계라고 할까?
객체들이 동일한 목적을 달성하기 위해 협력하는 협력방법의 가짓수는 수도 없이 많다.
어떤 협력은 다른 협력보다 더 이해하기 쉽고 변경에 유연하다. 이때에도 핵심은 객체가 자율적일수록 협력이 이해하기 쉬워지며 유연하게 변경할 수 있게 된다는 점이다.
결국 좋은 객체지향 설계는 협력이라는 문맥 안에서 자율적인 객체들이 역할에 따른 책임을 수행하는 공동체를 구축하는 것이다.
마치며
정말 좋은 책이다. 오브젝트를 공부하기 전에 같은 객체지향 세계관에 인식을 올려두기 위해 가볍게 읽어보자는 의도였는데, 굉장히 중요한 내용이 쏟아져 나왔다. 추상화 캡슐화 등 좋은 객체지향 프로그래밍을 위해 고려해야 할 요소에 대한 깊은 설명이 있다.
객체지향 프로그래밍은 클래스를 이용해서 서로 소통하는 프로그래밍 방법이라는 두루뭉술한 느낌이었는데 이해도가 조금 더 올라간 것 같다.
거기에 더해 객체지향에서 그치지 않고 프로그래밍 자체에 대해 생각해보게 된다. 어떤 방식이든 결국 목적을 위해 여러 코드들이 협력하는 것은 같다. 객체지향에만 국한된 이야기가 아니다.
나는 협력이란 문맥을 잘 고려하지 않았던 것 같다. 다음부터는 어떤 목적을 위해 코드들이 협력하게 할 것인가부터 잘 생각해 보아야겠다.