코딩하기 전에 OOP 시스템을 설계하는 간단한 프로세스는 무엇입니까?


10

프로젝트를 빌드해야 할 때마다 항상 계획이나 디자인을 고안하는 것이 아니라 필요한 클래스를 작성한 후 처음부터 전체 프로젝트를 육성하여 프로젝트를 빌드했습니다. 이제는 이것이 소프트웨어를 만드는 올바른 방법이 아니라는 것을 알고 있지만 Objected Oriented Analysis and Design이라는 제목으로 머리를 감싸는 것은 쉽지 않습니다. 하향식 절차 적 설계를보다 쉽게 ​​이해할 수 있습니다. 이는 작업을 하위 작업, 즉 코드에 대응하는 기능, 기능으로 구분하는 것입니다. 그러나 객체 지향 분석 및 디자인 쉽게 이해할 수없는 이유는 클래스를 코딩하는 방법을 모르면 필요한 클래스와 상호 작용 방식을 알 수 없기 때문입니다.

일단 클래스와 객체의 개념을 설계 프로세스에 도입하면 더 이상 하향식을 설계 할 수 없습니다. 문제를 더 이상 절차로 구현할 수있는 문제로 분해하지 않기 때문입니다. 대신, 주제에 대해 읽은 내용에 따라 필요한 클래스를 결정하고 Unified Modeling Language에서 다양한 아티팩트를 작성해야 소프트웨어를 구현할 때 사용할 수 있습니다. 그러나 이런 종류의 디자인 프로세스는 이해하지 못합니다. 그들이 전체 시스템을 이미 생각하지 않은 한, 어떤 클래스가 필요할지, 어떻게 상호 작용할 것인지 어떻게 알 수 있습니까?

이것은 내 문제입니다. 객체 지향 프로그래밍의 개념을 이해하고 있지만 객체 지향 프로그래밍 언어의 개념을 이해할 수 있지만 객체 지향 시스템을 설계하는 방법을 이해하지 못합니다. 그러므로 나에게 맞는 방식으로 Objected Oriented Systems를 설계하는 데 사용할 수있는 간단한 프로세스를 설명 할 사람이 필요합니다.


8
"지금은 이것이 소프트웨어를 만드는 올바른 방법이 아니라는 것을 알고 있습니다." -누가 말했습니까? "디자인은 코딩하기 전에해야 할 일이다. 아마도 멋진 UML 다이어그램을 그려서"라고 믿는 인기있는 함정에 빠진 것 같다. 이러한 오해를 예방하기 위해 Jack Reeves의 "Code as Design" 을 시작하는 것이 좋습니다 .
Doc Brown


@DocBrown. 코딩하는 동안 디자인이 우리의 직업을 그렇게 예술적으로 만드는 것이라고 생각하지 않습니까? 다른 엔지니어들이 똑같이 작동한다고 상상할 수 없습니다. 건축가가 벽돌과 모르타르를 채우고가는 길에 건물 / 교량을 설계한다고 상상해보십시오.
Laiv

5
@Laiv "코딩"다른 엔지니어 분야에서 무엇의 일부 입니다 디자인했다. 주택 건축에서 설계에서 최종 제품까지의 단계는 필링 벽돌과 박격포를 사용하여 수행됩니다. 프로그래밍에서이 단계는 설계 (= 프로그램)를 최종 제품 (= 실행 가능한 바이너리)으로 변환 할 때 컴파일러가 수행합니다. 그리고 그것은 새로운 지혜가 아닙니다. 리브스 수필은 25 살입니다.
Doc Brown

@DocBrown, 개발자입니다. * 더 이상 선별되지 않습니까? 예를 들어 구독 버튼이 깨졌습니다.
radarbob

답변:


20

하향식 폭포 스타일 OOAD는 작성하는 코드가 객체 지향적임을 보장하지 않습니다. 나는 그것을 엄격하게 OOAD 생산 코드의 산을 보았다. OO가 혼란 스러우면 여기에서 도움을 요청하지 마십시오. 당신은 그것을 찾을 수 없습니다. OO는 하향식으로 디자인 할 필요가 없습니다.

수업에 뛰어 드는 것이 코딩을 좋아하는 방법이라면 그렇게하십시오. 힌트를 드리겠습니다. 미루다.

아직 존재하지 않을 때에도 클래스를 사용하는 코드를 작성하여 클래스를 디자인하는 것이 얼마나 쉬운 지 놀랍습니다. 절차를 잊어 버리십시오. 구조를 잊어 버리십시오. 일관된 추상화 수준을 유지하고 준수하십시오. 유혹에 빠지지 말고 추가 세부 사항을 섞어보십시오. 현재 추상화에서 벗어나는 것은 어떤 방법 으로든 알아야 할 다른 객체에있을 수있는 방법으로 수행 할 수 있습니다. 나에게 넘겨달라고 부탁 할 수있는 것을 만들지 마십시오.

그렇게 쓰는 법을 배우면 열심히 노력하지 않고도 OO를하고 있음을 알 수 있습니다. 그러면 객체의 사용 방식 (인터페이스)과 어떤 객체가 어떤 다른 객체에 대해 알고 있는지에 대한 관점에서 객체를 보게됩니다. 주요 두 포인트가 무엇인지 UML 다이어그램이 무엇인지 아십니까?

그 사고 방식에 들어갈 수 있다면 남은 것은 건축입니다. 우리는 여전히 그것을 이해하고 있습니다. MVC에서 클린 아키텍처, 도메인 기반 설계에 이르기까지. 그들을 공부하고 놀아 라. 작동하는 것을 사용하십시오. 100 % 신뢰할 수있는 제품을 찾으면 다시 알려주세요. 이 작업을 수십 년 동안 해왔으며 여전히 찾고 있습니다.


2
또는 당신은 자신이 OO를하지 않는 것을 발견하지만 어쨌든 "어쨌든"모든 것이 잘 작동합니다 ...
데릭 엘 킨스는 SE

2
"아직 존재하지 않을 때에도 클래스를 사용하는 코드를 작성하여 클래스를 디자인하는 것이 얼마나 쉬운 지 놀랍습니다." -이 하향식 디자인이라고 부르지 만 틀린 것 같습니다. 하향식 디자인이란 무엇이며 내가 그렇게 불렀던 것은 무엇입니까? 인터페이스 프로그래밍입니까?
Piovezan 2016 년

단순히 하향식이 아닙니다. 또한 매개 변수를 수락하여 요청 만 할 수있는 것을 만들지 않으려합니다.
candied_orange 2016 년

@Piovezan 당신은 아직 인터페이스가 존재하지 않는 경우에도 이것을 할 수 있습니다. 컴파일러를 약간 무시하십시오. 나중에, 당신은 그것을 존재하게 만들 것입니다.
candied_orange 2016 년

@CandiedOrange "또한 매개 변수를 수락하여 요구할 수있는 것들을 기꺼이 만들지 않아야합니다." -잘 모르겠습니다. 간단한 예 (또는 해당 문제에 대한 반대 예)를 명확히 / 제공 할 수 있습니까?
Piovezan

4

코드에서 객체 지향 기술을 사용할 수 있다고 주장하므로 객체 지향 시스템을 이미 디자인하는 방법을 알면 문제가 가능한지 여부에 관계없이 때가 더 중요 합니다. 장기 계획 방식이 아닌 단기 반복 방식으로 객체 지향 설계에 익숙해 보입니다.

프로젝트를 처음 개발할 때는 계획 및 설계가 매우 어려울 수 있습니다 . 폭포 계획의 전체 범위가 종종 소프트웨어 프로젝트의 모든 복잡성을 포착하지는 않기 때문에 폭포 개발 보다 애자일 개발 이 선호되는 경우입니다.

"초기 계획"없이 즉시 개발하는 것은 다음과 같습니다.

"... 소프트웨어를 만드는 올바른 방법이 아닙니다 ..."

초기 계획 이 충분히 상세하지 않다는 것이 문제라면 첫 번째 생각을 설명하는 데 약간의 시간이 더 걸립니다. 작성하려는 프로그램첫 부분은 무엇입니까 ? 무엇이 필요 할까요? 아마도 어떤 객체로 시작해야할지 생각하지 않고 거기서 어떤 기능과 계획을 생각해야할지 모릅니다.

문제가 문서화 / 디자인 / UML 기술에 확신이없는 경우 기존 프로젝트를 문서화하여 연습하십시오.

개인적으로 디자인이 객체 지향적이라는 것에 대해 걱정하지 말고 대부분의 시스템은 100 % 객체 지향적이지 않습니다. 목표는 완벽한 추상화가 아니라 시스템을보다 잘 이해하고 시각화하는 것입니다. 객체 지향은 은색 총알이 아니며 벨트의 또 다른 도구 일뿐입니다.


나는 또한 대답에 대한 약간의 주제를 벗어 났지만 언급하고 싶었습니다 ... 당신의 계획은 매우 클 필요는 없습니다! 때로 계획은 "계획을 실행하고 싶습니다"라는 문제 일뿐입니다. 그것만으로도 충분합니다. 그것이 정말로 전부라면 할 것입니다.
Erdrik Ironrose 2012 년

2

OOAD는 유토피아입니다. 그것은 그것이 최선의 접근이라는 것을 의미하지는 않으며, 그것이 나의 겸손한 견해로는 진정으로 달성 할 수 없다는 것을 의미합니다. 내 경험상 요구 사항이나 세부 사항 또는 종속성 충돌로 인해 종속성이 완전히 바뀌도록하는 것이 항상 변경됩니다. 이 방법을 배웠 든 나에게 가장 자연 스럽기 때문에 디자인 아이디어는 코드를 작성할 때 가장 쉽게 나타납니다. 코드를 작성하려고하는데 코드를 어떻게 구성 할 것인지에 대한 명확한 아이디어가 없다면, 문제를 가장 먼저 이해하는 데 시간을 할애해야 할 것입니다. 수업의 필요성과 내가 만들 것입니다.

내 조언은 정면을 사용하여 입력 및 출력을위한 간단한 인터페이스를 제공하는 코드 이며 입력 및 출력이 자주 변경되지 않기를 바랍니다. 비록 그렇게해도 사양 문제 (필요성 / 작동 / 기능의 변화)만큼 디자인 문제가 아님을 알아야합니다. 이렇게하면 프로그램을 호출하는 사람이나 코드 섹션으로 또는 그 반대로 호출하는 사람들에게 프로그램 내에서 공명하는 문제에 대한 프로그램의 저항력이 높아집니다.

객체 지향 시스템을 설계하는 것과 관련하여 모든 것을 객체 지향 으로 만들지 말아야한다고 말해야합니다. 이는 C # 및 Java와 같은 OOP 프로그래밍 언어에서 흔히 발생하는 실수로 모든 것을 객체로 취급하려고 시도하는 경우가 종종 있습니다. 결과적으로 상태를 변경하지 않는 정적 메소드가 무엇인지 수행하기 위해 클래스의 단일 인스턴스를 작성하는 경우가 종종 있습니다. 물론, 가능한 경우 OOP 디자인을 사용해야하지만 정적 메서드를 작성하는 것이 더 자연스러운 느낌이들 때 잘못 생각하지는 않습니다. 항상 잘못된 본능이 아닙니다.

다음 질문에 예라고 대답 할 때 수업 사용을 고려해야합니다.

  • 동일한 개념 (예 : 이름, 성, 주소)과 관련된 정보 그룹이 있습니까?
  • 여러 정보가 필요한 작업을 수행해야 calculatePrice(basePrice, quantity, tax)합니까 (예 :) ?
  • 큰 코드 블록이 동일하거나 유사한 정보로 약간 다른 작업을 수행하는 경우 else가 if(type == "cat") { meow(name); } else if (type == "dog") { bark(name); }있습니까 (예 : ==> animal.speak())
  • 하나 이상의 특정 작업을 수행하고 약간 커지는 기존 수업이 있습니까?

잠시 후, 수업을 만드는 것이 제 2의 천성이 될 것입니다. 위의 경우 중 하나에 해당하는 코드를 사용하는 것을 두려워하지 마십시오. 도움이 되길 바랍니다.


2

의견에서 Doc Brown의 주장은 의견이 절대적으로 옳기 때문에 의견보다 훨씬 더 가시성이 있다고 생각합니다 .

" 지금은 이것이 소프트웨어를 만드는 올바른 방법이 아니라는 것을 알고 있습니다. "-누가 말했습니까? "디자인은 코딩하기 전에해야 할 일이다. 아마도 멋진 UML 다이어그램을 그려서"라고 믿는 인기있는 함정에 빠진 것 같다. 이러한 오해를 예방하기 위해 Jack Reeves의 "Code as Design" 을 시작하는 것이 좋습니다 . – Doc Brown 6 월 21 일 5:27

@Laiv : "코딩"은 다른 엔지니어 분야에서 디자인이라고하는 것의 일부입니다. 주택 건축에서 설계에서 최종 제품까지의 단계는 필링 벽돌과 박격포를 사용하여 수행됩니다. 프로그래밍에서이 단계는 설계 (= 프로그램)를 최종 제품 (= 실행 가능한 바이너리)으로 변환 할 때 컴파일러가 수행합니다. 그리고 그것은 새로운 지혜가 아닙니다. 리브스 수필은 25 살입니다. – Doc Brown 6 월 21 일 6:39

이 같은 감정은 다른 곳에서도 반향됩니다. 글렌 밴더 버그 (Glenn Vanderburg)의 "실제 소프트웨어 엔지니어링 (Real Software Engineering)"과 "크래프트, 엔지니어링 및 프로그래밍의 본질 (Essence of Programming)"및 "크래프트 및 소프트웨어 엔지니어링 (Craft and Software Engineering)"대화에 대해 생각해보십시오 . C2 위키 의 WhatIsSoftwareDesignTheSourceCodeIsTheDesign 페이지 / 토론 도 고려하십시오 .

디자인이라는 코드의 개념은 패러다임에만 국한되지 않습니다. 그것은 객체 지향적, 기능적, 절차 적, 논리 또는 다른 것에 동등하게 적용될 수있다. 기본 아이디어는 동일합니다. 디자인은 소스 코드 자체입니다. 구성 행위는 인터프리터 또는 컴파일러에 의해 소스 코드 (디자인)가 사용 가능한 것으로 바뀌는 프로세스입니다.

복잡한 시스템에서는 코드 작성을 시작하기 전에 하위 시스템, 구성 요소, 모듈, 서비스를 식별하고 요구 사항을 할당하는 수준이 높은 아키텍처 설계가있을 수 있습니다. UML을 사용하여이 아키텍처 설계에 대한 토론을 작성, 문서화 및 토론 할 수 있습니다. 의 아이디어 고려 UML 모드 마틴 파울러에 나와있는 그 , 특히 스케치로 UML주의 사항 등 UML . 또한 Agile Modeling- Initial Architecture Modeling , Iteration ModelingJust Barely Good Enough 모델의 아이디어도 고려하십시오 .

이 모든 것은 소프트웨어를 빌드하는 올바른 방법이 전체 프로젝트를 육체 화하지 않는 것을 의미합니다. 가장 중요한 (현재 시점의) 요구 사항을 이해하고 요구 사항 간의 기술 종속성 및 장단점을 식별 한 다음 소프트웨어가 부드럽다는 사실을 활용하면 충분한 시간을 할애 할 수 있습니다. 또한 설계를 취하고 무언가를 생산하는 데 드는 비용이 엄청나게 낮다는 것을 알고 있습니다 (특히 설계를 수행하고 다른 많은 엔지니어링 분야에서 무언가를 생산하는 것과 비교할 때). 따라서 디자인 (코딩) 활동을 반복하고 수행 한 작업을 점진적으로 구축하거나 수정하는 것이 얼마나 쉽고 저렴한 지 활용하십시오.


1

OOAD는 엔티티를 식별하고 실제 객체 또는 개념을 어느 정도 추상화로 모델링하는 것에 관한 것입니다. 아직 클래스를 작성하는 대신 처음에는 인터페이스를 작성하는 것이 더 쉬운 것으로 인식 할 것입니다. 아직 인터페이스를 구현할 필요는 없지만 코드는 컴파일됩니다.

OOAD는 시스템에서 큰 모듈로 생각할 가능성을 배제하지 않습니다. 여전히 그렇게 할 수 있습니다. 각 모듈은 일련의 사용자 사례 (사용 사례)를 만족시키기 위해 존재합니다. 이러한 사용자 스토리에는이를 수행하기 위해 협업하는 클래스가 필요합니다.

OO 접근 방식의 한 가지 주요 차이점은 일반적으로 절차 적 사고는 요구 사항을 화면에 매핑하는 반면, OOD는 다른 사람이나 비 OO 방식으로 프론트 엔드를 떠나는 후드에서 발생하는 상황을 생각하는 경향이 있다는 것입니다.

Extreme Programming에는 CRC Cards 라는 기술이 있습니다 . CRC는 "클래스 책임 협력자"를 의미합니다.

기본적으로 분명한 클래스를 식별하고 각각에 카드를 할당합니다. 수업 Invoice에 자체 카드가 있다고 가정 해보십시오 .

모든 카드 소지자 클래스에 대해 해당 클래스의 책임이 무엇인지를 작성하십시오 (예 : "총 계산") .

또한 모든 카드 소지 수업에 대해 자신의 책임을 수행하기 위해 해당 수업에서 다른 클래스가 무엇을 요구해야하는지 작성합니다. 여기서 당신은 Invoice공동 작업 InvoiceDetail이 필요하다는 것을 알거나 그러한 클래스가 처음에 필요하다는 것을 알 수도 있습니다.

자신이 속한 일부 책임이 Invoce실제로 공동 작업자 중 하나에 속한다 는 것을 알 수 있습니다 .

연습 후 모든 카드는 클래스가되고 모든 책임은 방법이되고 모든 협업 관계는 작곡, 모임 또는 단순한 전화가 될 수 있습니다.

그 운동은 심지어 사업 사람들조차 참여하는 그룹에서 수행 될 수 있고, 또한 이루어져야합니다.

이 기술에 대한 자세한 내용은 다음 링크를 참조하십시오.

http://en.wikipedia.org/wiki/Class-responsibility-collaboration_card

http://www.extremeprogramming.org/rules/crccards.html

CRC 카드의 예 :

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


0

소프트웨어 실무자 커뮤니티로서의 주요 과제 보다 구체적으로 객체 지향 설계 전문가는 모든 문제 / 작업을 프로그래밍 couterpart로 구체화하는 것입니다. 그 것이다 태스크 -로 표시되는 함수 또는 그것이 될 행위자 로서 표현 - 태스크 인터페이스 / 클래스 [OOAD 향해 운전]. 소프트웨어 설계 습관을 발전시키면서 다양한 방법론 / 프레임 워크에 대한 지식을 지속적으로 얻음으로써. 우리의 관점은 객체를 명확하게 분리하고 어떤 객체가 어떤 기능을 수행 할 것인지에 대해 점점 더 정교 해집니다.

주변에 물체가있는 경우 문제를 하위 문제로 분류하는 경우에도 원하는 모든 물체를 완벽하게 제어 할 수 있으므로 편리하게 수행 할 수 있습니다. 또한 객체와 인터페이스에 자연과 목적을 부여 할 수있는 편리함이 있습니다. 문제 진술을 시각화하고 어떤 목적에 어떤 목적 / 기능을 부여 할 수 있는지 생각하면됩니다.

다양한 자동차의 예를 통해 추가 설명을 시도하고 동일한 객체 모델을 시각화하는 두 가지 다른 방법을 강조합니다.

상업용 차량, 소비자 자동차 (산탄, 해치백, 스테이션 왜건) 등 다양한 범주의 자동차에 걸친 자동차 제조업체를 예로 들어 보겠습니다.

제조업체가 범주와 목적을 명확하게 구분하려면 클래스를 만들 수있는 여러 가지 방법이 있습니다.

차량 제조업체 OOAD

  1. 차량의 범주 (시장 부문) 기준 : 대형 차량, 소비자 차량 [세단, 해치백, 스테이션 왜건 등]

  2. 엔진 용량 및 주행 방식 : 800-1500 CC,> 1500 CC 등

제조업체 가 이러한 각 분류에 속하는 객체에 개별적으로 기능 을 부여 할 수있는 최선의 방법으로 적절한 기본 객체 설계를 선택하고 그 위에 모델을 구축 할 수 있습니다.


당신은 괜찮아 시작하지만 마지막 비트는 OOD가 비슷한 행동을 그룹화하는 것보다 물건을 분류하는 것에 대한 오해처럼 보입니다.
피트 Kirkham
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.