2009-07-24 4 views
2

나는 많은 Shape 클래스를 가지고 있는데, 그 인스턴스는 많은 것을 할 수 있어야한다. 이 클래스에서 상속받은 많은 "도메인"모양 클래스가 있지만 드로잉 이외의 다른 기능은 제공하지 않습니다.큰 클래스를 분해하는 방법

Shape 클래스의 서브 클래스를 만들려고했지만 "도메인"개체가 모두이 서브 클래스를 상속합니다.

클래스를 어떻게 분할합니까? (그것은 300 텍스트 라인, C#입니다)

+0

코드 ... 어디입니까? :) –

답변

7

에게 (이상의 휴리스틱 같은) 아이디어 몇 가지를 게시

+1. 필드 그룹이 몇 가지 메소드에서만 사용되는 경우 해당 필드 그룹과이 필드 그룹을 사용하는 메소드가 다른 클래스에 속할 수 있다는 사인이 될 수 있습니다.

2) 잘 명명 된 클래스라고 가정하고, 클래스의 이름과 클래스가 실제로하는 것과 비교하십시오. 클래스의 이름에서 기대하는 것 이상을 수행하는 메소드를 발견하면 해당 메소드가 다른 클래스에 속하는 표시 일 수 있습니다. 예를 들어 클래스가 고객을 나타내지 만 로그 파일을 열고 닫고 로그 파일에 기록하는 경우 로그 파일 코드를 Logger 클래스로 분리합니다. 참고 자료 : Single Responsibility Principle (PDF) 몇 가지 흥미로운 아이디어가 있습니다.

3) 일부 메소드가 주로 다른 클래스의 메소드를 호출하는 경우 해당 메소드를 자주 사용하는 클래스 (예 : Feature Envy)로 이동해야한다는 표시 일 수 있습니다.

주의 : 말한 것처럼 깨지기는 어렵습니다. 수업을 해칠 위험이있는 경우 리팩토링 담당자로서 아무 것도 깨뜨리지 않고 있음을 알 수 있도록 몇 가지 테스트를 실시 할 수 있습니다. 'Working Effectively with Legacy Code'및 'Refactoring'책을 읽는 것이 좋습니다.

8

300 라인 나를 위해 합리적인 것 같습니다. 당신이 정말로 다른 헬퍼 클래스에 기능을 위임에 의해 깨질 수

+0

인식이 속일 수 있습니다! 아마도 300 줄 중 298 줄이 rot13으로 쓰여져 있을까요? – Sneakyness

+0

@snekay 당신이 무슨 말을하고 있는지 확실하지 않습니다. – Tim

2

더 나은 도움을 원하는 경우

코드를 게시 할 수 있습니다.

하지만 300 줄의 코드는 끔찍하지 않다는 것에 동의합니다.

1) 클래스의 필드를 검사 : 코드

1

고맙습니다.

1) 중복 코드를 리팩토링 : 여기

당신이 시도 할 수있는 몇 가지 있습니다. 코드의이 종류는 일곱 번에 대해 중복되었습니다

 Visio.Cell pinX = GetLayoutCell(Visio.VisCellIndices.visXFormPinX); 
     if (pinX != null) 
     { 
      pinX.set_Result("cm", value); 
     } 

참고 : 소나무는 핀크스을 계산하지만 그 값을 사용하지 않습니다.

헤어이 클래스가 더 도전하게 무엇

그것은 이미 복잡한 클래스 래퍼는 점이다 포스 {X, Y} {시작, 종료} :

유사 중복이 존재합니다.

도메인을 매우 잘 알지 못하지만 (셰이프, 원, 사각형 개념의 전문가 임에도 불구하고) 클래스를 동일한 코어 Shape 객체를 공유하는 여러 클래스로 분해하려고합니다.

class EnvironShape { 
    private ShapeProperties _properties; // contains property management code 
    private ShapeCollection _children;  // contains code for acting on children 
    private Decorators  _decorators; // code for accessing decorators 
    private Layers   _layers;  // layer management code 
    private Position  _position;  // code for working with the shape's position 
    // Other code omitted 
} 

나는 즉시 직접 이러한 개체를 (예를 들어, 공개하는 ShapeCollection의 GetChildren())에 노출시키지 것이다 그러나 나는 이러한 개체에 EnvironShape 대리자를 만들기 시작합니다 : 여기

스케치입니다.

+0

많은 Tim에게 감사드립니다. – geejay

관련 문제