理由はここにあります
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
、古い動作を破壊するか、条件付きロジックで汚染することなく、動作を変更する方法はありません。スタティックは変装した邪悪なグローバルであることは事実ですが、それらがポリモーフィズムを無効にするという事実は、それらに関する私の主な不満です。静的メソッドは、OOP言語の最初のクラスではありません。メソッドに、状態のないオブジェクトであっても、住むオブジェクトを与えることで、メソッドを移植可能にします。その振る舞いは、変数の値のように渡すことができます。
ここでは、ヨーロッパで展開するときと米国で展開するときで少し異なる動作をする必要があるシステムを想像しました。どちらかのシステムに他のシステムにのみ必要なコードを含めるように強制するのではなく、解析オブジェクトがクライアントに挿入される順序を制御することで動作を変更できます。これにより、地域の詳細の広がりを含めることができます。また、既存のパーサーに触れることなく、OrderParserCanadaを簡単に追加できます。
それがあなたにとって何も意味しない場合、本当にこれについて良い議論はありません。
ところで、GetStringPart
ひどい名前です。