design - 비유 - 절차지향




어떻게 객체 지향 프로젝트를 디자인합니까? (16)

나는 많은 수업을 할 수 있고 확장 할 필요가있는 커다란 프로젝트를 위해 일하고있다. 그러나 내 프로그램을 계획하는 방법과 수업이 어떻게 상호 작용해야하는지 잘 모르겠다.

나는 OOD 과정을 몇 학기 전에 되찾았고 그것으로부터 많은 것을 배웠다. UML 작성, 요구 사항 문서를 객체와 클래스로 변환하는 것과 같다. 우리는 시퀀스 다이어그램도 배웠지 만, 어쨌든 나는 강의 나 어떤 것을 놓쳤다. 그들은 정말로 나와 함께하지 않았다.

이전 프로젝트를 통해 나는 과정에서 배운 방법을 사용해 보았지만 일반적으로 "내가 마음에있는 것과 비슷한 것을 보았습니다."라고 말할 수있는 코드로 끝납니다. 추가 할 진흙을 파고 싶지는 않습니다. 새로운 기능.

나는 스티브 맥코넬 (Steve McConnell)의 코드 컴플리트 (Code Complete) 사본을 가지고 있는데, 내가 계속 듣는 곳은 여기와 다른 곳에있다. 나는 디자인에 관한 장을 읽었고 내가 찾고있는 정보로 나오지 않는 것 같았다. 나는 그가 컷 앤 드라이 프로세스가 아니라 휴리스틱 스를 기반으로한다고 말하지만 모든 정보를 취하여 프로젝트에 적용 할 수는없는 것 같습니다.

그렇다면 높은 수준의 설계 단계 (프로그래밍을 시작하기 전에)에서 필요한 클래스 (특히 '실제 객체'를 기반으로하지 않는 클래스)와 상호 작용 방법을 결정하는 것은 무엇 입니까?

특히 나는 당신이 사용하는 방법이 무엇인지에 관심이 있습니까? 당신이 따르는 과정은 보통 최종 제품을 가깝게 표현할 좋은 청결한 디자인을 보여줍니다.


  1. 학습 및 마스터 디자인 패턴.
  2. 다음으로 도메인 기반 디자인에 대해 배웁니다.
  3. 그 후 요구 사항 수집을 배우십시오.

나는 OOD 과정을 몇 학기 전에 되찾았고 그것으로부터 많은 것을 배웠다. UML 작성, 요구 사항 문서를 객체와 클래스로 변환하는 것과 같다. 우리는 시퀀스 다이어그램도 배웠지 만, 어쨌든 나는 강의 나 어떤 것을 놓쳤다. 그들은 정말로 나와 함께하지 않았다.

  1. 3 단계를 알았습니까? 마스터해야합니다. 내 말은, 당신의 두 번째 성격이되는 많은 연습을 통해 말입니다. 왜냐하면 당신이 배우는 방법은 단순히 우리가 가지고 있었던 방식에 위배되기 때문입니다. 그래서 당신은 그것을 실제로 습득해야합니다. 그렇지 않으면, 당신은 항상 자신이 원래 일을하는 방식으로 돌아 간다는 것을 알게 될 것입니다. 이것은 테스트 주도 프로세스 (Test Driven Process)와 비슷합니다. 많은 Java 개발자가 몇 번 시도한 후에이를 포기합니다. 그들이 완전히 마스터하지 않는 한, 그렇지 않으면 단지 그들에게 부담이됩니다.

  2. 유스 케이스를 작성하십시오 (특히 대체 코스의 경우). 대체 코스는 개발 시간의 50 % 이상을 차지합니다. 일반적으로 PM이 작업을 할당 할 때, 예를 들어 로그인 시스템을 만들면 똑바로 생각할 것입니다. 끝내려면 하루가 걸릴 수 있습니다. 그러나 사용자가 틀린 암호를 입력하면 어떻게 될 것인가? 2. 사용자가 잘못된 암호를 3 번 ​​입력하면 어떻게 될 것인가? 3. 사용자 이름 등을 입력하지 않으면 어떻게 될까? 그들을 나열하고 PM에게 보여 주어야하며 마감일을 다시 정하도록 요청하십시오.


기회가 생겼을 때 나는 보통 "3 번의 반복 규칙"을 사용합니다.

첫 번째 반복 (또는 시작)에서는 모델 객체, 알고리즘 및 예상되는 ( 실제로는 예상되지는 않지만 예상되는) 미래 방향에 따라 응용 프로그램의 일반 레이아웃을 고안합니다. 필자는 설계 문서를 작성하지 않지만 여러 사람을 조율해야하는 경우에는 필요한 시간에 대한 종속성 및 추측과 함께 절차의 대략적인 스케치가 필요합니다. 나 같은 민첩한 방법을 선호한다면이 단계를 최소한으로 유지하십시오. 강력한 디자인 단계가 필요한 경우가 있습니다. 특히 프로그램의 논리에 대해 모든 것이 알려져 있고 사실 일 때, 그리고 코드의 기능간에 많은 상호 작용을 계획하는 경우가 있습니다. 이 경우 유스 케이스 또는 사용자 스토리는 특히 GUI 애플리케이션의 경우 높은 수준의 아이디어를 제공합니다. 명령 줄 응용 프로그램 및 특히 라이브러리의 경우 개발해야하는 라이브러리에 대해 코드를 작성하고 모양을 확인하는 "프로그램 스토리"를 작성하십시오. 이러한 프로그램은 완료되면 라이브러리의 기능 테스트가됩니다.

이 첫 번째 반복이 끝나면 사물이 어떻게 상호 작용하는지, 세부 사항과 거친 부분을 파악하고, 찢어진 덕트 테이프 패치로 해결 된 문제에 대해 더 잘 이해하게됩니다. 이 경험을 사용하여 너무 컸던 부분을 개선하고, 청소하고, 연마하고, 분할하고, 너무 조각난 것을 결합하고, 디자인 패턴을 정의 및 사용하고, 성능 병목 현상과 중요하지 않은 보안 문제를 분석 할 준비가되었습니다. 일반적으로이 모든 변경 사항은 사용자가 쓴 단위 테스트에는 큰 영향을 미치지 만 기능 테스트에는 큰 영향을 미치지 않습니다.

이 두 번째 반복을 완료하면, 당신은 작은 보석을 가지고, 잘 테스트되고, 잘 문서화되고 잘 디자인 될 것입니다. 이제 세 번째 반복을 수행 할 경험과 코드가 모두 있습니다. 새로운 기능과 사례를 추가하여 응용 프로그램을 개선 할 수 있습니다. 거친 부분을 발견하게되고 결국 두 번째 반복과 유사한 네 번째 반복을 입력하게됩니다. 린스하고 반복하십시오.

이것은 소프트웨어 설계에 대한 나의 일반적인 접근 방식입니다. 이는 나선형 디자인과 유사하며 짧은, 3 개월 반복 및 애자일 개발 요소를 통해 문제를 학습하고 소프트웨어 및 응용 분야를 알 수 있습니다. 물론 확장 성의 문제이기 때문에 애플리케이션이 너무 커서 수백 명의 개발자가 참여할 수없는 경우 상황은 이보다 약간 복잡하지만 궁극적으로 아이디어는 항상 같다고 생각합니다.

그래서 요약하는 것 :

  1. 반복 1에서, 당신은 그것의 맛을 얻고, 배우게됩니다.
  2. 반복 2에서는 제품을 정리하고 미래에 대비할 준비를합니다.
  3. 반복 3에서 새로운 기능을 추가하고 자세히 알아보십시오.
  4. 2로 이동

나는 아직 코멘트를하기에 충분한 평판을 얻지 못했다. (오늘 가입했다.) Scott Davies의 대답에 대해서만 언급 할 것이다. 그가 한 말에 덧붙여서 :

  1. 프로그램을 시작하기 전에 프로그램이 무엇인지 파악하십시오. 당신의 프로그램 무엇입니까? 그것은 무엇을하지 않을 것인가? 문제는 해결하려고합니까?

  2. 첫 번째 사용 사례는 프로그램이 결국 수행 할 모든 항목의 목록이 아니어야합니다. 가장 작은 세트의 유스 케이스부터 시작해 볼 수 있습니다.이 케이스는 여전히 프로그램의 본질을 파악합니다. 예를 들어,이 웹 사이트의 경우 핵심 사용 사례로 로그인하고 질문을하고 질문대답하며 질문과 대답을 볼 수 있습니다 . 평판, 투표 또는 커뮤니티 위키에 대한 정보는 없습니다.

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

  4. 최소한의 유스 케이스와 객체 세트를 얻었 으면 코딩을 시작하십시오. 가능한 한 빨리 실행되는 무언가를 얻으십시오. 그것은 출발점이며, 종이에 광택을 칠할 수있는 질문에 대한 대답을 강요합니다.

  5. 이제 돌아와 유스 케이스를 선택하고, 작동 방식을 기록하고, 클래스 모델을 수정하고, 더 많은 코드를 작성하십시오. 첫 번째 커트와 마찬가지로, 의미있는 것을 추가하면서 가능한 한 적은 시간 만 사용하십시오. 린스하고 반복하십시오.

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


나는 여기서 묻는 질문에 대한 실제 경험에 따라 대답이 달라져야한다고 생각한다.

1 ~ 2 년의 경력이있는 경우 다음과 같은 요점을 반드시 따라야합니다. 실제로 데이터를 알고있는 지점까지 어떻게 도달 했습니까? 정확히 무엇을하려고하는지 이해하십시오.

예, 5 년 이상 근무한 고객이라면 많은 소프트웨어 개발 프로세스 모델이나 기술 중에서 선택할 수 있습니다.

그러나 당신은 책을 읽음으로써 경험을 얻지 못합니다. 훌륭한 리더십 아래 좋은 그룹에서 일함으로써 배우는 것이 좋습니다.

그게 가능하지 않다면 당신은 혼자서해야합니다. 아마도 매우 불쾌한 코드 조각을 코딩하고, 오류를 학습하고, 모든 것을 버리고, 더 나은 코드를 코딩하는 등의 반복 작업을 시작하십시오.

코드베이스에 대해 많은 것을 배우게됩니다. 도구는 도구이므로 아무것도 가르쳐주지 않습니다.


당신은 많은 저자들이 책을 쓸 때 사용하는 질문을했습니다. 방법론의 번호가 있으며 당신에게 "가장 예쁜"것으로 보이는 것을 골라야합니다.
에릭 에반스 (Eric Evans)가 저술 한 "도메인 주도 디자인 (Domain Driven Design)" 을 추천 할 수 있습니다. 또한 사이트 dddcommunity.org 확인하십시오.


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

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

그런 다음에 만 특정 구성 요소를 확대하여 디자인하려고합니다. 이제 우리는 디자인 패턴과 클래스 다이어그램 수준에 있습니다. 프로젝트의이 부분에 초점을 맞추십시오. 다른 구성 요소 중 하나에 책임을 추가해야하는 경우 문서 / 할 일 목록에 추가하십시오. 시간이 지나치게 빨리 변하고 디자인이 더 견고 할 때 검토하십시오.

이 시점에서 각 구성 요소를 완전히 디자인 할 필요는 없지만 구현되지 않은 구성 요소 인터페이스를 구현하는 코드를 사용하는 것이 현명하고 간단하지만 유용한 응답을 생성합니다. 이렇게하면 한 번에 하나의 구성 요소를 개발 (및 디자인)하고 합리적인 정도로 테스트 할 수 있습니다.

물론 새 구성 요소가 완성되면 이동하기 전에 서로 통합하는 방법을 테스트해야합니다.

매우 짧게 : OO 및 정보 숨기기 원칙을 취하여 다른 수준으로 끌어 올립니다!

추신 : 디자인하는 동안 많은 스케치를해야합니다. 실제 건축물과 같습니다!

조달청 : 다른 각도에서 사안에 접근하고 상자 밖에서 생각해보십시오 (상자가 갈 수있는 방법 일지라도) 동료와 토론하면이 작업에 매우 유용 할 수 있습니다 ... 점심 식사에 관해 이야기 할 항목이 있습니다.


솔직히, 좋은 단계는 흐름 차트 및 시퀀스 다이어그램을 살펴볼 것입니다. 당신에게 그것을하는 방법을 보여주는 좋은 사이트 톤이 있습니다. 프로그램을 입력하고, 계산하고, 출력하고, 각 단계를 프로그램의 한 부분으로 나눌 수있는 것을 정확히 알고있는 상황에서 어떻게하면 프로그램을 수업으로 나누고 싶은지를 볼 때 귀중한 것입니다.


우선 - 디자인은 당신의 영혼으로부터옵니다. 당신은 당신의 모든 섬유질에 의해 그것을 느껴야합니다. 나는 무엇이든을하기 시작하기 전에 일반적으로 2 ~ 3 개월 동안 걷고, 그냥 거리를 걸어가 (정말로). 그리고 생각. 걷는 것은 좋은 명상입니다. 그래서 당신이 잘 집중할 수있게 해줍니다.

둘째 - 자연 개체 계층이있는 곳에서만 OOP 및 클래스를 사용합니다. 그것을 인위적으로 '끼워 넣지 마라'. 엄격한 계층 구조가 없으면 (대부분의 비즈니스 응용 프로그램과 마찬가지로) 절차 적 / 기능적으로 이동하거나 격리 된 접근자를 가진 데이터 컨테이너로만 객체를 사용하십시오.

그리고 마지막으로 이것을 읽으십시오 : 창조적 사고의 알고리즘


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

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

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

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


초기 디자인 (클래스 다이어그램에 표시)에 사용하는 단계는 다음과 같습니다.

  1. 요구 사항 수집. 클라이언트에게 이야기하고 유스 케이스를 분석하여 소프트웨어가 가져야하는 기능을 정의하십시오.

  2. 개별 유스 케이스의 내러티브를 작성하십시오.

  3. 내러티브를 살펴보고 명사 (사람, 장소, 사물)를 방법 / 행동으로 후보 수업과 동사 (행동)로 강조 표시하십시오.

  4. 중복 된 명사를 삭제하고 공통된 기능을 제외하십시오.

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

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


프로젝트에 대한 도메인 전문 지식을 보유하고 있다면 뱅킹과 같은 방식으로 작업 할 것입니다. 개체를 쉽게 구조화 할 수 있으며, 그 기능 향상은 매일 같이 이루어집니다.

그 전문 기술을 가지고 있지 않은 사람은 그 전문 지식을 가진 사람과 함께 작업하고 그러한 아이디어를 기술적 세부 사항으로 변환하십시오.

프로젝트 디자인을 구성하는 방법에 대해 혼란스러워하는 경우. 미심쩍은 "실용적인 프로그래머"책을 따라라. 나는 같은 상황에 처해 있었고 그 책에서 한 장을 읽으려고했다. 당신은 차이점을 볼 것입니다, 그것은 당신이 소프트웨어 개발자로서 생각하는 방식을 바꿀 것입니다.


합리적인 성공을 거둔 실제 프로젝트에서 사용한 기술은 Wirfs-Brock의 저서에서 영감을 얻은 책임 중심 설계입니다.

최상위 수준의 사용자 이야기로 시작하고 동료와 함께 화이트 보드에서 암시하는 높은 수준의 상호 작용을 스케치합니다. 이렇게하면 큰 모듈이 무엇인지에 대한 첫 번째 아이디어를 얻을 수 있습니다. 그리고 당신이 주요 구성 요소의 목록, 그들이하는 일 및 그들이 상호 작용하는 방식을 안정화시켜야하는 놀이와 같은 고수준 CRC 카드 반복 또는 두 가지.

그런 다음 책임이 크거나 복잡하면 상위 수준의 상호 작용에 의해 식별되는 주요 작업 각각에 대해 모듈 내부의 상호 작용을 재생하여 작고 단순한 물건을 가질 때까지 모듈을 수정하십시오 .

언제 멈출지를 아는 것은 판단의 문제입니다 (경험과 함께 제공됨).


BlueJ 와 ActiveWriter를 사용하여 배우고 또한 객체에 대한 이해를 높이는 것이 좋습니다. 추천 도서도 훌륭한 자료입니다.

Wikipedia :

BlueJ는 Java 프로그래밍 언어를위한 통합 개발 환경으로 주로 교육 목적으로 개발되었지만 소규모 소프트웨어 개발에도 적합합니다.

또한 UML을 사용하며 나에게 객체 모델링에 대한 몇 가지 사항을 이해하는 데 도움이되었다.

대체 텍스트 http://www.ryanknu.com/ryan/bluej.png

ActiveWriter 는 엔터티와 관계를 모델링하는 도구이며, 코드를 생성하고 변경하기 쉽습니다. 그것은 당신에게 시간을 절약 할 것이고 민첩한 개발은 매우 적합합니다.

대체 텍스트 http://altinoren.com/activewriter/Images/Introduction_1.png


http://www.fysh.org/~katie/computing/methodologies.txt 인용하면됩니다 http://www.fysh.org/~katie/computing/methodologies.txt

RUP의 핵심은 객체 지향 디자인 재능을 사용해야하는 작은 영역입니다. 만약 당신이 그것을 가지고 있지 않다면 100m를 돌리는 방법론을 가지고있는 것과 같습니다.

"1 단계 : 정말로 빠른 달리기에 대해 써라. 2 단계 : 경마장의 계획을 세워라. 3 단계 : 정말로 단단한 라이크라 반바지를 사라. 4 단계 : 정말로, 정말로, 정말로 빠르다. "

그것은 어려운 단계 인 4 단계입니다. 그러나 1, 2, 3, 5에 중점을두면 아무도 눈치 채지 못하게 될 것입니다. 그리고 아마도 100m가되기위한 "비밀"이 있다고 생각하는 운동 선수가 될 수있는 방법론을 판매하는 데 많은 돈을 벌 수 있습니다. 주자


디자인 패턴을 배웁니다 . OOP에 관한 지난 2 년 동안의 나의 개인 혁명이었습니다. 책 가져와. 나는 당신에게 이것을 추천 할 것이다 :

헤드 퍼스트 디자인 패턴

자바로되어 있지만 어떤 언어로도 확장 가능합니다.


유용한 기술 중 하나는 고유 한 문제 설명을 실제 세계에서 찾을 수있는 것과 관련시키는 것입니다. 예를 들어, 폭풍으로 세계를 지배 할 복잡한 의료 시스템을 모델링하고 있습니다. 이 모델을 만들기 위해 쉽게 호출 할 수있는 예제가 있습니까?

과연. 옆 약국이 어떻게 운영되는지, 또는 의사의 방을 관찰하십시오.

도메인 문제를 이해할 수있는 것으로 가져 오십시오. 당신이 관련시킬 수있는 어떤 것.

그런 다음 도메인 내의 "플레이어"가 분명하게 나타나기 시작하고 코드를 모델링하기 시작하면 코드가 모델의 "공급자"이고 사용자가 "소비자"인 "공급자 - 소비자"모델링 방식을 선택합니다 ".

도메인과 관련하여 높은 수준에서 그것을 이해하는 것은 모든 디자인의 핵심 부분입니다.







class-design