2017-05-02 5 views
0

私は「構築を切り替えるのを避けようとしていますが、サブクラスにリファクタリングしてください」と聞いたことがあります。 このことがどういう仕組みか分かりません。 あなたのコードにif/switchがあります。そして、いくつかの新しいクラスを作成します。しかし、どのクラスを使用するかを決めるには、ファブリッククラスの場合(これらのオブジェクトを生成する場所)スイッチを実装する必要があります。私が間違っている?多型と条件付きを置き換え - どのように動作するのですか?

P.S.私の英語には申し訳ありません。私は読者であり、作家ではありません。

+0

どのプログラミング言語で答えが欲しいですか? C#? – Sweeper

+0

。私はPHPが好きですが、C#またはJavaも問題ありません。 –

答えて

1

しかし、ファブリッククラス(これらのオブジェクトを生成する)に の場合、スイッチを実装する必要があります。私が間違っている?

いいえ、あなたは間違っていません。スイッチの多相性は良いことですが、例外もあります。そのような例外の1つは、パラメータ化された工場を持っている場合です。これは絶対に受け入れられます。したがって、条件に基づいて特殊なクラスを作成するクライアントコードの代わりに、そのようなファクトリを作成するよう依頼します。ファクトリーは、そのクラスインスタンスの作成のみを担当し、新しいクラスが導入された場合、ファクトリーのみがクライアントコードではなく変更されます。だからではなく、本の

public class Client { 
    public string Serialize<T>(string contentType, T instance) where T : class { 
     switch(contentType) { 
      case "XML": 
       return new XMLSerializer().Serialize(instance); 
      case "JSON": 
       return new JSONSerializer().Serialize(instance); 
     } 
    } 
} 

あなたはこの必要があります:

public interface ISerializer { 
    string Serialize(object instance); 
    object Deserialize(string content); 
} 

public class XMLSerializer : ISerializer { } 
public class JSONSerializer : ISerializer { } 

public class SerializerFactory() { 
    public static ISerializer CreateSerializer(string type) { 
     switch(type) { 
      case "XML": 
       return new XMLSerializer(); 
      case "JSON": 
       return new JSONSerializer(); 
     } 
    } 
} 

public class Client { 
    public string ParseAPIResponse(string contentType, string responseData) { 
     ISerializer serializer = SerializerFactory.CreateSerializer(contentType); 
     var responseObj = serializer.Deserialize(responseData); 
    } 
} 

注意が工場を変更するには、1つだけの理由も、それは新しいシリアライザの紹介ですので、我々はあることができますここではSRPで良い。さらに、ファクトリーの変更を避ける方法もあります。設定ファイルを使用して識別子タイプのマッピングを格納するか、ファクトリに別のメソッドを公開するだけで、ユーザーが新しいタイプなどを登録できるようになります。

+0

コメントありがとうございます。今私はこの概念を完全に理解しています。私の評判が低いので、申し訳ありませんあなたの答えを与えることができます。しかし、それが気になるときは、私はそれを約束します:-) –

+0

*しかし、それが気になるときは、私はそれをするつもりです、私は約束します* - それはOKです。 *今、私はこの概念を完全に理解しています* - これはもっと重要でした。 – niksofteng

関連する問題