And*_*ler 8 c# oop class-design
我最近编写了一个类库,其中包含一些对某些类型文件进行建模的对象.例如,有一个抽象Document类,带有派生类PdfDocument(具体)和OfficeDocument(抽象,带有具体的派生类,如WordDocument和ExcelDocument)等.
目前,客户端创建新对象的方式是选择适当的派生类并将其传递给字节数组.所以例如,如果我有一个PdfDocument和WordDocument的字节数组,我会做类似的事情:
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
Run Code Online (Sandbox Code Playgroud)
这是可接受的设计,客户端必须知道要使用的派生类吗?或者我会更好地隐藏除抽象Document类之外的所有类,并使用诸如抽象工厂模式之类的东西来返回正确的派生类型?例如:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
Run Code Online (Sandbox Code Playgroud)
请注意,派生类型不会向抽象类添加其他属性/方法,它们只是以不同方式实现抽象方法.
第二种方法比第一种方法好得多,因为它隐藏了来自库用户的Word和Pdf文档存在的事实.当您决定添加更多文档类型(例如Rtf,Html等)时,这一点变得尤为重要:用户可以获得新添加类型的好处,而无需重新编译代码.实际上,他们甚至都没有注意到你已经改变了任何东西:如果做得对,他们的代码将"正常工作"他们从未知道存在的类型的文档.
PS如果您可以扫描字节数组并从中找出正确的类型,那么您的API可以通过消除第二个参数来"获得一些样式点".