문제

저는 OOP 디자인의 좋은 습관과 나쁜 습관에 대해 많이 읽고 있습니다.당신의 디자인이 나쁜지 좋은지 아는 것은 좋은 일입니다.하지만 나쁜 디자인에서 좋은 디자인으로 어떻게 갈 수 있을까요?메인 비즈니스 로직 클래스에서 인터페이스(xaml)와 코드 숨김을 분리했습니다.마지막 수업은 점점 커지고 있습니다.나는 그것을 더 작은 클래스로 나누려고 시도했지만 지금은 막혔습니다.대규모 수업을 분할하는 방법에 대한 아이디어가 있나요?메인 클래스에는 다양한 유형의 데이터 목록 1개가 있습니다.저는 총계뿐만 아니라 개별 유형에 대해서도 계산을 하고 있습니다.코드 숨김에서 처리되는 이벤트에서 호출되는 이러한 계산을 수행하는 방법이 있습니다.여기서 어디로 가야할지 아이디어가 있나요?

추가 정보:

우리는 이 프로젝트를 시작한 지 벌써 약 6개월이 되었습니다.저는 수년 동안 객체 지향 언어(처음에는 C++, Java, 지금은 C#)로 작업해 왔지만 이와 같은 대규모 프로젝트에서는 작업한 적이 없습니다.나는 우리가 처음에 잘못된 방향으로 전환했다고 생각하며 이를 바로잡아야 한다고 생각합니다.지금은 이 프로젝트에 대한 세부정보를 지정할 수 없습니다.디자인에 관한 책을 한두 권 주문할 예정이에요.모든 클래스를 분리한 경우 다시 하나로 묶으려면 어떻게 해야 하나요?아마도 이 방식을 첫 번째 릴리스까지 계속하고 그 후에 두 번째 릴리스를 위해 부품을 재구성하는 것이 더 나을 수도 있습니다.

도움이 되었습니까?

해결책

메인 클래스에는 다음과 같은 데이터 목록이 1개 있습니다 다른 유형.내가 하는 일 총액에 대한 계산뿐만 아니라 개별 유형.방법이 있습니다 를 사용하여 다음과 같은 계산을 수행합니다 에서 처리되는 이벤트에서 호출됩니다 코드 비하인드.앞으로 나아갈 방향에 대한 아이디어 여기요?

목록의 내용을 기반으로 하는 계산이 많은 경우 작업을 사용자 지정된 목록 클래스로 이동하는 것을 고려해 보셨나요?특정 유형에 대한 작업도 마찬가지입니다. 아마도 유형 내부에 있을 수 있을까요?

서로 다른 유형에 대해 유사하면서도 다른 작업을 수행하려면 다음을 사용하는 것이 좋습니다. 상태 패턴 (switch 문을 대체하는 것으로 참조) 이를 통해 엔터티를 균일한 방식으로 처리할 수 있습니다.

많은 OOP는 "하향식"/세부 관리 접근 방식을 버리고 "상향식"/자급자족 접근 방식을 고려하는 것입니다.두 접근 방식 모두 단독으로 "올바른" 것은 아니라는 점을 기억할 가치가 있습니다.유지 관리 가능한 코드를 만드는 것은 많은 생각이 필요하고 일반적으로 경험을 통해 발전하는 합리적인 균형을 찾는 것입니다.

다른 팁

연습하고 읽습니다. 반복하다 :)

일부 추천서 :

  • Robert C Martin의 Clean Code
  • GOF 디자인 패턴
  • Martin Fowler의 리팩토링

개인적으로 나는 또한 Head First Design 패턴을 좋아했지만 스타일은 모든 사람을위한 것은 아닙니다. C# 3.0 디자인 패턴이라는 비슷한 책이 있습니다 (ORA.com 참조). 그것은 같은 것들이 많지만 더 전통적인 방식으로.

픽업하는 것이 좋습니다 코드 완료. 그것은 당신과 같은 질문에 대한 많은 좋은 조언을 제공하는 훌륭한 책입니다.

큰 수업을 나누는 방법에 대한 질문에 대한 빠른 답변을 제공하려면 다음은 좋은 경험 법칙입니다. 수업을 한 가지에 대한 책임과 한 가지만 담당하십시오. 그렇게 생각하기 시작하면 속하지 않은 코드를 신속하게 식별 할 수 있습니다. 무언가가 속하지 않으면 새로운 클래스로 고려하고 원래 클래스에서 사용하십시오.

편집 : 그 생각도 "방법"수준으로 내려 가십시오. 방법을 한 가지에 책임을지게하십시오. 큰 (> 50 라인) 방법을 재사용 가능한 코드 덩어리로 매우 빠르게 파괴하는 데 도움이됩니다.

객체에 대한 생각 방식을 바꾸십시오. 모든 객체에는 하나의 매우 구체적인 책임이 있어야합니다. "MainBusinessLogic"과 같은 일반적인 이름이 있다면 아마도 뭔가 잘못하고있을 것입니다.

시작하기에 좋은 곳 : David West 's를 읽으십시오 객체 사고.

이것은 여기에서 훌륭한 책 제안에 대한 부록 일뿐입니다.

oo에서 더 잘 얻을수록 객체 크기를 줄이는 것 같습니다. 나는 작은 객체 크기 나 그 어떤 것도가는 것과는 다르지만 일어나고있는 것 같습니다.

소규모의 단일 책임, 사용 및 이해하기 간단하게 유지합니다. 각 객체는 가능한 한 방탄에 가깝고 매개 변수를 점검하고 객체가 유효하지 않은 상태로 허용하지 않아야합니다. 문서에서 모든 유효한 상태를 명확하게 정의하십시오.

수업을 만들 때마다 해당 수업에 대한 테스트를 만듭니다. 그것은 코드를 테스트 할뿐만 아니라 자신의 디자인을 소비하도록 강요합니다. 항상 "외부 시야"에서 수업을 생각하십시오. 수업을 사용하여 너무 많은 사람에게 묻지 않도록하고 그에게 요구하는 모든 것이 인터페이스에 문서화되어야합니다. 사용 가능한 테스트 프레임 워크가 없다면 종종 클래스에 빠른 메인을 던지는 경우가 있습니다. 동일한 파일에서 바로 코드를 사용하는 방법의 예를 제공합니다.

코딩에서 거의 모든 시간이 다른 사람이 한 일을 알아 내려고 노력합니다. 알려진 또는 잘 문서화 된 API를 사용하여 코드를 제출할 수 있다면, 내 직업은 사소하고 일정이 훨씬 짧습니다.

디자인 우선은 어려울 수 있습니다. 스포츠 능력과 유사한 코딩 능력을 고려하십시오. 우리 대부분은 우리의 차도에서 놀고, 지역 스포츠 팀에서 몇 번의 경기를합니다. 복잡한 프로젝트에서 선불 디자인을 잘하는 것은 내셔널 리그 선수의 과제이며, 백만 명 중 1 명입니다. 이것을 받아들이고 변화를 계획하십시오-정당은 당신의 친구입니다. (그건 그렇고, 우리 대부분은 우리가 주 수준에 쉽게 있다고 생각합니다. 우리는 그렇지 않습니다).

브라이언의 추천 외에도 Robert C Martin의 Clean Code, 당신은 "밥 삼촌"을 읽고 싶을 수도 있습니다. 객체 지향 디자인의 견고한 원리.

당신은 그가 확실한 원칙에 대해 이야기하는 것을들을 수 있습니다. Hanselminutes Podcast 145 그리고 깨끗한 코드를 켜십시오 .NET Rocks! 쇼 #388. 그와 함께 더 많은 것이 있습니다 .NET Rocks! 표시 #410, 그러나 그가 말하는 것은 실제로 당신의 질문과 관련이 없습니다. 나는 당신이 처음 두 것을 즐겼을 경우를 대비하여 그것을 포함 시켰습니다.

3 개의 팟 캐스트 중 Hanselminutes를 선호했습니다.

리팩토링 By Martin Fowler는 소프트웨어 디자인을 깨뜨리지 않고 변경하는 방법에 대한 훌륭한 책입니다.

디자인 패턴 알고리즘과 유사하게 작동하지만 객체를 결합하여 다양한 유용한 작업을 수행하는 방법을 알려줍니다.

드디어 마틴 파울러 응용 프로그램에 다양한 유용한 설계 패턴이 있습니다. 예를 들어 수동적 견해

마이클 깃털 "레거시 코드로 효과적으로 작동" 아주 좋은 것으로 추정되지만, 나는 그것을 직접 읽지 않았다고 고백 할 것입니다.

동일하게 "패턴에 대한 리팩토링."

나는 도움없이 복잡한 '과제'를 작업 한 다음 다른 사람이 어떻게했는지 보는 것이 나에게 큰 학습 경험이라는 것을 알았습니다.

특히 한 번의 과제는 우리가 거래를 추적하고 얻은이자와 그런 것들을 계산할 수있는 은행과 같은 프로그램을 만들었습니다. 그것은 정말로 나의 첫 번째 OOP 프로그램이었고 복잡성 때문에 정말 위대한 프로그램이었습니다. 오류없이 선형 스타일로 수행하기에는 (초보자) 너무 혼란스러워집니다.

나는 나에게 효과가있는 것을 말할 수 있고, 같은 방식으로 일하는 사람을 실제로 찾지 못했기 때문에 그것이 당신에게 많은 도움이 될지 확실하지 않습니다.

기본적으로 내 접근 방식은 가능한 한 적은 수의 수업을 보유하는 것입니다.

먼저, 정보를 저장 해야하는 유일한 시간은 시간 A에 수신하고 나중에 B가 필요하다면 B가 필요하다면 B를 얻고 동시에 작업하면 저장할 필요가 없을 수도 있습니다. .

둘째, 당신은 그것으로 무엇을합니까? 단순화 된 방식으로 반복하려는 경우 명령 세트로 생각할 수 있으며 명령어 세트의 통역사로 작동하는 프로그램을 생각할 수 있습니다. 이 경우 실제로 통역사를 사용하여 바이트 코드 명령어 세트를 설계하고 해당 명령 세트에서 정보를 인코딩 할 수 있습니다.

셋째, 정보는 얼마나 자주 변경됩니까? 일부 정보가 매우 드물게 변경되면 부분 평가 (즉, 코드 생성)를 사용할 수 있습니다. 즉, 정보를 드물게 변경하고이를 사용하여 전체 프로그램이 해당 정보로 수행 할 작업을 수행하지만 훨씬 빠르게 수행하는 임시 프로그램을 생성하는 데 사용합니다. 코드 생성기는 입력 정보의 일부만 처리하기 때문에 쓰기가 쉽습니다.

요즘 내가 본 데이터 구조의 대부분은 UI를 지원하기 위해 존재합니다. 이것은 분명히 사용자가 관심을 갖는 객체를 잡고 있지 않으며 이상적으로는 신경 쓰지 않아도됩니다. 그래서 나는 그 모든 hoo-haw를 숨기는 UIS 용 DSL을 만들었습니다.

가능한 경우 이벤트 및 알림을 피하십시오. 시점에서 발생하므로 상태의 점진적인 변화를 나타 내기 때문입니다. 당신은 그들이 떨어지거나 복제하거나 오도 될 가능성에 대해 강력하게 걱정해야 할 것입니다. 종종 그들은 종종 반대가 발생할 때 간단한 폴링 스타일이 "효율성이 떨어질 것"이라는 이론에 사용됩니다.

따라서 사람들이 클래스 기술과 같은 기술에 모두 마무리되는 것을 볼 때 일반적으로 너무 큰 데이터 구조를 만들기 때문입니다.

내 다운베이트 미끼 ...

나는 깃털을 추천합니다 레거시 코드로 효과적으로 작동합니다, 사용 가능하고 검색 가능 원정 여행, 위에 리팩토링. 유용하고 공감적인 장으로 가득합니다 시간이 많지 않아 변경해야 해요 그리고 내 응용 프로그램에는 구조가 없습니다.

고려해야 할 관점 :

  1. 설계 품질 테스트 자동화 - 디자인 결정의 교차 체크로 설계 품질에 대한 메트릭을 제공하는 도구를 찾으십시오.
  2. 코드 테스트 가능성 - 리팩토링 중 하나가 테스트 중심 개발, 단위 테스트 작성 또는 기능 테스트 작성에 도움이되거나 방해합니까? 일단 통합 된 큰 아키텍처를 테스트하는 것이 얼마나 어려울까요?
  3. 정당화 - 냉소적 인 CYA에서 경영진에 이르기까지 이러한 결정을 어떻게 방어합니까? 쉽고 일관되게 설명 할 수 있습니까? 변화가 이루어졌고 그 설명은 6 개월 후에 쉽게 찾을 수 있을까요?

디자인의 개인적인 취향, 특히 리팩토링 :

  1. 개념에 대한 수업 - 확실하지 않은 경우, 하나의 명확한 개념이 있다면, 하나 또는 방법의 행동으로 암시하기보다는 클래스에 싸여 있어야합니다.
  2. 책임으로 작은 것들을 의사 소통하는 많은 것들 생각하고 감사하기가 더 쉽습니다. 디자인이 현실 세계에 어떻게지도를 맵핑하는지 의심스러운 경우, 오래된 사람으로 돌아갑니다. 책임 중심 감시 각 수업의 책임을 기록하는 접근 방식. 당신이 이것을 어렵게 생각한다면, 각 수업이하는 일에 대한 당신의 개념은 혼란스러워 지거나 너무 많이하고 있습니다.
  3. 그들이 규칙적이라면 큰 일이 무서워하지 마십시오. 때로는 GUI의 많은 이벤트 핸들러가 많은 이벤트 처리기가 합법적으로 메트릭이 권장하는 것보다 훨씬 더 많은 방법이나 속성을 가진 수업을 받게됩니다.

보다 테스트 가능한 코드를 작성해보십시오. 이것만으로도 개선 된 OOP 관행/디자인 개념을 연구하고 구현해야했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top