web-dev-qa-db-ja.com

コードの明確性を向上させる場合、その時点で効果がない関数を呼び出す方が良いですか?

プログラム(iOSアプリ)に3つのビューがあります。同時にアクティブになるのは1つだけなので、そのうちの2つを非表示にし、ユーザーがボタンを押すと表示を切り替えます。ビューは可視として初期化されているため、メインビューが表示される前にコードで可視性をオフに設定します。

できます

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

2つのビューの場合、現在は3番目のビュー(アプリの起動時に表示されるはずのビュー)には対応していません。私は

[view3 setAlpha:1.0f];

最初の2つが終わった後は、実際には3つのビューがあることは明らかだと思うので、コードを見るときに考えられるような2つではありません。他のプログラマはどのようにこれを行いますか?それは純粋に好みですか、それともいくつかの慣習がありますか?

呼び出しが非常に重い場合、それが必要でないときに呼び出さない方が明らかに良いですが、私の例のような小さなことについては疑問に思っていました。

60
Kevin

あなたは不変です:

単一のビュー(3つのうち)のみがアクティブになります(そして表示されます)。

次に、すべてのビューのアクティビティと可視性を一度に切り替える機能を提供することをお勧めします。

[setActiveView viewID:2]

この関数は:

  • ビューがすでにアクティブかどうかを確認し、不要な作業を回避します
  • ビューをアクティブに設定し、表示します
  • 他の2つのビューを非アクティブおよび非表示に設定します

setVisibilityへのraw呼び出しについては、いくつかの利点があります。

  • フレンドリー:不必要に呼び出してもパフォーマンスの問題は発生しません
  • 防御的:単一のパラメーターをボットするのははるかに困難ですが、setVisibilityの場合、値の範囲は0.0f - 1.0fであり、1つだけを1.0fに設定する必要があることを覚えるのは困難です。
  • 弾力性:次の男が誤ってビューの1つを忘れることはありません
  • 適応可能:ビューの追加/削除には、スイッチがどこにあるかを見つけるためにすべてのアプリケーションコードを精査する必要はありません。単一の関数(この関数)を更新する必要があります。

理想的には、不変条件を適用するために、他の関数がこの設定を台無しにしてはなりません...

134
Matthieu M.

代替案:3つのビューがあることを忘れ、2つだけで実際にすべてのビューで実行する必要があるため、バグの発生を防ぐことが目標である場合は、それを実行する関数を作成します不可能忘れる:

setViewVisibilities(0.0f, 0.0f, 1.0f)

これで、はるかに強力なものを手に入れました-コンパイル時間は、忘れていないことを保証します。パラメータを忘れた場合、コンパイラは怒鳴りつけます。これは、必要なプロパティを強制する厳密な名前付きプロトコルを作成するため、コメントや不要なコードよりもはるかに便利です。

view3で表示を変更する必要がない場合は、-1.0nilなどの特別な値を渡すか、これらの行に沿って何かを「ビューの可視性をまったく変更しません。」これは、不必要に可視性を設定する問題を回避します。

12
Jack

通話が不要であることを説明するコメントを追加することをお勧めします(その理由も)。

(おそらく、呼び出しが不要である、またはそれに関するコメントが必要であるという事実は、コードのにおいかもしれません)

この特定のケースでは、@ Mattieu M.が適切なソリューションを持っています。

同様の変換がないより一般的なケースでは、次のことを自問する必要があります。将来のプログラマがこれを台無しにする可能性はanyありますか?

答えは通常はいです。つまり、はい、通話を追加する必要があります。フレームワークの将来のバージョンでは、すべてのビューがオンではなくオフで始まる可能性があります。

4
Stig Hemmer