Este es el por qué
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;
}
}
Si hubiera seguido un método estático, no habría forma de cambiar el comportamiento GetStringPart
sin destruir el comportamiento anterior o contaminarlo con lógica condicional. Es cierto que la estática es un malvado disfrazado, pero el hecho de que deshabilite el polimorfismo es mi principal queja sobre ellos. Los métodos estáticos no son de primera clase en lenguajes OOP. Al darle al método un objeto para vivir, incluso uno sin estado, hacemos que el método sea portátil. Su comportamiento se puede transmitir como el valor de una variable.
Aquí he imaginado un sistema que debe comportarse de manera ligeramente diferente cuando se implementa en Europa que cuando se implementa en los EE. UU. En lugar de forzar a cualquiera de los sistemas a contener el código que solo necesita el otro, podemos cambiar el comportamiento controlando qué objeto de análisis de orden se inyecta en los clientes. Esto nos permite contener la difusión de los detalles de la región. También facilita agregar OrderParserCanada sin tener que tocar los analizadores existentes.
Si eso no significa nada para ti, entonces realmente no hay un buen argumento para esto.
Por cierto, GetStringPart
es un nombre terrible.