在这里,我查看了一些标准库类,并思考为什么它们没有嵌套和公开以强调它们的“区域”。
例如,DataTable还有DataRow. DataRownowhere 似乎是脱离上下文使用的DataTable,而且没有构造函数 => 只能通过工厂方法进行创建。或者DataColumn...
那么为什么不通过移动类来强调所有权DataTable呢?
总的来说,我似乎并不经常(在我看来,从来没有)看到他们会利用这个机会。
这是为什么?
在这里,我查看了一些标准库类,并思考为什么它们没有嵌套和公开以强调它们的“区域”。
例如,DataTable还有DataRow. DataRownowhere 似乎是脱离上下文使用的DataTable,而且没有构造函数 => 只能通过工厂方法进行创建。或者DataColumn...
那么为什么不通过移动类来强调所有权DataTable呢?
总的来说,我似乎并不经常(在我看来,从来没有)看到他们会利用这个机会。
这是为什么?
好吧,为什么,它被使用,但仅用于那些没有特别直接出现在代码中的类型。例如,
List<T>.Enumerator仅由编译器生成的 foreach 代码隐式使用。真的不建议将它们用于普通类型,CA1034分析仪甚至对此有特殊警告。原因很普通——不方便;每次在外部使用这种类型时,都必须指定包含类型的名称;不能使用 using 缩短它。好吧,从架构的角度来看:嵌套不仅仅是一个范围,它允许嵌套类与包含类的私有成员一起工作。如果这些类的交互逻辑没有必要,最好不要搞砸这种封装违规。类中的类会增加文件大小。如果文件超过三百行,处理起来就不是很方便了。如果您的班级变得太大,则表明可能违反了单一责任原则。
因此,仅当您将重要信息传递给将维护和修改代码的程序员时,才会使用类中的类。如果类
Bar在Foo,那么它必须知道如何Foo。示例:实现备忘录模式:
从模式的描述中,我们了解到一个类
Originator和一个类Memento应该比其他类更了解彼此。这是为了强调这一事实,一个必须放在另一个里面。我将主持并将状态Memento保存Originator和恢复带入其中,使其Originator仅承担主要责任。由于在绝大多数情况下,我们仍然希望隐藏实现细节,因此我们不会经常使用这种技术。