de-vook / The-Essence-of-Object-Orientation

책 <객체지향의 사실과 오해> 그룹 스터디
18 stars 3 forks source link

[호댕 & 고사리] `객체는 역할이 암시하는 책임보다 더 많은 책임을 가질 수 있다` #25

Open yanghojoon opened 2 years ago

yanghojoon commented 2 years ago

p/127의 4번째 단락에 객체는 역할이 암시하는 책임보다 더 많은 책임을 가질 수 있다라고 하고 있고, p/28에서도 여러 사람이 동일한 역할을 수행할 수 있다 라고 표현하고 있습니다. 위 내용을 보고 하나의 객체가 여러 역할을 가질 수 있다는 의미로 이해했는데, 그렇다면 이는 SOLID의 단일 책임 원칙에 대치될까요?

여러분의 의견이 궁금합니다.

추가적으로 역할이 단일책임으로 될수록 응집도가 높아지고, 하나의 객체에 역할이 많아질수록 결합도가 올라간다고 생각했습니다. 여기서 역할이 많아질수록 무조건 객체 간 결합도가 올라가는 것이 맞을까요?

Kim-EunsooSilver commented 2 years ago

😳와...SOLID 까지 생각하셨다니 호댕과 고사리는 정말... 훌륭하네요...!

두 분의 질문에 대해 생각을 해봤는데요! 🤔 SOLID에서 말하는 단일 책임 원칙은 필요 기능에 대한 단일책임을 말하는게 아닐까요?

저자가 말하는 앨리스 이야기로 보자면! 재판이라는 기능에서 왕은 재판관의 역할만 합니다. 책에는 나오지 않지만, 제가 생각한 내용을 말씀드리자면 국가를 다스리는 기능에서는 통치자의 역할만 하는거죠!

저는 이렇게 생각했습니다!!

yanghojoon commented 2 years ago

넵! 니코가 말씀해주셨던 것처럼, SOLID에서 말하는 단일 책임 원칙은 객체를 설계할 때 필요하다고 판단한 기능에 대해서만 단일 책임을 갖는다고 이해했습니다! 다만 역할이 암시하는 책임보다 더 많은 책임을 가질 수 있다면, '필요하다고 판단한 기능 이외의 책임을 가질 수 있는 것 아닐까?' 라고 생각해서 SOLID 원칙과 배치되는 것이 아닌가 생각했어요!!

gogosilver commented 2 years ago

니콜라스의 의견을 토대로 왕을 바라보면, 왕은 두 가지 기능 각각에 단일책임을 지닌 것으로 보여집니다.

저는 SRP(단일 책임 원칙)을 조금 다르게 보고 있는데요. 객체가 변경되는 이유는 하나여야 한다 는 SRP에 대한 제 이해가 맞다면, 두 가지 기능, 두 가지 책임을 지닌 왕은 변경되는 이유가 다수가 되어버린다고 생각했습니다.

이 부분에 대해서는 어떻게 생각하시는지 궁금합니다.

jsim27 commented 2 years ago

하나의 객체가 하나의 협력뿐 아니라 둘 이상의 협력에 참여하게 되는 상황이 있을 수 있고, 그렇다면 여러 역할을 가지게 되는 것이 자연스러운 것 같습니다. 니코 말씀처럼 왕이 "국정 수행" 협력시에는 국가원수 역할을, "재판" 협력 시에는 판사 역할을 수행하는 것이지요..

  1. 이것이 SOLID 원칙에 위배되는가? 저는 항상 위배된다고 생각하지는 않아요.

Swift에서의 친숙한 예시를 들어 보자면, UIKit이 제공하는 객체들은 대부분 상속을 하고 있죠? UIButton은 버튼 역할을 수행할 수도 있지만, 부모 클래스인 UIControl, UIView, UIResponder, ........, NSObject 까지 다양한 역할로 협력에 참여할 수 있는 것 같아요. SOLID원칙에서 상속을 지양하라고 하지는 않았으니, 이렇게 다양한 역할을 하나의 객체가 가지고 있는 것이 단일책임 원칙을 위배하는 것 같지는 않습니다.

yeonheeha commented 2 years ago

말씀해주신 여러 사람이 동일한 역할을 수행할 수 있다 -> '판사'나 '증인'의 역할을 여러 등장인물이 대체한 예시로 설명할 수 있을 것같습니다. 그런데 이 부분이 객체는 역할이 암시하는 책임보다 더 많은 책임을 가질 수 있다 와 연결되어 하나의 객체가 여러 역할을 가질 수 있다는 의미로 연결될 수 있겠다는 부분은 이해를 하지 못했어요. 😭


하나의 객체에 역할이 많아질수록 결합도가 올라간다고 생각했습니다. 여기서 역할이 많아질수록 무조건 객체 간 결합도가 올라가는 것이 맞을까요? => 하나의 객체가 맡은 역할(수행하는 책임)이 많아질수록 하나를 변경할 때 다른 부분도 변경이 될 가능성이 높으므로 결합도가 올라간다고 생각합니다.

hwangjeha commented 2 years ago

역할과 책임은 다르다고 생각합니다. 책 119p 역할 파트 부분에

책음의 집합이 의미하는 것

이라 적혀있습니다. 왕 객체는 왕이 해야할 책임, 판사가 해야할 책임 두가지 책임을 가진 하나의 역할을 수행하는 객체인거죠.

코드를 작성할 때를 생각해보면 상속이나 프로토콜을 통해서 여러가지 책임을 하나의 객체가 가질 수 있다고 생각합니다.

class 왕 { }
class 판사 { } // 프로토콜로 바꿀 수도 있음.

extension 왕: 판사 { }

왕, 판사 클래스는 각각 solid에서 이야기하는 단일 책임 원칙을 지키고 있다고 생각합니다.

그리고 역할이 많아질수록 무조건 객체 간 결합도가 높아질까요? 라고 질문해주셨는데 저는 결합도가 높아진다고 생각되지는 않습니다.

왕만이 판사의 역할을 수행할 수 있다면 오히려 결합도가 높아진게 아닌가 생각합니다. 판사의 자리에는 왕만 들어갈 수 있게 되니까요. 하지만 판사라는 역할을 가진 객체는 판사의 책임을 수행할 수 있으니 조금 더 유연하지 않을까 생각이 듭니다😊