객체지향 언어에서 컴포지션 사용시 접근 방법에 대해...

Ihaveaquestion의 이미지

안녕하세요. 프로그래밍 공부하는 학생입니다.

클래스(편의상 A라고 하겠습니다.)에서 컴포지션을 사용할 때, 이 컴포지션(이것은 P라고 하겠습니다.)에 대해 어떻게 접근을 해야 올바른 것일까 궁금하여 질문을 드립니다.

외부에서 클래스 A 객체를 생성하여 사용하면 A 객체 내에 있는 컴포지션된 객체는 getP() { return P; } -> A.getP().doSomething(); 식으로 사용하는 게 나을지,

doSomthing(int i) { P.doSomething(i); } -> A.doSomething(); 식으로 사용하는 게 나을지 의문이 듭니다.

후자가 더 나을 표현같은데, 이는 중복이 생기고, P에서 호출방식을 바꾸면 A클래스 내에서도 변경을 해주어야 하기 때문에 안 좋아 보입니다.

외부에서 컴포지션 객체를 사용하려면 어떻게 해야 좋을까요?

yhsuk의 이미지

고민하신 내용은 디미터의 법칙 혹은 최소지식의 원칙에 해당되는 내용입니다.
이 법칙은 장단점이 있어 확실히 지키기는 힘들죠.

언급된 내용 중 후자의 방법으로만 하라는 룰입니다.
즉, 메쏘드 체이닝을 하지 말라는 원칙입니다.

룰을 철저하게 지키려면 wrapper를 많이 만들어줘야 해서 힘든게 단점입니다.

P 클래스 인터페이스가 변하면 A의 멤버함수를 수정해야 하는 건 맞습니다.
하지만, 입장을 바꿔서 A를 사용하는 측에서는 변경하지 않아도 되는 장점이 있습니다.
P의 doSomething(i)이 doProcess(i)로 이름변경이 된 경우,

전자의 경우엔 A.getP().doSomething(i)로 호출된 모든 부분을 찾아서 A.getP().doProcess()로 바꿔야 하고,
후자의 경우엔 변경을 안해도 됩니다. (A.doSomething(i) 그대로)

장단점이 존재하는 법칙이라, 어느 정도 따르면 좋지만, 절대적인 룰은 아니라 하니 상황에 맞게(? 이게 힘든) 사용하시면 되겠습니다.

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.