객체 지향 사고 과정은 무엇입니까? [닫은]


9

지난 몇 달 동안 Zend의 MVC 구현과 관련하여 OOP를 연구했습니다. 나는 프로그래밍에 익숙하지 않다. 그러나 나는 '올바른'방식으로 사물을 배워야한다고 강하게 느낀다. 이는 내가 일이 그 방식대로 이루어 졌는지 이해하도록하는 것을 의미한다 . 즉, 나는 무언가를하는 법을 배우는 것 (무엇이든, 음악을 말하는 것)에서 무언가를하는 법을 배우는 가장 좋은 방법은 왜 처음에 왜 그렇게했는지 아는 것입니다.

어쨌든, 나는 내 자신의 비즈니스 모델 (MVC의 M)을 개발하는 방법을 이해하는 데 매우 어려움을 겪었고 OOP를 일반적으로 이해하지 못하기 때문에 그렇지 않다고 결정했습니다. 몇 달간 나는 개념을 이해하기가 매우 어렵다고 생각하지 않습니다. 실제로 매우 직관적으로 연구 한 예를 찾습니다. 내 생각에 문제는 내 자신의 문제를 객체 지향 솔루션으로 변환하는 과정에 있다고 생각합니다. 지금까지 읽은 책의 예제는 너무 분명하므로 문제를 객체로 변환하는 프로세스는 그리 어렵지 않습니다. 내가 놓칠 수 있다고 생각하는 것은 고급 추상 프로세스입니다. 모든 객체 지향 솔루션이 최고 수준으로 답변해야하는 단계 또는 질문 목록.

그러한 프로세스를 5 단계 이하로 설명해야한다면 그 과정은 무엇이며 왜 그런가? 문제를 객체 지향 솔루션으로 변환 할 때 가장 효과적인 프로세스는 무엇입니까?


1
OOP는 항상 그 모든 것을 ...
Job

OOP를 공부하면서 아직 디자인 패턴 에 대해 읽은 적이 있습니까?
Zoredache

1
모델을 만드는 데 어려움이있을 때 도메인 기반 디자인에 관한 Eric Evan의 책 을 읽는 것이 좋습니다 . @Simon Stellings answer도 참조하십시오. 이 책은이 과정을 아주 자세하게 다룹니다.
팔콘

@Zoredache 저는 싱글 톤, 팩토리 및 MVC와 같은 디자인 패턴의 개념뿐만 아니라 Zend의 구현에서도 프론트 컨트롤러 인 몇 가지 예를 보았습니다. 그러나 그것은 나의 다음 행동이었습니다. 엔터프라이즈 패턴에 대한 Martin Fowler의 책을 집어 들고 지금까지 소개의 일부만 읽었습니다. 당신이 추천하는 명확하고 읽기 쉬운 소개입니까?

@Falcon 다른 날에 php / MySQL 및 날짜 형식에 대한 질문이 있었고 귀하의 답변을 선택했지만 가치있는 것에 대한 의견 일뿐입니다.

답변:


10

적합한 모델을 찾는 것이 항상 쉬운 것은 아닙니다. 그것은 평범한 지식보다 더 많은 경험을 요구하는 것들 중 하나입니다. 그러나 다음과 같은 간단한 레시피는 초기 정신 차단을 극복하는 데 도움이 될 수 있습니다.

그것은 이 논문에서 Abbott에 의해 원래 설명되었으며 종종 "Abbott의 텍스트 분석"으로 불립니다.

  1. 일반 텍스트 사양을 작성하십시오.
  2. 수업 식별 : 명사 는 좋은 후보입니다.
  3. 속성 찾기 : 형용사 / 부사 는 좋은 후보입니다.
  4. 연산 찾기 : 동사 는 좋은 후보입니다.
  5. 클래스 간의 연관성을 찾으십시오 .
  6. 다듬다.

예:

명사 , 동사 와가 adjectives표시됩니다.

라이브러리가 포함되어 저널을 . 주어진 책의 사본 이 여러 있을 수 있습니다 . 일부 대출 전용입니다. 다른 모든 책이 될 수있다 빌려 어떤으로 라이브러리 멤버 3 주 동안. 도서관 회원은 일반적으로 한 번에 최대 6 개의 항목 을 빌릴 수 있지만 직원 은 한 번에 최대 12 개의 항목빌릴 수 있습니다 . 교직원저널을 빌릴 수 있습니다 .short-term

첫 번째 분석 반복은 다음과 같습니다.

클래스:

  • 도서관
  • 책, 일지
  • 차관
  • 도서관 회원
  • 안건
  • 직원

이제부터는 어떤 클래스가 동작을 구현하기 위해 어떤 속성과 메소드를 필요로하는지 생각한 다음 해당 모델을 점점 더 세분화 할 수 있습니다.


1
좋은 대답입니다. Abbott의 논문 외에도 Domain Driven Design에 관한 Eric Evan의 책을 추천 합니다. 프로젝트를위한 유비쿼터스 언어를 만드는 방법과 강력한 모델을 추출하는 방법을 알려줍니다.
팔콘

나는 언어학을 조금 공부했기 때문에이 대답에 끌 렸습니다. 많은 노력없이 나에게 직관적 인 의미가 있지만, 너무 많은 비유가 나를 잃어 버릴 수 있기 때문에 같은 이유로 그것을 두려워합니다. .

Kandinsky의 커버 아트가있는 책을 추천 해 주신 @Falcon +1

@ tbj1982 : 당신 말이 맞아요. 단순한 휴리스틱이며 결과는이를 염두에두고 처리해야합니다. 황금 총알은 아니지만 유용한 출발점이 될 수 있습니다.
blubb

4

제 생각에는 TDD 접근 방식은 자연스럽고 효율적입니다.

  1. 특정 요구 사항을 적어 둡니다 (Given, When, Then)
  2. 각 요구 사항 (가장 중요한 것부터 먼저)을 단위 테스트로 변환하십시오.
  3. # 2로 작성된 테스트를 통과하기 위해 최소한의 코드를 작성하십시오.
  4. 테스트를 통과 한 후 SOLIDD 디자인 원칙에 따라 코드를 리 팩터하십시오.
  5. # 4 이후에도 코드가 여전히 작성된 모든 테스트를 통과했는지 확인하십시오.
  6. 2-5를 반복하십시오.

이 프로세스를 통해 사운드 디자인으로 테스트 가능한 코드를 점차적으로 생성 할 수 있습니다. 처음에는 필기 시험이 불필요하다고 생각할 수 있지만 그 활동은 실제로 사운드 아키텍처를 구축하는 데 도움이됩니다.


3

C ++ 코드에서 사용하는 단계는 다음과 같습니다.

  1. 수업 명을 정하다
  2. 생성자 매개 변수 및 데이터 멤버를 결정합니다.
  3. 멤버 함수 이름 및 프로토 타입 결정
  4. 다른 클래스와 독립적으로 만듭니다.
  5. 디자인은 끝났고 다른 모든 것은 단지 구현 일뿐입니다.

(1)의 이유는 클래스에 속하는 기능의 범위를 정의하기 때문입니다. (2)의 이유는 클래스가 외부 세계와 통신하는 방법을 정의하기 때문입니다. (3)의 이유는 각 상황에서 필요한 클래스 기능을 선택하는 방법을 정의하기 때문입니다. (4)의 이유는 클래스가 다양한 상황에서 사용될 수 있기 때문입니다. (5)의 이유는 디자인과 구현 사이의 경계를 정의하기 때문입니다.


이름 지정에 +1 "실제 세계"에 대한 모든 지식을 암시 적으로 도입하기 때문에 이름을 추가하는 것만으로도 사고 과정을 구성 할 수 있다는 것은 놀라운 일입니다.
Mark Brackett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.