객체지향 설계는 과연 어떻게 하는 것이 좋을까요?

offree의 이미지

객체지향 설계는 과연 어떻게 하는 것이 좋을까요?

간단한(?) 예를 들어 사진들을 보는 갤러리 를 만든다고 했을 때

우선 객체지향 설계와 DB 구조(스키마) 에 대해 어떻게 처리하는 것이 좋은 설계방법인지 모르겠습니다.

Gallery
Gallery_photo
Gallery_comment

이런 DB table 을 이루고 있다고 했을때..

클래스를 이 DB 구조에 맞게 하는 것이 좋은 것인지..
(각 DB table 별 class 를 정하고, table 이름과 동일하게 명칭을 정한다고 보고)

즉,

gallery_list  :  주제별,제목별 갤러리들을 나누는 리스트

gallery_view : 해당 갤러리의 사진들을 보는 , 사진은 하나 일 수도 있고, 여러개 일수도 있음.
              사진이 여러개 일 경우, 페이지가 나뉠수도 있음.

photo_view : 해당 갤러리의 개별 사진을 본다.

photo_comment : 해당 사진의 코멘트를 처리.

이런 처리가 필요할때

클래스를 DB 구조에 맞게 만들었다면.(거의 1:1 이라고 보시면됨.)

gallery_list
   Gallery->list();         리스트를 출력
   Gallery_photo->get_photo_num();    사진의 수를 출력

gallery_view
   Gallery->get_gallery_info();    갤러리의 정보
   Gallery_photo->list();    사진의 리스트(여러개 일경우 페이지처리)
   Gallery_comment->get_comment_num();  각 사진에 대한 코멘트 수.
   Gallery->list();       갤러리 리스트.

photo_view
   Gallery_photo->get_photo_info();    사진에 대한정보
   Gallery_comment->list();   코멘트 출력.

대충 이런식으로 하는 것이 정상적인 것인지요?

너무 DB 에 의존적(?)인 것은 객체지향적인 설계가 될 수 없다 인지요?

위 예가 간단한 형식이라 적절한 표현을 할 수 없었을 수도 있을 것 같은데.
잘못된 설계라면, 어떻게 하는 것이 정상적인 설계가 되는지요?

역시 더 책을 봐야 겠지만, 적절한 예가 될 만한 것을 볼 수 없을까요?
머리에 쏙 들어올 만한 것이.. ( 책을 보면 정확히 감이 오질 않네요. )

ps. 엉터리 설계라고 놀리지 말아 주세요. ^^

matrix의 이미지

앨범을 보는 시스템의 관점에서 본다면 떠오르는 것이 MVC이고 DB를 사용한다고 하시니 Facade가 떠오릅니다.

이런 예는 많이 있습니다. 웹에도 있고 책에도 예제로 많이 나오는 문제입니다.

얼핏 보면 DB에 너무 집중하시는 듯 한데 DB는 앨범 사진이 저장되는 Resource의 '일종'입니다. 여기서 '추상화'가 이루어져야 겠지요.

만약 앨범의 내용을 브라질에 있는 서버에서 FTP로 가져와야 한다면?
혹은 어떤 서버의 특별한 프로토콜을 이용한 stand alone 데몬을 통해야 한다면? 혹은 LDAP?

즉, 처음부터 지나치게 '구체화'시키는 것은 '확장성'에 별로 좋지 않다는 뜻입니다.

좋은 설계의 조건은 참으로 많습니다. 어설프게 한마디 드리는것보다 이른바 '대가'들의 책을 보시길 권합니다.

How do you define Real?

lovewar의 이미지

Gallery란 단어가 현재 개발하고자 하는 시스템에서
적합한지를 우선 확인하는 작업이 필요하겠습니다.

즉 요구분석에서의 일들(업무 정의, 용어 정리,등등)을 정리하는 것이 중요합니다. 이는 이후 설계 시점에서 설계를 할때 중요한 자료가 되기 때문입니다.
(OO개념들의 대부분이 실생활의 일들(사물)을 정리(속성-attribute과 행위-operation)하여 설계를 하며, 이는 가장 좋은 시스템이라고 볼수 있습니다-개인적 생각.)

이부분(요구분석)에서 혼선(애매성)이 발생하면, 이후의 과정(공정)들은
짐작하실 수 있을것입니다.

다시 한번 정리해 보시기 바랍니다.

명확한 요구분석 과 용어정리 그리고 설계에 대한 많은 생각들은 좋은 시스템을 설계할 수 있는 바탕이 됩니다.

nagaman의 이미지

'대가' 란 구체적으로 누구를 뜻하는 것인가요? 이부분은 구체화가 필요할것 같습니다..

댓글 달기

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