5

非メンバー関数はカプセル化を増やし、よりエレガントなデザイン (デザイン的に) を可能にするという Scott Meyer の主張は、私には非常に有効に思えます。こちらをご覧ください:記事

しかし、私はこれに問題があります。(そして、他の人たち、特に通常これを完全に無視するライブラリ開発者たちもそうです)

メンバー関数を使用すると、通常、コードはより適切で論理的に見えます。ただし、これは後天的な好みである可能性があり、最初にアルゴリズムを見て、次にオブジェクトを見ることに慣れる必要があります。(身震い)

だから多分私は1つだけ問題があります:

メンバー関数を使用すると、 私のIDEはクラスで何ができるかを理解できます。

私にとって、これは巨大です!プログラミングのメンバー関数コード補完をサポートしていないものは何も使用しません。適切に設計されたライブラリでは、ドキュメントが完全に置き換えられます。そして、API doc を見ても、メンバー リストに目を通してみると、非常に自然で論理的であり、まあ、これで終わりだと確信できます。メソッドがそこにない場合は、それが存在しないと安全に仮定でき、非メンバー非友人を書くことができます。

私は 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 の意見は確かに正しいです。ただし、カプセル化は、コード品質の多くの (しばしば矛盾する) 側面の 1 つにすぎません。

彼は、ライブラリの作成者が、クラスの考えられるすべての使用法に対して必ずしも関数を作成するとは限らないという有効な指摘をしています (彼らが考えていない使用法があるかもしれないため)。これは、Meyers のアドバイスに従った場合と同様に、メンバー以外の「ヘルパー」関数を自分で追加する必要があることを意味します。そのため、メンバー関数とフレンド関数のセットが実際にクラスに作用する唯一の関数セットであることを知る方法はありません。

技術者として、私が好む "IDE" (テキスト エディターとシェル) には、クラスで動作する関数を見つけるのに非常に適した次の "機能" があります。

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

「本物の」IDE についてコメントすることはできません。

于 2009-11-11T12:21:01.423 に答える
1

IDEが、クラスで使用できるすべての非メンバー関数を通知することは不可能だと思います。テンプレートを使用すると、そのようなすべての関数のリストを作成するのは非常に困難です。IMO、あなたが望むことができる最善のことは、IDEがコンパイルの前にあなたが行おうとしている呼び出しが有効であるかどうかをあなたに伝えることができることです。それでも、IDE内でのコンパイルのような深刻なプロセスが必要です。

クラシッククラスのドキュメントの代わりにメンバー関数を使用する方法を理解しています。しかし、Scott Meyerが提案する設計は、複雑な機能を提供するクラスではなく、基本的な機能だけです。複雑な機能は他の場所から来ています。元のクラスはそれを知っているかもしれませんし、知らないかもしれません。それは実際には重要ではありません。それはすべてアイデアの一部です。しかし、あなたは正しいです。その場合、よく考えられたドキュメントが新たに必要になります。

于 2009-11-11T11:18:46.417 に答える
1

Visual AssistX を使用してみてください。この優れた機能があります。クラスを右クリックし、リファクタリング (VA X) -> 参照を検索します。実際に動作します。

于 2009-11-11T14:46:45.580 に答える