1.静态与实例
我认为关于什么是好的OO设计有什么非常明确的指导。问题在于,博客圈很难区分好与坏。您可以找到某种参考,甚至可以支持您想到的最差实践。
我能想到的最糟糕的做法是全局状态,包括您提到的静态数据和每个人都喜欢的Singleton。Misko Hevery 关于该主题的经典文章的一些摘录。
要真正理解依赖关系,开发人员必须阅读每一行代码。它会引起遥远的怪异动作:运行测试套件时,一个测试中的全局状态发生突变会导致后续或并行测试意外失败。使用手动或Guice依赖注入打破静态依赖。
距离遥远的怪异动作是指我们运行一件我们认为是孤立的事情(因为我们没有传递任何引用),但是意外的交互作用和状态更改发生在系统的遥远位置,而我们并未告知对象。这只能通过全局状态发生。
您以前可能没有这样想过,但是每当您使用静态时,您就在创建秘密的通信通道,并且没有在API中明确它们。距离遥远的鬼动作迫使开发人员阅读每一行代码,以了解潜在的交互作用,降低开发人员的工作效率,并使新的团队成员感到困惑。
归结为,您不应为具有某种存储状态的任何内容提供静态引用。我唯一使用statics的地方是枚举常量,对此我也有疑虑。
2.具有输入参数和返回值的方法与没有参数的方法
您需要意识到的是,没有输入参数且没有输出参数的方法几乎可以保证在某种内部存储状态下运行(否则,它们在做什么?)。有整个语言上构建的避免存储状态的想法。
任何时候存储状态时,都有可能产生副作用,因此请确保始终谨慎使用状态。这意味着您应该首选具有定义的输入和/或输出的功能。
而且,实际上,定义了输入和输出的函数更容易测试-您不必在此处运行函数就可以查看发生了什么,而不必在某个地方设置属性否则,在运行被测函数之前。
您也可以安全地将此类型的函数用作静态函数。但是,我不会,因为如果以后我想在某个地方使用该功能的稍有不同的实现,而不是在新实现中不提供其他实例,那么我将无法替换该功能。
3.重叠与不同
我不明白这个问题。2种重叠方法的优点是什么?
4.私人与公共
不要暴露任何不需要暴露的东西。但是,我也不是私有的忠实拥护者。我不是C#开发人员,而是ActionScript开发人员。我花了很多时间在大约于2007年编写的Adobe Flex Framework代码中。对于私有化的内容,他们做出了一些非常糟糕的选择,这使得扩展类变得有些噩梦。
因此,除非您认为自己比2007年左右的Adobe开发人员更好(从您的问题出发,我想您还有几年的时间才有机会提出这一要求),否则您可能只想默认为protected 。
您的代码示例存在一些问题,这意味着它们的架构不正确,因此无法选择A或B。
一方面,您可能应该将对象创建与use分开。因此,通常您不会在使用new XMLReader()
位置旁拥有自己的权利。
另外,正如@djna所说,您应该封装XML Reader使用中使用的方法,因此您的API(实例示例)可以简化为:
_document Document = reader.read(info);
我不知道C#是如何工作的,但是由于我已经使用了多种Web技术,因此我怀疑您不能总是能够立即返回XML文档(除非作为Promise或将来的类型对象),但我无法为您提供有关如何在C#中处理异步加载的建议。
请注意,使用这种方法,您可以创建多个实现,这些实现可以采用一个参数来告诉他们读取和返回XML对象的位置/内容,并根据项目需求交换它们。例如,您可能直接从数据库,本地商店或从URL中读取,就像在原始示例中一样。如果使用静态方法,则无法执行此操作。