[완료] 소프트웨어의 설계시 소프트웨어가 구체화 될수록 그에 맞게 하위클래스들도 구체화될때, 프로그램을 구성하는 클래스는 결합도가 높아지는 것인가??(높아질수밖에 없는 것인가?)

GMRyuj의 이미지

소프트웨어 설계에 관심을 가지고 있는 현역 군인입니다.
최근 UML과 소프트웨어 디자인&아키텍쳐를 읽고, 소프트웨어를 제작하고 있습니다.
여기에 소프트웨어 제작을 하면서 디자인 패턴도 적용하고 싶어 디자인 패턴까지 적용하여 설계를 하고 있는 중입니다.
그런데 갑자기 이러한 생각이 드는군요.. 추상화, 다형성, 상속이런 용어를 계속 접하다보니 지금 정신이 없어서 그러는지는 모르겠지만..
우선 배운 것으로는 OOP 5대 원칙 (SRP, DIP, ISP , LSP, OCP)을 최대한 지켜서 설계를 하고있고 여기에 MVC 패턴(?)모델도 또한 생각을 하면서 설계를 하고 있습니다.
그런데 지금 제가 겪고있는 문제는 위와 같은 설계원칙은 아닌것 같아서 질문드립니다.

상위 계층은 굉장히 추상적인데 프로그램을 실질적으로 구현하는 부분(Mediator 패턴처럼)은 재사용될수 없을 정도로 구체적인가??
프로그램이 구체화 될수록 그 구체화된 클래스는 다시는 재사용될수는 없는 것인가..? 이런 질문이 떠올랐습니다..
상위 계층은 당연히 재사용될수 있지만.. 하위 계층은 재사용될수 없는 것인지..?

핵심질문은... 프로그램이 구현될때 구현에 필요한 하위 클래스들은 결합도가 높아지는 것인지..?
(응집력은 최대한 높이고.. 결합도는 최대한 낮춰라.. 이말이 떠오르는데.. 프로그램을 만드려면 당연히 결합도가 높아져야하는 것이 아닌가..?? 이런 의문이 들기도합니다.)

(예전에는 이런 문제는 생각도 안하면서 프로그램을 바로 만들다보니 이런 생각은 해본적이 없습니다. 위의 질문은 당연하고도 아주 당연한 것이지만 혹시나해서 경험많으신분들께 질문올립니다. 혼자 배우니.. 뭔가 틀린것 같고.. 부족한것 같기도 한 느낌이 듭니다.)

※ 현재 개발하고 있는 프로그램은 도스용 컴퓨터 게임입니다.

익명 사용자의 이미지

무슨 말씀인지 전혀 모르겠습니다만....
꼭 왜 구체화된 클래스를 다시 사용해야 하는지요? 말씀하신 하위 계층의 클래스는 그 특정 임무를 수행하기 위해 쓰여진 코드인데,
딱히 이걸 그 부분 말꼬 써야할 이유가 있을가요?
그냥 여려개의 abstraction레이어를 거쳐 좀더 재사용이 용이하게 프로그램을 만드는것이 바람직하지 않은가요?

그리고 응집력은 높이고 결합도는 낮춰라라는 말씀.. 위에 말씀하신 mediator패턴(몰라서 wiki찾아봤습니다)도 이걸 위해 존재하는듯 싶은데요
여기서 응집력이 무엇이고 결합도가 무엇인지 잘은 모르겠지만, 위와같은 디자인 페턴을 통해
서로 잘 맞물려 돌아갈수 있지만, 서로 마구 섞여있는 spaghetti코드가 되지 않도록 하여 디자인을 하라는 말 같은데요..

나그네나그네의 이미지

체계적으로 공부하시네요..
separation of concern을 적용하면 하위 모듈 간에서도 낮은 결합도가 성립될 수 있지 않을까요?
그리고 제작한 하위 모듈은 상위 모듈과는 다르게 특정 환경에서 재사용될 수 있는 것이구요

GMRyuj의 이미지

separation of concern 개념을 처음 알게되었습니다.

클래스에서의 책임을 나눠 복잡성을 숨겼지만.. 이로인해 다른 복잡성이 또 생긴다는 것.. 좋은 개념을 알게된것 같습니다.

==참고 사이트==
http://arload.wordpress.com/2009/04/01/soc_n_complexity/ -> 이것은 피드백글까지 읽으니 많은 도움이 되었습니다.
http://toby.epril.com/?p=714
http://toby.epril.com/?p=711

위 3중 SOC를 사용하면 더 복잡해진다 vs 더 복잡해지지 않는다.(단지 핑계일뿐이다.)
어느게 맞는 것일까요? 너무 혼동됩니다. ㅠ..ㅠ (고래싸움에 새우등 터지네..)

이 세상에서 불가능한 것은 단 하나뿐이다.
그것은 자신을 완벽히 믿는 것이다.

empty2fill의 이미지

전혀 결합되지 않는 것들을 하나의 프로그램이라고 볼 수는 없겠지요.

결합도가 높아지는 것이 문제가 아니라 불필요하게 높지 않도록 해야 하지 않을 까요?

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

GMRyuj의 이미지

맞습니다. 결합도가 지나치게 높아지면 안되는 것 같습니다.

이 세상에서 불가능한 것은 단 하나뿐이다.
그것은 자신을 완벽히 믿는 것이다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.