【发布时间】:2019-01-21 10:43:41
【问题描述】:
当我尝试遵循Open-Closed Principle (OCP) 时,在实现了许多用例之后,我总是以继承类的层次结构告终。通常它发生在 MVVM 结构中的 ViewModel 上,因为它们发生了很大的变化。例如(C#,但可以是任何其他面向类的语言):
internal class MyAwesomeViewModel
{
private IDependency1 _dependency1;
public string Property1 { get; set; }
public ICommand Command1 { get; }
public MyAwesomeViewModel(IDependency1 dependency1)
{
_dependency1 = dependency1;
Command1 = new DelegateCommand(...);
}
}
internal class MyAwesomeViewModelWithAnotherProperty: MyAwesomeViewModel
{
public string Property2 { get; set; }
public MyAwesomeViewModelWithAnotherProperty(IDependency1 dependency1)
:base(dependency1)
{
}
}
internal class MyAwesomeViewModelWithNewCommandAndDependency: MyAwesomeViewModelWithAnotherProperty
{
private IDependency2 _dependency2;
public ICommand Command2;
public MyAwesomeViewModelWithNewCommandAndDependency(IDependency1 dependency1, IDependency2 dependency2)
: base(dependency1)
{
_dependency2 = dependency2;
Command2 = new DelegateCommand(...);
}
}
internal class MyAwesomeViewModelWithBunchNewProperties : MyAwesomeViewModelWithNewCommandAndDependency
{
public int IntProperty { get; }
public bool BoolProperty { get; }
public double DoubleProperty { get; }
public MyAwesomeViewModelWithBunchNewProperties(IDependency1 dependency1, IDependency2 dependency2)
: base(dependency1, dependency2)
{
}
}
问题是,当涉及到 4 级或更多级别的继承深度时,它变得非常混乱且难以阅读。另外我总是遇到命名问题,这是错误组合的信号(如MainWindowViewModel,然后是MainWindowViewModelCloseCommand,然后是MainWindowViewModelUserRelatedProperties等等)。
由于只使用了最后一个派生类(上例中的MyAwesomeViewModelWithBunchNewProperties),有时我会考虑将发布之前的所有继承或其他重要里程碑压缩到 1 个类中,如下所示:
internal class MyAwesomeViewModel
{
public int IntProperty { get; }
public bool BoolProperty { get; }
public double DoubleProperty { get; }
public string Property1 { get; set; }
public string Property2 { get; set; }
public ICommand Command1 { get; }
public ICommand Command2;
public MyAwesomeViewModelWithBunchNewProperties(IDependency1 dependency1, IDependency2 dependency2)
{
_dependency1 = dependency1;
_dependency2 = dependency2;
Command1 = new DelegateCommand(...);
Command2 = new DelegateCommand(...);
}
}
但它可能违反单一职责原则 (SRP) 并导致超大类。
问题:如何处理大量继承问题?还是完全没有问题,有这种类结构就可以了?
【问题讨论】:
-
坚持核心域中重要的 SOLID。您真的需要 ViewModel 中一流的 OO 代码或与视图相关的任何内容吗?有人可能会争论,但对我来说肯定不是。我对核心域进行了非常彻底的单元测试,但不是视图模型。我用 E2E 测试介绍了这一点。不过,我总是尝试坚持一些原则,例如 DIP 和 SRP。
-
请记住接受对您最有帮助的答案:)。如果您需要任何帮助,我也可以进一步澄清。
标签: class inheritance solid-principles open-closed-principle