Hier ist der Grund
class DOSClient {
OrderParser orderParser;
string orderCode;
DOSClient(OrderParser orderParser, string ordercode) {
this.orderParser = orderParser;
this.ordercode = ordercode;
}
void DisplayOrderCode() {
Console.Write( "Prefix: " + orderParser.GetStringPart(ordercode) );
...
}
}
class GUIClient {
OrderParser orderParser;
string orderCode;
GUI gui;
GUIClient(OrderParser orderParser, string ordercode, GUI gui) {
this.orderParser = orderParser;
this.ordercode = ordercode;
this.gui = gui;
}
void DisplayOrderCode() {
gui.Prefix( orderParser.GetStringPart(ordercode) );
...
}
}
class OrderParserUS : IOrderParser {
public string GetStringPart(string input)
{
//Some input validation which is removed for clarity
if(input.Length > 5)
return input.Substring(0,1);
if(input.Substring(0,1) == "B")
return input.Substring(0,3);
return string.empty;
}
}
class OrderParserEU : IOrderParser {
public string GetStringPart(string input)
{
//Some input validation which is removed for clarity
if(input.Length > 6)
return input.Substring(0,1);
if(input.Substring(0,1) == "#")
return input.Substring(0,3);
return string.empty;
}
}
Wenn Sie sich für eine statische Methode entschieden hätten, gäbe es keine Möglichkeit, das Verhalten von zu ändern, GetStringPart
ohne entweder das alte Verhalten zu zerstören oder es mit bedingter Logik zu verschmutzen. Es ist wahr, dass Statik böse Globals in Verkleidung sind, aber die Tatsache, dass sie den Polymorphismus deaktivieren, ist meine Hauptbeschwerde über sie. Statische Methoden sind in OOP-Sprachen nicht erstklassig. Indem wir der Methode ein Objekt zum Leben geben, auch wenn es keinen Zustand gibt, machen wir die Methode portierbar. Sein Verhalten kann wie der Wert einer Variablen weitergegeben werden.
Hier habe ich mir ein System vorgestellt, das sich beim Einsatz in Europa etwas anders verhalten muss als beim Einsatz in den USA. Statt zu erzwingen, dass eines der beiden Systeme Code enthält, der nur von dem anderen benötigt wird, können wir das Verhalten ändern, indem wir steuern, welches Ordnungsanalyseobjekt in die Clients injiziert wird. Dies ermöglicht es uns, die Streuung der Regionsdetails einzudämmen. Es macht es auch einfach, OrderParserCanada hinzuzufügen, ohne vorhandene Parser anfassen zu müssen.
Wenn Ihnen das nichts bedeutet, gibt es dafür wirklich kein gutes Argument.
Übrigens GetStringPart
ist ein schrecklicher Name.