Dlatego
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;
}
}
Jeśli wybrałeś metodę statyczną, nie byłoby sposobu, aby zmienić zachowanie GetStringPart
bez zniszczenia starego zachowania lub zanieczyszczenia go logiką warunkową. To prawda, że statyka to złe globale w przebraniu, ale fakt, że wyłączają polimorfizm, jest moim głównym zarzutem. Metody statyczne nie są pierwszą klasą w językach OOP. Dając metodzie obiekt do życia, nawet taki bez stanu, sprawiamy, że metoda jest przenośna. Jego zachowanie można przekazywać jak wartość zmiennej.
Wyobraziłem sobie system, który musi zachowywać się nieco inaczej po wdrożeniu w Europie niż po wdrożeniu w USA. Zamiast tego wymuszaj, aby jeden system zawierał kod potrzebny tylko drugiemu, możemy zmienić zachowanie, kontrolując, jaki obiekt analizujący kolejność jest wprowadzany do klientów. To pozwala nam ograniczyć rozprzestrzenianie się szczegółów regionu. Ułatwia także dodawanie OrderParserCanada bez konieczności dotykania istniejących parserów.
Jeśli to nic dla ciebie nie znaczy, to naprawdę nie ma na to dobrego argumentu.
BTW, GetStringPart
to okropne imię.