-1

次の例を考えてみましょう:

class MyClass
{
    // Getters by copy ?
    public:
        inline std::string fullName() const {return _firstName+_lastName;}

    // Getters by reference ?
    public:
        inline const std::string& firstName() const {return _firstName;}
        inline const std::string& lastName() const {return _lastName;}

    // Data members
    protected:
        std::string _firstName;
        std:::string _lastName;
}

コードのドキュメントでは、参照によるゲッター (クラス データ メンバーへの直接アクセス) とコピーによるゲッター (クラス データ メンバーで構築されたデータへのアクセス) を区別したいと思います。この 2 つの異なるカテゴリに名前を付けるには、どのような言葉を使用できますか?

4

1 に答える 1

1

頭に浮かぶ最初の質問は、名前で操作を区別したい理由です。特に、その分離は、実装の詳細をユーザーに漏らし、カプセル化を失うことを意味するためです。

たとえば、実際のアプリケーションのプロファイリング中に、90% の時間の呼び出し元が使用fullName()し、コピーを作成していないことがわかった場合、タイプを変更して結果をキャッシュし、コストを回避することを検討してください。

class MyClass {
   // ...
   std::string _fullName;
public:
   const std::string& fullName() const {
      return _fullName;
   }
   // One of the options for caching: update on set
   // Could use other, like update on first request...
   void setName( std::string firstName ) {
      _firstName = std::move(firstName);
      _fullName = _firstName + _lastName;
   }
};

命名規則が両方のタイプの関数を区別する場合、プロジェクト内の関数のすべての使用を探して実装の変更に置き換える必要があります。そうしないと、命名がコピーを意味するため、関数がをつくことになりますが、実装はそうではありません。

そうは言っても、私はこれが過去に行われたのを見たことがあります。そこでは、メンバーへの参照を返すだけのアクセサーは、またはのいずれかで命名されgetMember、新しいオブジェクトを作成する操作は、構造を暗示する動詞を含む文として命名されました。composeFullName操作の呼び出しに関連するコストがあることを意味します。私が見た命名規則のこの変更は、実行コストが高い操作に固有のものでした。

于 2012-09-09T14:16:58.547 に答える