内部データの取得と設定:戻り値の型、エラーの場合の動作

内部データを保持するC ++クラスがあり、外部に公開され、変更可能でなければなりません。

class Container {
  public:
    ... get( int key ) const;
    ... set( int key, int value );
  private:
    std::vector m_values;
};

問題は、戻り値の型 get() set()ができることです。 get()の場合:

  1. const int& get( key ), reference to const value.
  2. const int* get( key ), pointer to const value.

参照を使用するときは、指定されたキーがコンテナに存在しないときに何かが発生しなければなりません。例外?または、 m_values にアクセスして放棄するだけですか? assert に依存していますか?

ポインタ戻り型は、無効な操作を示す nullptr を返すことができます。しかし、これは、発信者がそこにないものを要求することによって一般的に何か間違ったことを意味しないでしょうか?

set()の場合:

  1. void set(key、value)
  2. bool set(key、value)

void のバージョンは無効なキーや値を無視します。再度:エラーが発生した場合の対処方法

成功すると bool のバージョンは true を返し、キーや値が無効な場合は false を返します。また、ここで get()と同じです:無効なキーや値を指定すると、ユーザはおそらく何か間違ったことをしました。

むしろ、アプリケーションをクラッシュさせて、ユーザーが間違って使用したことを示したり、結果の戻り値をチェックするユーザーに頼ったりしますか?

1
std :: vectorを考慮すると、多くのエラーチェックをしない単純な get&set が既にあります。私はあなたの Container
追加された 著者 parapura rajkumar,
key が悪い場合は std :: invalid_argument を投げたと考えましたか?
追加された 著者 moshbear,
@parapurarajkumar std :: vector はもちろん単なる例であり、あなたが言ったようにエラーチェックをあまり行わないので、あなたがしていることを確認する必要がありますそれは正しいです。それはおそらく私がここで求めている質問でしょう。
追加された 著者 stschindler,
@moshbearはい、私はそれが良いスタイルであるかどうか自分に尋ねています。 get()がスローされた場合、有効なキーを確認するための has(key)メソッドが存在する必要があります。 > get() 内部的に正しいキーがあるかどうかをチェックします。または、私は時期尚早最適化についてあまりにも心配していますか? ;-)
追加された 著者 stschindler,

1 答え

ゲッターにとって、私は価値あるところへの復帰も考えています。ポインタ(yuk)や参照を返すことで、インタフェースの変更を行うのが喜ばない限り、後日クラスの内部を再実装するオプションが制限されます。

考案された例として、

class Person
{
public:
   //Returns height in metres
    const int &getHeight() const { return height; }

private:
    int height; //Height in metres
};

後日、高さをミリメートル単位で保存するように内部構造を変更するとどうなりますか?私たちはこれを行うことはできません:

const int &getHeight() const { return height/1000; }

セッターについては、よく、失敗にどう対処するかはあなた次第です。

1
追加された
@タンク:確かに;私はby-valueが best という選択肢であると言っているわけではありません。
追加された 著者 Oliver Charlesworth,
値を返すことは、オブジェクトに参照を保存したくない場合は問題ありません。私の例では、 int sでも問題ありませんが、 Container は他の場所で参照されているオブジェクトを保持している可能性があります。
追加された 著者 stschindler,