[英]How to apply Interface segregation principle?
我有一個公共接口,可以通過客戶端創建一堆不同的特定對象,唯一的共同點是它們都需要序列化為 xml。
像這樣的東西:
public interface IBuildXmlService
{
XmlObject1 BuildClient1Xml(CustomObjectWithClient1Data data);
XmlObject2 BuildClient2Xml(CustomObjectWithClient2Data data);
XmlObject3 BuildClient3Xml(string string1, int int1);
XmlObject4 BuildClient4Xml(CustomObjectWithClient4Data data);
}
現在這個界面開始變大,我肯定這不是一個好兆頭。 此外,每次我將接口注入特定於客戶端的類時,該特定於客戶端的類都可以訪問其他客戶端的所有其他對象創建方法。
現在我想到的第一件事就是將對象創建方法作為私有方法移動到客戶端特定類中,但這會導致一些大文件。
然后我想使用工廠方法模式為對象創建部分創建一個帶有 BuildXml 方法的 IXmlFactory,但這似乎不起作用,因為我有不同的對象要返回。
誰能給我一些關於我應該尋找什么設計模式的建議?
我有一個公共接口,可以通過客戶端創建一堆不同的特定對象,唯一的共同點是它們都需要序列化為 xml。
因此可以得出結論,這些對象之間沒有共同點。 甚至這些方法的參數也不同。
所以我的建議是分離所有方法並為每個對象創建單獨的接口:
public interface IBuildXmlServiceXmlObject_1
{
XmlObject1 BuildClient1Xml(CustomObjectWithClient1Data data);
}
public interface IBuildXmlServiceXmlObject_2
{
XmlObject2 BuildClient2Xml(CustomObjectWithClient2Data data);
}
public interface IBuildXmlServiceXmlObject_3
{
XmlObject3 BuildClient3Xml(string string1, int int1);
}
public interface IBuildXmlServiceXmlObject_4
{
XmlObject4 BuildClient4Xml(CustomObjectWithClient4Data data);
}
為什么有單獨的接口更好? 因為接口隔離原則是如何使用接口的。 因此,是否需要使用接口的其他方法或不依賴於您的需要。
使用 ISP 的 HDD 示例:
public interface IReadable
{
string Read();
}
public interface IWriteable
{
void Write();
}
public class HDD : IReadable, IWriteable
{
public string Read() { }
public void Write() { }
}
通過為Read()
和Write()
方法創建一個接口,它將強制類在類中實現這兩種方法。 但是有些類只想讀取數據,有些則要寫入數據,有些則兩者兼而有之。 例如讀卡器可能想要讀取數據。 所以在這種情況下,最好創建單獨的接口。
因此,讓我們看一下CardReader的另一個示例。 CardReader只讀取數據,不寫入數據。 所以,如果我們繼承一個接口,帶有Read()
和Write()
方法,那么我們將違反 ISP 原則。 違反 ISP 的示例:
public interface IWriteReadable
{
string Read();
void Write();
}
public class CardReader : IWriteReadable
{
// this is a necessary method
public string Read() { }
// here we are obligating to implement unnecessary method of interface
public void Write() { }
}
因此,通過應用 ISP,您只需將客戶端類所需的方法放入接口中。 如果您的類/客戶端只想讀取數據,那么您需要使用IReadable
接口,而不是IReadableWriteable
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.