Ecco perché
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;
}
}
Se avessi adottato un metodo statico, non ci sarebbe modo di cambiare il comportamento GetStringPart
senza distruggere il vecchio comportamento o inquinarlo con la logica condizionale. È vero che la statica è una malvagità globale sotto mentite spoglie, ma il fatto che disabilitino il polimorfismo è la mia principale lamentela. I metodi statici non sono di prima classe nei linguaggi OOP. Dando al metodo un oggetto in cui vivere, anche uno senza stato, rendiamo il metodo portatile. Il suo comportamento può essere passato come il valore di una variabile.
Qui ho immaginato un sistema che deve comportarsi in modo leggermente diverso quando distribuito in Europa rispetto a quando implementato negli Stati Uniti. Invece di forzare un sistema a contenere codice necessario solo all'altro, possiamo modificare il comportamento controllando l'ordine di analisi dell'oggetto iniettato nei client. Questo ci consente di contenere la diffusione dei dettagli della regione. Inoltre, semplifica l'aggiunta di OrderParserCanada senza dover toccare i parser esistenti.
Se questo non significa nulla per te, allora non c'è davvero un buon argomento per questo.
A proposito, GetStringPart
è un nome terribile.