Inilah sebabnya
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;
}
}
Jika Anda menggunakan metode statis tidak akan ada cara untuk mengubah perilaku GetStringPart
tanpa menghancurkan perilaku lama atau mencemari dengan logika kondisional. Memang benar statika adalah global jahat yang menyamar tetapi fakta bahwa mereka menonaktifkan polimorfisme adalah keluhan utama saya tentang mereka. Metode statis bukan kelas satu dalam bahasa OOP. Dengan memberikan metode objek untuk hidup, bahkan satu tanpa keadaan, kita membuat metode portabel. Perilakunya dapat ditularkan seperti nilai variabel.
Di sini saya membayangkan sebuah sistem yang perlu berperilaku sedikit berbeda ketika dikerahkan di Eropa kemudian ketika dikerahkan di AS. Alih-alih memaksa kedua sistem untuk memuat kode yang hanya dibutuhkan oleh yang lain, kita dapat mengubah perilaku dengan mengontrol objek parsing pesanan apa yang diinjeksikan ke klien. Ini memungkinkan kami untuk menahan penyebaran detail kawasan. Itu juga membuatnya mudah untuk menambahkan OrderParserCanada tanpa harus menyentuh parser yang ada.
Jika itu tidak ada artinya bagi Anda, maka sebenarnya tidak ada argumen yang bagus untuk ini.
BTW, GetStringPart
adalah nama yang mengerikan.