[architecture] 객체 지향 프로젝트를 어떻게 디자인합니까? [닫은]

많은 클래스가 있고 확장 가능 해야하는 큰 프로젝트 (나를 위해)를 작업하고 있지만 프로그램 계획 방법과 클래스 상호 작용 방법을 잘 모르겠습니다.

몇 학기 동안 OOD 과정을 수강하고 많은 것을 배웠습니다. UML 작성 및 요구 사항 문서를 오브젝트 및 클래스로 변환하는 것과 같습니다. 우리는 시퀀스 다이어그램을 배웠지 만 어떻게 든 강의 또는 무언가를 놓쳤습니다.

이전 프로젝트에서 나는 코스에서 배운 방법을 사용하여 시도했지만 일반적으로 “그래, 내가 생각했던 것과 비슷해 보인다”라고 말하자마자 나는 멍청이를 파고 싶지 않다. 새로운 기능.

Steve McConnell의 Code Complete 의 사본이 있습니다. 나는 디자인에 관한 장을 읽었고 내가 찾고있는 정보를 얻지 못하는 것 같습니다. 나는 그것이 절단되고 건조 된 과정이 아니며, 대부분 휴리스틱을 기반으로한다는 것이지만, 그의 모든 정보를 취하여 내 프로젝트에 적용 할 수는없는 것 같습니다.

따라서 높은 수준의 디자인 단계 (프로그래밍을 시작하기 전에) 중에 필요한 클래스 (특히 실제 객체를 기반으로하지 않는 클래스)와 이들이 어떻게 상호 작용할 것인지를 결정하기 위해 수행하는 작업은 무엇 입니까?

특히 나는 당신이 사용하는 방법에 관심이 있습니까? 일반적으로 최종 제품을 밀접하게 나타내는 훌륭하고 깨끗한 디자인을 따르는 프로세스는 무엇입니까?



답변

초기 설계 (클래스 다이어그램으로 가져 오기)에 사용하는 단계는 다음과 같습니다.

  1. 요구 사항 수집. 클라이언트와 대화하고 사용 사례를 고려하여 소프트웨어의 기능을 정의하십시오.

  2. 개별 사용 사례에 대한 설명을 작성하십시오.

  3. 내러티브를 살펴보고 후보 클래스 및 동사 (동작)로서 명사 (사람, 장소, 사물)를 방법 / 행동으로 강조 표시합니다.

  4. 중복 명사를 폐기하고 공통 기능을 제거하십시오.

  5. 클래스 다이어그램을 작성하십시오. Java 개발자 인 경우 Sun의 NetBeans 6.7에는 다이어그램 엔지니어링 및 왕복 엔지니어링이 가능한 UML 모듈이 있으며 무료입니다. Eclipse (오픈 소스 Java IDE)에는 모델링 프레임 워크가 있지만 경험이 없습니다. 오픈 소스 도구 인 ArgoUML을 사용해 볼 수도 있습니다.

  6. OOD 원칙을 적용하여 수업 구성 (공통 기능 제외, 계층 구조 구축 등)


답변

Scott Davies가 말한 내용에 추가 :

  1. 시작하기 전에 프로그램의 내용을 반드시 확인하십시오. 당신의 프로그램 무엇입니까 ? 그것은 무엇을 할 수 없습니다 합니까? 어떤 문제를 해결하려고합니까?

  2. 첫 번째 유스 케이스는 프로그램이 결국 수행 할 모든 것의 세탁 목록이되어서는 안됩니다. 프로그램의 본질을 그대로 담아내는 가장 작은 유스 케이스로 시작하십시오. 예를 들어이 웹 사이트의 경우 핵심 사용 사례는 로그인 , 질문, 질문대한 답변질문과 답변을 볼 수 있습니다 . 평판, 투표 또는 커뮤니티 위키에 관한 것은 아니며 촬영 대상의 본질입니다.

  3. 잠재적 인 수업을 할 때, 그들이 어떤 명사를 대표하는지에 대한 것이 아니라 그들이 어떤 책임을 가지고 있는지에 대해서만 생각하십시오. 나는 이것이 프로그램 실행 중에 클래스가 서로 어떻게 관련되는지 알아내는 데 가장 큰 도움이된다는 것을 알았습니다. “개는 동물이다”또는 “강아지는 한 마리의 어머니가있다”와 같은 관계를 생각해 내기가 쉽다. 일반적으로 객체 간의 런타임 상호 작용을 설명하는 관계를 파악하기가 더 어렵습니다. 당신은 프로그램의 알고리즘이 최소한 객체만큼 중요하며 각 클래스의 직업이 무엇인지 철자하면 디자인하기가 훨씬 쉽습니다.

  4. 최소한의 사용 사례 및 객체 집합을 얻은 후에는 코딩을 시작하십시오. 많은 일을하지 않고 아마도 쓰레기처럼 보이지만 실제로 가능한 빨리 실행되는 것을 얻으십시오. 그것은 시작점이며, 종이 위에서 광택을 낼 수있는 질문에 답하도록 강요 할 것입니다.

  5. 이제 더 많은 유스 케이스를 선택하고 작동 방식을 작성하고 클래스 모델을 수정하고 더 많은 코드를 작성하십시오. 첫 번째 컷과 마찬가지로 의미있는 것을 추가하면서 한 번에 조금만 수행하십시오. 헹구고 반복하십시오.

내 두 센트. 잘하면 유용합니다.


답변

기회가 생겼을 때 나는 보통 “세 개의 반복 규칙”이라고 부르는 것을 사용합니다.

첫 번째 반복 (또는 시작)에서 모델 객체, 알고리즘 및 예상 ( 실제 예상, 아마도 그렇지 않은) 에 따라 응용 프로그램의 일반적인 레이아웃을 고안합니다.예상되는 방향) 디자인 문서를 작성하지는 않지만 여러 사람을 조정해야하는 경우 종속성 분석 및 필요한 시간의 추측과 함께 대략적인 절차 스케치가 필요합니다. 나처럼 더 민첩한 방법을 선호한다면이 단계를 최소한으로 유지하십시오. 강력한 프로그램 단계가 필요한 경우가 있습니다. 특히 프로그램 논리에 대해 모든 것이 알려져 있고 사실이거나 코드의 기능간에 많은 상호 작용을 계획하려는 경우가 있습니다. 이 경우 유스 케이스 또는 사용자 스토리 제공은 특히 GUI 앱에 대한 좋은 아이디어입니다. 명령 줄 앱 및 특히 라이브러리의 경우 개발해야하는 라이브러리에 대해 코딩하고 모양을 확인하는 “프로그램 스토리”를 작성하십시오.

이 첫 번째 반복 후에는 사물이 상호 작용하는 방식, 세부 사항 및 거친 지점을 파악하고 덕트 테이프 패치의 문제를 해결하는 방법에 대해 더 잘 이해할 수 있습니다. 이 경험을 활용하여 너무 큰 것을 개선, 정리, 연마, 분할하고, 너무 조각난 것을 통합하고, 디자인 패턴을 정의 및 사용하고, 성능 병목 현상 및 사소한 보안 문제를 분석 할 수 있습니다. 일반적으로 이러한 모든 변경 사항은 작성한 단위 테스트에는 큰 영향을 주지만 기능 테스트에는 큰 영향을 미치지 않습니다.

이 두 번째 반복을 완료하면 작은 보석, 테스트, 문서화 및 디자인이 잘됩니다. 이제 세 번째 반복을 수행하는 경험과 코드가 모두 확장되었습니다. 새로운 기능과 사용 사례를 추가하여 응용 프로그램을 향상시킵니다. 거친 지점을 찾을 수 있으며 결국 두 번째 반복과 유사한 네 번째 반복으로 들어갑니다. 헹구고 반복하십시오.

이것이 소프트웨어 설계에 대한 일반적인 접근 방식입니다. 짧은 3 개월 반복 및 Agile 개발 요소가 포함 된 나선형 디자인과 유사하여 문제를 배우고 소프트웨어와 해당 응용 분야를 알 수 있습니다. 물론, 어플리케이션 개발자 수백 상황이 조금 더 복잡이보다 참여 너무 커서 그렇다면, 확장 성의 문제, 그러나 결국 나는 아이디어가 항상 같은, 추측 분할 등의 impera .

요약하자면 :

  1. 반복 1에서, 당신은 그것을 맛보고 배우고
  2. 두 번째 반복에서는 제품을 정리하고 미래를 위해 준비합니다
  3. 세 번째 반복에서는 새로운 기능을 추가하고 더 많은 정보를 얻습니다.
  4. 고토 2

답변

이것에 관해 내가 아는 가장 흥미로운 소스는 Bertrand Meyer 의 Object Oriented Software Construction, Part 2 의 Part D입니다 .

파트 D : 객체 지향 방법론 : 방법을 잘 적용

19 : 방법론, 20 : 디자인 패턴 : 다중 패널 대화식 시스템, 21 : 상속 사례 연구 : 대화식 시스템에서 “실행 취소”, 22 :
클래스를 찾는 방법 , 23 : 클래스 디자인의 원칙, 24 : 상속 잘 사용 , 25 : 유용한 기술, 26 : 스타일 감각, 27 : 객체 지향 분석, 28 : 소프트웨어 구성 프로세스, 29 : 방법 교육

흥미롭게도 22 장 . 수업을 찾는 방법 은 온라인에서 볼 수 있습니다.


답변

반복되는 것은 아니지만 완전히 사실입니다. 데이터를 이해하십시오.

OOP의 경우 클래스는 중요한 정보와 상호 작용 방식을 설명해야합니다.

데이터의 행동과 수명을 잘 설명하는 정신 모델이 있다면 수업을 쉽게 펼칠 수 있습니다.

이것은 단순히 다음의 확장입니다. 무엇을하려고하는지 정확히 아십시오.


답변

행동 중심 개발을 사용해보십시오. 당신의 오래된 습관을 깰 수는 없지만, BDD는 실제 세계에서 발전 할 때 가장 좋은 방법이라는 것을 알았습니다.

http://behaviour-driven.org/


답변

대규모 프로젝트의 문제점은 컴포넌트 간의 모든 상호 작용을 감독 할 수 없다는 것입니다. 따라서 프로젝트의 복잡성을 줄이는 것이 중요합니다. 이 단계의 설계에서는 클래스 및 시퀀스 다이어그램이 너무 상세합니다.

먼저 더 높은 추상화 수준에서 생각하십시오. 주요 구성 요소와 그 책임 (다른 구성 요소와의 인터페이스)에 대해 생각하고 영감을 얻기위한 일부 아키텍처 패턴을 살펴보십시오 (디자인 패턴이 아니라 너무 낮은 수준입니다. MVC 및 다중 계층은 아키텍처 패턴의 예입니다). 합리적으로 큰 프로젝트의 경우 이러한 뷰에는 약 3-5 개의 구성 요소가 있어야합니다.

그런 다음에야 특정 구성 요소를 확대하여 디자인하려고합니다. 이제 우리는 디자인 패턴과 클래스 다이어그램의 수준에 있습니다. 다른 구성 요소 중 하나에 책임을 추가해야하는 경우 프로젝트의이 부분에 집중하십시오. 문서 / 할 일 목록에 추가하십시오. 이 시점에서 그것들이 너무 빨리 변하는 의미에 대해 생각하면서 시간을 낭비하지 말고 디자인이 더 견고한시기를 검토하십시오.

아직 구현되지 않은 구성 요소 인터페이스를 구현하고 간단하지만 유용한 응답을 생성하는 코드 조각을 갖는 것이 현명하지만이 시점에서 각 구성 요소를 완전히 디자인 할 필요는 없습니다. 이런 방식으로 한 번에 하나의 구성 요소 개발 (및 설계)을 시작하고 적절한 수준으로 테스트 할 수 있습니다.

물론 새 구성 요소가 완성되면 계속 진행하기 전에 구성 요소가 서로 어떻게 통합되는지 테스트해야합니다.

간단히 말해서 : OO와 정보 은닉 원칙을 취하여 다른 차원으로 끌어 올리십시오!


추신 : 디자인하는 동안 많은 스케치를하십시오. 실제 아키텍처와 같습니다!

PPS : 다른 각도에서 문제에 접근하려고 노력하십시오. 상자 밖에서 생각하십시오 (상자가 갈 길이지만), 동료와 논의하는 것이 매우 유용 할 수 있습니다 … 그리고 점심 식사에 대해 이야기 할 것이 있습니다.