2016-04-17 3 views
1

私はデータビジュアライザクラスを設計しています。データオブジェクトがあれば、それはユーザーの画面上にビジュアル表現を作成します。あまりにも多くのロジック/リンクフィールド(少し長い)をどうすれば処理できますか?

私はに準拠している必要があり、いくつかの設計上の制約があります。

  1. クラスはパラメータなし「見える化」の方法を持っていることですが。すべての 視覚化設定はインスタンスフィールドになります。
  2. クラスの状態は常に正確でなければなりません。

説明するために:これまでのところは良い

public class DataVisualizer { 

    public DataObject Object { get { return _object; } set { // logic } } 

    public void Visualize(){ 
     // visualize the data... 
    } 
} 

をしかしクラスは、「DataObjectCollection」インスタンスフィールドを持つことです。前述のフィールドをデータオブジェクトを視覚化するために設定する必要はありませんが、そうであれば、VisualizeNextやVisualizePrevious(Visualizerの状態を変更してVisualizeを呼び出す必要があります)などの追加メソッドを有効にします。 。

public class DataVisualizer { 

    public DataObjectCollection { get { return _dataObjectCollection; set { // logic } } 
    public DataObject Object { get { return _object; } set { // logic } } 

    public void Visualize(){ 
     // visualize the data... 
    } 

    public void VisualizeNext(){ 
     Object = NextObjectInDataObjectCollection(); 
     Visualize(); 
    } 

    public void VisualizePrevious(){ 
     Object = PreviousObjectInDataObjectCollection(); 
     Visualize(); 
    } 
} 

を今すぐ上記の設計上の制約#2を覚えている:例証する

。 例として、ユーザーが設定中にDataObjectCollectionを設定した場合、DataObjectが何であるかを確認する必要があります。 DataObjectがDataObjectCollectionに含まれていない場合は、DataObjectをnullまたはDataObjectCollectionの最初の要素に設定する必要があります。反対に、DataObjectを設定する場合、DataObjectCollectionにDataObjectが含まれているかどうかを確認する必要があります。そうでなければ、DataObjectCollectionをnullに設定する必要があります。

さらに複雑にするために、VisualizeNext/Previousメソッドのために可視化されるデータオブジェクトのインデックスも追跡する必要があります。コレクションがnullの場合は-1 (コレクションに重複する要素やヌル値が含まれている可能性があるため、IndexOfを使用できません)。

さらに、DataObjectCollectionは実際に別のコレクションの一部です!だから、本質的には、私たちのビジュアライザは、このようなものになります。

public class DataVisualizer { 

    public DataObjectOuterCollection { get { return _dataObjectOuterCollection; set { // logic } } 
    public DataObjectInnerCollection { get { return _dataObjectInnerCollection; set { // logic } } 
    public DataObject Object { get { return _object; } set { // logic } } 

    public void Visualize(){ 
     // visualize the data... 
    } 

    public void VisualizeNext(){ 
     Object = NextObjectInDataObjectCollection(); 
     Visualize(); 
    } 

    public void VisualizePrevious(){ 
     Object = PreviousObjectInDataObjectCollection(); 
     Visualize(); 
    } 
} 

上記思い出しポイント#2を毎回フィールドが設定されているので、物事が複雑になり、私は他のフィールドの値をチェックし、正しいそれらを設定する必要があります値。たとえば、InnerCollectionがOuterCollectionに含まれていない場合は、InnerConnectionをOuterCollectionの最初の要素またはnullに設定してから、DataObjectで同じことを行う必要があります。私はまた、InnerCollectionのインデックスも追跡する必要があります!

多くのロジックをより簡単に処理できるようにするための設計パターンやコード構造はありますか?フィールドが1つの他のフィールドに「リンク」されているのは簡単ですが、5つのフィールドではすばやく管理しやすくなります。

+0

この質問に3つの異なる言語がタグ付けされているのはなぜですか? – jaco0646

+0

これは、特定の言語に固有のものよりも一般的なプログラミングの問題です。 – Rafael

答えて

0

データがどこから来るかによって、いくつかのクラスが必要なようです。彼らはすべて次のように、単一のインターフェイスを実装することができます

public interface IDataVisualizer 
{ 
    void Visualize(); 
} 

その方法は、あなたがコレクションベースのビジュアライザと別々のクラスに単品ベースのビジュアライザのルールを分割することができます。

public class CollectionVisualizer : IDataVisualizer 
{ 
    List<DataObject> objects; 
    int index; 

    void Visualize() { ... } 
    void VisualizeNext() { ... } 
    void VisualizePrevious() { ... } 
} 

public class SingleObjectVisualizer : IDataVisualizer 
{ 
    DataObject object; 

    void Visualize() { ... } 
} 

今制約は管理が少し簡単に見えます。

関連する問題