web-dev-qa-db-ja.com

プロパティセッターにロジックを追加することは悪い習慣と見なされますか?

プロジェクトに飛び込んだところ、他の開発者が合成プロパティのセッターに多くのロジックを追加していることがわかりました。これがどのように機能するかは理解していますが、プログラムの流れを理解するのは難しいと思います。コードを読んでいる間、いつでもself.something = whateversomethingのセッターがオーバーライドされているかどうかを常に確認します。

このトピックに関するあなたの意見は何ですか?これは、アーキテクチャが悪いことを示しているのか、それとも手の込んだ解決策なのでしょうか?

関連するリンク/ソースがあれば、これについてもっと読んでいただければ幸いです。Googleで良い結果を得るのは非常に難しいので、ここでも質問することにしました。

答えてくれてありがとう。タグを見たことがない場合に備えて、私はObjective Cについて話していることに注意してください(これは言語固有の問題ではないはずですが)。

28
phi

プロパティセッターにロジックを追加することは悪い習慣と見なされますか?

いいえ

プロパティは、クラスの設計者がフィールドへのアクセスと割り当ての便利なインターフェースにロジックを接続できるようにするために発明されました。

いくらですか?それはクラスの責任に依存します。次に、プロパティセッターに配置するのが妥当ないくつかの事項を示します。

  • 一部の派生値を更新する
  • クラスの状態が変化したことをオブザーバーに通知する
  • 含まれているオブジェクトに変更を伝播する
  • 変更をバッキングストアに伝播します
  • 検証を実行する

クラスにできることを明確にするインターフェースがクラスにある場合、呼び出し側にそれがどのように行われているかを考えさせることなく、プログラミングが簡単になります。ロジックをプロパティセッターの背後に配置することで、クラスは実装を単純なインターフェースの背後に隠すことができます。一部のクラスでは、メソッドは必要ありません。プロパティを設定してノブを回し、プロパティを取得して出力を読み取ります。

44
kevin cline

セッターは通常、オブジェクトの状態を変更するために使用され、重大な副作用や重い計算はありません。そのためのメソッドと関数を使用します。 setter実装の主な理由は有効な状態の変更と維持です。したがって、範囲を制限したり、フラグを設定して再計算を要求したり、関連するプロパティを調整したりしても問題はありません。

15

私はObjective Cについては知りませんが、あなたが言うように、すべてのOO言語にとって十分に一般的な質問のようです。まず第一に、実際にそれに関連して、setterとgetterを最初の場所は議論の問題です(場合によっては、それらの存在はフレームワークまたはライブラリの使用によって正当化されます)。

メソッドの名前は、メソッドの機能とすべてのメソッドの機能を説明するものである必要があると思います。さらに、そのメソッドに関連するドキュメントでは、より明確な方法でそれを説明する必要があります。この意味で、 "set" + {名詞}の形式のメソッド名には、変数の値を設定する以外の副作用があってはならず、それに関連する唯一のアクションである必要があります。引数が有効であることを確認することは受け入れられますが、ドキュメントに記載する必要があります。

7
DPM