2017-05-02 12 views
0

Oft habe ich gehört, dass "versuchen zu vermeiden, wenn/Konstruktionen wechseln. Wenn Sie sie haben, dann refactor sie zu Unterklassen" Ich weiß nicht, wie das Ding funktioniert. Ok, du hast einen if/Schalter in deinem Code. Und Sie erstellen mehrere neue Klassen. Um jedoch zu entscheiden, welche Klasse Sie verwenden möchten, müssen Sie switch implementieren, wenn Sie sich in der Fabric-Klasse befinden (in der Sie diese Objekte generieren). Liege ich falsch?Ersetzen Sie bedingt durch Polymorphie - wie es funktioniert?

P.S. Entschuldigung für mein Englisch. Ich bin Leser, nicht Schriftsteller.

+0

In welcher Programmiersprache möchten Sie die Antworten finden? C#? – Sweeper

+0

Beliebig. Ich bevorzuge PHP, aber C# oder Java auch kein Problem. –

Antwort

1

Aber um zu entscheiden, welche Klasse Sie verwenden möchten, müssen Sie den Schalter if in der Fabric-Klasse implementieren (wo Sie diese Objekte generieren). Liege ich falsch?

Nein, Sie liegen nicht falsch. Während der Polymorphismus über Schalter eine gute Sache ist, gibt es Ausnahmen. Eine solche Ausnahme ist, wenn Sie werkseitig parametrisiert haben, und das ist absolut akzeptabel. Anstatt Ihren Kundencode zu erstellen, der auf den Bedingungen spezialisierte Klassen erstellt, werden Sie diese Fabrik bitten, sie für Sie zu erstellen. Vorteil ist, dass Factory nur für das Erstellen dieser Klasseninstanzen verantwortlich ist. Wenn eine neue Klasse eingeführt wird, wird nur die Factory und nicht der Client-Code geändert.

Anstatt also diese:

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); 
     } 
    } 
} 

Sie dieses:

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); 
    } 
} 

Hinweis kann es nur einen Grund für die Fabrik zu ändern, und das ist die Einführung neuer Serializer, also sind wir gut auf SRP hier. Wenn Sie noch weiter gehen, gibt es Möglichkeiten, die Fabrik nicht zu verändern, indem Sie Konfigurationsdateien verwenden, um Bezeichner-Typ-Zuordnungen zu speichern, oder einfach eine andere Methode im Werk verfügbar machen, damit Benutzer neue Typen registrieren können. Das liegt an Ihnen.

+0

Danke für den Kommentar. Jetzt verstehe ich dieses Konzept vollständig. Entschuldigung kann deine Antwort ein Plus geben, weil mein Ruf niedrig ist. Aber wenn es hoch wird, werde ich es tun, ich verspreche es :-) –

+0

* Aber wenn es hoch wird, werde ich es tun, ich verspreche * - Das ist ok. * Jetzt verstehe ich dieses Konzept * - das war wichtiger. – niksofteng

Verwandte Themen