良好的编程风格,两个类使用彼此的内部类

Posted

技术标签:

【中文标题】良好的编程风格,两个类使用彼此的内部类【英文标题】:good programming style, two classes using each other's inner classes 【发布时间】:2011-05-20 13:29:18 【问题描述】:

我有 A 类,其内部类定义为 A1,B 类的内部类定义为 B1。你认为它的实现中的A类引用B1,B类引用A1可以吗?这不是一种糟糕的编程风格吗?它只是 A1 是非常 A 特定的类,而 B1 是非常 B 特定的,这就是我耦合它们的原因。可以这样留下它还是将A1和B1作为单独的类更好?你怎么看?谢谢。

【问题讨论】:

仅根据您提供的详细信息,我看不出这两种方式有何不同。 【参考方案1】:

我相信如果你需要在你的一个类中引用另一个类的内部类,那是因为可能拥有内部类的类应该提供一些方法来避免这个问题。

如果问题不是这样,那么内部类可能足够通用,可以在其他两个类中使用,因此应该是一个独立类,它可能应该是指定其上下文的同一个包的一部分应用/使用。

【讨论】:

@Luis 但是使用内部类的基本前提是任何其他类都不需要它,那么为什么这是一个好习惯呢?如果错了,请纠正我。 我就是这么说的。内部类只能由其父类使用。在这种情况下使用它是一种很好的做法,因为它可以更好地封装和组织您的代码以及您所代表的概念。如果您需要在其他地方使用该代码,那么它并不意味着是一个内部类。【参考方案2】:

你可以 - 虽然我认为内部类的重点是因为它们应该在外部类中使用。换句话说,我不是公共内部类的忠实粉丝。

我实际上只是将 A1 和 B1 作为其自己的类 - 在我看来 A1 和 B1 毕竟不是特定于 A 和 B 因为 A1 被 B 使用而 B1 被 A 使用。

看这篇帖子Why/when should you use nested classes“当你嵌套的类只对封闭类有用时使用嵌套类”

【讨论】:

是的,但是您所指的帖子是针对 .NET...类。例如,如果没有对实例的显式引用,C# 嵌套类就无法访问外部类的非静态方法。所以我认为这个链接不能直接翻译。 是的,但它仍然提供了适用于 OO 概念的一般概念视图 在下面查看我的答案...IMO 嵌套类主要用于利用/利用语言细节。【参考方案3】:

我可能会尝试两件事:

    将内部类移到单独的类中,因为它们在逻辑上不再是内部类。

    创建一些接口,让 A 和 B 至少不知道 A1 和 B1 类在哪里。

【讨论】:

【参考方案4】:

我会说如果两个类都在同一个包中,请提取内部类并将它们设为私有包。这样,两个类(A 和 B)都可以引用它们,但它们对于包外的其他类仍然是不可见的。

【讨论】:

【参考方案5】:

我认为您已将两个独立的设计问题合二为一。第一个问题是关于引用另一个类的内部类。第二个问题是关于A/A1和B/B1之间的循环依赖。

暴露的内部类

使用 Java 内部类的原因有很多。

    仅与彼此和外部类相关的组类。 (又名小包装) 减少传递和引用外部类实例的样板代码 在包之外添加额外级别的范围 扩展 Java 访问范围的语义...例如,private 对于外部类——内部类交互具有不同的含义。 减少源文件的爆炸...尤其是在(源)代码生成场景中。 访问外部类内部进行测试(内部类可以在 JAR 打包期间删除)。

在许多情况下,通过名称引用内部类是完全合理的。

循环依赖

这通常是需要提取接口或需要提取其他专用类的迹象。 如果 A1、B1 太简单而无法提取接口等,那么也许您可以以不同的方式使用内部类:拥有外部类 C,包含 A1、B1。

【讨论】:

以上是关于良好的编程风格,两个类使用彼此的内部类的主要内容,如果未能解决你的问题,请参考以下文章

Python编程规范与风格指南(开发者入门必读)

三种违反面向对象编程风格的典型代码设计

Google C++ 编程风格指南:类

阿里巴巴Java 开发手册编程规约之命名风格

《自拍教程》Python编程风格规范

编程规约一