我有一个带有 ConsoleApp 类的实用程序库,它只有像 GetIntValue(string name) 这样的静态方法来要求用户输入具有指定名称的参数的整数值,或解析命令行参数的函数。
至于我,ConsoleApp 是一个实用程序类,继承它只是为了避免“ConsoleApp”。在代码中看起来像 BaseBeen 反模式。
但另一方面,ConsoleApp 只会被真正是 Console 应用程序的类继承,这样,它就不是 BaseBeen。
那么,它真的是 BaseBeen 吗?
我有一个带有 ConsoleApp 类的实用程序库,它只有像 GetIntValue(string name) 这样的静态方法来要求用户输入具有指定名称的参数的整数值,或解析命令行参数的函数。
至于我,ConsoleApp 是一个实用程序类,继承它只是为了避免“ConsoleApp”。在代码中看起来像 BaseBeen 反模式。
但另一方面,ConsoleApp 只会被真正是 Console 应用程序的类继承,这样,它就不是 BaseBeen。
那么,它真的是 BaseBeen 吗?
SOLID 设计原则(尤其是 SRP、O/CP 和 DIP)建议您最好通过委托(例如策略模式)提供该功能。Has-A 比 Is-A 好,等等。
但是,您在这里非常直接地处于第一世界问题的领域,因为 Program.cs 非常位于您的代码库的瞬态端。显然,您可能需要在引导程序运行之前解析一些命令行参数(例如配置引导程序!),因此您可能会发现注入某种值提供程序具有挑战性。
所以,我会说是的,它是一种反模式,但是可能还有更重要的事情需要担心。
参见例如http://s3.amazonaws.com/hanselminutes/hanselminutes_0145.pdf第 8 页,鲍勃叔叔谈论 DIP:-
“Main 是我们最具体的功能,它将创建我们所有的实例和所有工厂……然后它会移交给抽象部分……抽象核心将像在这个幻想世界,一切都是抽象的。”
如果 Main 必须调用一些静态方法,那没关系。如果您想从实用程序类继承以使其更容易,那可能会有点味道,但我并不在乎。只要确保你知道边界在哪里。如果您在 Main 之外使用静态实用程序类,那么您可能会遇到问题。