Вот почему
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;
}
}
Если бы вы использовали статический метод, не было бы никакого способа изменить поведение, GetStringPart
не разрушив старое поведение или не загрязнив его условной логикой. Это правда, что статики - это замаскированные злые глобалы, но тот факт, что они отключают полиморфизм, является моей главной жалобой на них. Статические методы не являются первоклассными в языках ООП. Предоставляя методу объект для жизни, даже если он не имеет состояния, мы делаем метод переносимым. Его поведение может передаваться как значение переменной.
Здесь я представил систему, которая должна вести себя немного иначе, когда она развернута в Европе, чем при развертывании в США. Вместо того, чтобы заставить любую систему содержать код, необходимый только другой, мы можем изменить поведение, контролируя, какой объект анализа заказов вводится в клиентах. Это позволяет нам сдерживать распространение деталей региона. Это также позволяет легко добавлять OrderParserCanada без необходимости трогать существующие парсеры.
Если это ничего не значит для вас, то для этого нет веских аргументов.
Кстати, GetStringPart
это ужасное имя.