【发布时间】:2023-09-03 01:10:01
【问题描述】:
免责声明:这个问题是针对那些认为 Scott Meyers 在有效 C++ 的第 23 条中的建议是良好的 OO 设计的人——至少在 C++ 中是这样。
在不存在全局函数的 Java 中,这个原则起初似乎不适用,但在我看来确实适用。以 Scott Meyers 自己为例。
public class WebBrowser {
public void clearCache() {}
public void clearHistory() {}
public void removeCookies() {}
}
通过创建一个包含 static 便捷方法的关联“命名空间”类,我通过最小化可以访问其内部的代码量来增加对WebBrowser 的封装。毕竟,Java 中的静态方法本质上是全局函数(假设类中的所有内容都是公共的和静态的)。
public class WebBrowserStuff {
private WebBrowserStuff() {} // prevent instantiation
public static void clearBrowser(WebBrowser browser) {
browser.clearCache();
browser.clearHistory();
browser.clearRemoveCookies();
}
}
我能看到的唯一缺点是 Java 中没有依赖于参数的查找,因此调用该方法会稍微冗长一些。
WebBrowserStuff.clearBrowser(browser);
我的问题是,鉴于在 C++ 中这种使用非成员函数是可取的(请参阅我的免责声明),除了增加冗长之外,还有什么理由不希望在 Java 中这样做?这个问题专门针对 C++ 和 Java 在这种技术方面的区别。
我不有兴趣听取个人意见,这是否是一个好的面向对象设计,尽管我有兴趣了解是否存在任何文化差异在 C++ 和 Java 之间,这可能会导致普遍意见偏向一种或另一种。
[编辑]
不幸的是,我并没有真正得到我的问题的答案,我试图减少基于意见的编辑并没有阻止它被关闭,所以我无法选择一个可接受的答案。可以将其解释为确实没有技术原因您不想这样做(假设这是 C++ 中的良好实践),任何反对这种技术的行为纯粹是个人的或 Java 文化的事情。
【问题讨论】:
-
这些被称为 Helper 类,非常常见,通常被认为是不好的做法。见blogs.msdn.com/b/nickmalik/archive/2005/09/06/461404.aspx
-
在我看来这个问题不是基于意见的。
标签: java c++ interface encapsulation convenience-methods