2009-07-24 12 views
2

私は大きなShapeクラスを持っていますが、そのインスタンスは多くのことを行うことができます(できるはずです)。私はこのクラスを継承する多くの "ドメイン"シェイプクラスを持っていますが、描画以外の機能は提供していません。大きなクラスを分割する方法

Shapeクラスをサブクラス化しようとしましたが、すべての "domain"オブジェクトはこのサブクラスを継承します。

クラスを分割するにはどうすればよいですか? (それは300のテキスト行、C#です)

+0

コード...どこですか? :) –

答えて

7

アイデア(ヒューリスティックのようなより)のカップル投稿するための

1:

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)重複したコードをリファクタリング:ここ

あなたが試すかもしれないいくつかのことです。

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

注:PinYもPINXを計算しますが、その値を使用していないコードのこの種の約7倍に複製されました。

同様の重複が存在する中で:順位{X、Y} {スタート、終了}

壊すために、このクラスはより困難になり何それはすでに複雑なクラスのラッパーであるということです。

(私はShape、Circle、Squareのコンセプトの専門家ですが)ドメインを非常によく知っていないので、クラスを複数のクラスに分割して、それぞれが同じコア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

関連する問題