5

Scott Meyer 关于非成员函数增加封装并允许更优雅的设计(设计方面)的论点对我来说似乎非常有效。见这里:文章

然而我有这个问题。(似乎还有其他人,尤其是图书馆开发人员,他们通常完全忽略这一点)

当我使用成员函数时,代码通常看起来更好、更合乎逻辑。不过,这可能是一种后天习得的品味,只需要一些时间来习惯先看算法,然后再看对象。(不寒而栗)

所以也许我只有一个问题:

通过成员函数, 我的IDE知道该类可以做什么。

对我来说这是巨大的!我没有使用任何不支持成员函数代码完成的编程。在精心设计的库中,它完全取代了我的文档。即使我会查看 api 文档,查看成员列表也会感觉非常自然、合乎逻辑,我可以肯定,这就是结束。如果该方法不存在,我可以安全地假设它不存在,我可以写我的非会员非朋友。

我在 STL 中忍受了这一点,因为,好吧,将算法与基本组件分开是很有意义的,并且因为你已经习惯了它的因素。

我还没有看到可以告诉我哪些非成员函数在特定类上起作用的 IDE。

这实际上是我的问题:是否有 IDE(或 IDE 功能)可以帮助实现此代码约定?

4

4 回答 4

5

我过去遇到过这件事。

当时我的想法相当笨拙,但完成了工作:命名空间。

我所做的是

namespace myclass
{
    class MyClass
    {
        ...
    };

    MyClass operator+(const MyClass& lhs, const MyClass& rhs){...}
}
于 2009-11-11T13:14:44.330 回答
4

Meyers 肯定是正确的,即使用非成员通过最小化可能访问私有状态的函数数量来增加封装。然而,封装只是代码质量的许多(通常是相互冲突的)方面之一。

他确实提出了一个有效的观点,即库编写者不一定会为类的每种可能用法编写函数(因为可能存在他们没有想到的用法)。这意味着您很可能必须自己添加非成员的“帮助”函数,就像他们遵循 Meyers 的建议时所做的那样。所以没有办法知道成员函数和友元函数集确实是唯一作用于类的函数集。

作为技术专家,我喜欢的“IDE”(文本编辑器和 shell)具有以下“功能”,非常适合查找作用于类的函数:

find . -name '*.h' -o -name '*.cpp' | xargs grep MyClass

我无法评论“真正的”IDE。

于 2009-11-11T12:21:01.423 回答
1

尝试使用 Visual AssistX,它有一个不错的功能:右键单击您的类,重构 (VA X) -> 查找参考。它确实有效。

于 2009-11-11T14:46:45.580 回答
1

我不相信 IDE 可以告诉你所有你可以在你的类中使用的非成员函数。使用模板,列出所有这些功能实在是太困难了。IMO,您可以希望的最好的结果是 IDE 能够在编译之前告诉您您尝试进行的调用是否有效。即便如此,也需要在 IDE 中进行一些严肃的类似编译的过程。

我了解您如何使用成员函数来替代经典类中的文档。但 Scott Meyer 建议的设计不是关于提供复杂功能的类,而是关于基本功能的。复杂的功能来自其他地方,原始类可能知道也可能不知道,这并不重要。这都是想法的一部分。但你是对的。在这种情况下,重新需要经过深思熟虑的文档。

于 2009-11-11T11:18:46.417 回答