2009-05-07 5 views
1

私は、さまざまな種類の構成ファイル(たとえば、テキストまたはxml)に由来するパラメータを持つコンテナクラスを持っています。型変換または変換メソッド?

私はtextConfigurationFilesのクラスとxmlConfigurationFilesのクラスを作成しました(これは後でIConfigFileインターフェイスを実装すると思います)。

私のコンテナクラスの初期化は、次のようになります。

ContainerClass myContainer = new ContainerClass(); 
myTextConfig = new TextConfig(textFile); 
myContainer.ParameterA = myTextConfig.ParameterA; 
myContainer.ParameterB = myTextConfig.ParameterB; 
myContainer.ParameterC = myTextConfig.ParameterC; 

またはXML

ContainerClass myContainer = new ContainerClass(); 
myXMLConfig = new XMLConfig(xmlFile); 
myContainer.ParameterA = myXMLConfig.ParameterA; 
myContainer.ParameterB = myXMLConfig.ParameterB; 
myContainer.ParameterC = myXMLConfig.ParameterC; 

代わりに、私は変換のいくつかの種類をしたいと思っごとに単一の値を割り当てるため。今では、型キャストを実装する必要があるのか​​、ContainerClassオブジェクトを返す単純なメソッドを実装する必要があるのか​​分かりません。

myContainer = myTextConfig.ConvertToContainer(); 

または

myContainer = (ContainerClass)myTextConfig; 

あなたの提案でしょうか?

私はSingle Responsibility Principleを実装しようとしているので、私は自分のContainerClassが単純なコンテナを表現したいと思っています。だから私は何かを考えると何か

ContainerClass myContainer = new ContainerClass(configFile); 

はSRPと壊れますか?

恐らく私のContainerClassは、テキストまたは xmlファイルで初期化されていると言えます。パラメータは、のxmlファイルの両方から得られるわけではありません。


[EDIT:追加情報]

ContainerClassは、データベース構成情報(パス名など)を有する容器を表します。

textFileはデータベース構成を表します。

xmlFileにもデータベース設定が含まれていますが、my textFileより多くの(データベース設定)パラメータがあります。

私はsthについて考える。以下のような:

TextFileConfigで
IConfig  config = new TextFileConfig(fileName); 
ContainerClass container = config.ConverToContainer(); 

または

IConfig  config = new TextFileConfig(fileName); 
ContainerClass container = (ContainerClass)config; 

public class TextFileConfig : IConfig 
{ 
    ContainerClass container; 

    // 
    // Constructor 
    // 
    public TextFileConfig(string fileName) 
    { 
     // 
     // Initialize all values from file fileName 
     // 
     ... 

     // 
     // Initialize container with standard values 
     // 
     container = new ContainerClass(); 

     // 
     // Merge container with values from textFile 
     // 
     ... 

     // 
     // Now container contains all values from textFile, 
     // all missing parameters are initialized with 
     // standard values. 
     // 
    } 


    public ContainerClass ConvertMethodOrTypecastThatsTheQuestion() 
    { 
     return container; 
    } 
} 

は、だから私は変換方式、型キャストまたはその両方を好むでしょうか?

まず、パフォーマンス、最高の使い方、個人的な習慣について考えます。

+0

なぜこのコンテナクラスが必要ですか? XMLとテキストの両方のコンフィグレーションの基本クラスではないでしょうか? – Grzenio

+0

私はそうは思わない:ContainerClassはデータベース構成を表す。私のtextFileにはデータベース設定が含まれています。私のxmlFileには異なるテーブルがあり、1つのテーブルにはmy textFileに似たデータベース設定が含まれています。さらに、私のxmlFileのデータベース設定には、textFileより多くのエントリが含まれています。 – Inno

答えて

3

は、私は論文の線に沿って何かをするだろうと思う。

  • ご使用の構成を表すタイプを作成します。IConfig
  • コンフィギュレーション・ローダーを表すタイプを作成しIConfigLoader
  • (別の構成ローダーの実装を作成します。 XmlConfigLoaderTextConfigLoaderなど)。IConfigインスタンスを返します。
  • 動的に、またはコンフィグレーション、ハードコーディングなどで使用するローダー実装を選択します。たとえば、抽象ファクトリまたはIoCコンテナを使用できます。
  • ロードされたIConfigインスタンスをContainerClassコンストラクタに渡し、それ自体を初期化させます。

質問については、コンテナに構成オブジェクトを渡すとSRPが破損することはわかりません。少なくとも、コンテナのインスタンス化と初期化のためにコンフィギュアを取得して読み取るコンテナ用のファクトリを持つことができます。これは、コンテナ作成タスクの複雑さのレベルに依存する、設計されたものである可能性があります。

+0

タイプキャストまたは変換メソッドがより適切な理由がいくつかあります。 ContainerClassには、データベース構成(パス、データベース名、データベースの種類など)が含まれています。 textFileにはデータベース設定が含まれています。 xmlFileにはデータベース設定も含まれていますが、my textFileよりも多くのパラメータがあります。 IMHO私のtextFileからすべての既存のパラメータを取得し、欠落しているすべてのパラメータのContainerClass標準値を保持することが最適です。 – Inno