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


60

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

できます

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

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

[view3 setAlpha:1.0f];

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

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

回答:


134

不変式があります:

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

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

[setActiveView viewID:2]

この機能は次のことを行います。

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

の生の呼び出しに関する複数の利点がありますsetVisibility

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

理想的には、不変条件を強制するために、他の機能がこの設定を台無しにできないようにする必要があります...


素晴らしい提案。これを現在の例で行います。しかし、そのような設計が不可能/望ましくない場合はどうでしょうか?それとも、その場で最善の対処方法を決定しますか?
ケビン

4
@ケビン:それは本当に異なります。コレクションを反復処理することで問題を解決できる場合もあれば、そうでない場合もありますが、重要な原則は重複を避け、不変式を簡単に保存できるようにすることです。物事が適切に機能するためには、より多くの「手動」アクションを記憶する必要があり、物事が適切に機能する可能性が低くなります。私はここで曖昧になるのは嫌いですが、非常に多くの異なる状況があるので、「一般的な」ルールはあなたを惑わすだけだと思います。
マチューM.

23
「不変式を保存しやすくする」ということは、覚えておく価値のある一般的なルールです。
ガスドール

1
@Tonny:グローバル変数の使用を奨励することが「正しく行われる」かどうかはわかりませんが、実際にどちらがアクティブだったかを正確に知っている場合は、2つのビューを更新するだけで済みます。別の解決策は、各ビューがその可視性を記憶しsetVisibility、可視性がすでに要求されている場合は何もしないことです。
マチューM.

1
なつみ 私は急いで書いたが、実際には私も意味したものです。以前の状態がわかっている場合は、最大2つのビューを更新するだけで済みます。その状態を覚える方法は別の問題です;-)。責任を下げることに関して:ビュークラスがそれを提供しない場合、そのプロパティを追加するためだけに別のオブジェクトでクラスをラップする必要があります。それはクリーンなソリューションですが、多分少しやり過ぎかもしれません。
トニー

12

別のアイデア:人々が3つのビューがあることを忘れてバグを防ぐことを目的とし、そのうちの2つだけで実際にすべてを行う必要がある場合は、忘れることを不可能にする関数を作成します。

setViewVisibilities(0.0f, 0.0f, 1.0f)

今、あなたははるかに強力な何かを持っている- あなたは忘れていないコンパイル時間の保証。パラメータを忘れると、コンパイラはあなたに怒鳴ります。これは、関心のあるプロパティを適用する厳密な名前付きプロトコルを作成するため、コメントや不要なコードよりもはるかに便利です。

ケースの場合view3のような特別な値を渡すところ、それは視認性が変わったの必要はありません、あなたはいくつかの動作を追加することができます-1.0か、nilまたはそれらの線に沿って何かを「すべてのビューの可視性を変更しない」を意味します。これにより、不必要に可視性を設定する問題を回避できます。


9
OPが最大10以上のビューを取得すると、ビューごとのパラメーターを維持できなくなります。コンパイル時エラーについてのあなたの主張は正しいですが、残念ながら、これは非常に維持不可能な解決策です。
クリスクレフィス

3
@ChrisCirefice:ビューの数が増えた場合、この不変条件を適用する何らかの「ViewState」オブジェクト/クラスを作成できます。次に、それを切り替えなどに使用します。非常に多くのビューがあるため、何らかの種類のマネージャーオブジェクトがおそらくとにかく理にかなっています。
sleske

8

コールが不要である(そしてその理由)ことを説明するコメントを追加するのが最善だと思います。

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


1
@Niall可能であれば、アサーションはコメントよりも優れています。
200_success

9
コメントは維持不能で読み取り不可能なコードの解決策ではありません
-dj18

2
@Kevinまたはあなたはコメントなしで完全に読めるコードを書くことができます。
1

1
@Janコメントは、コードの機能を説明するだけではありません.......-
ケビン

2
@Kevin私は、コードが何をするのか説明するためにコメントが存在するべきでなく、コードがそれを行っている理由を説明するためにコメントが存在するべきではないと言うでしょう。そして、そのような状況では、多くの場合、リファクタリングはコメントを必要とせずに意図を理解します(これはJanのポイントのように聞こえます)。
RJファルコナー

4

この特定のケースでは、@ Mattieu M.に適切なソリューションがあります。

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

答えは通常「はい」です。つまり、はい、呼び出しを追加する必要があります。フレームワークの将来のバージョンでは、すべてのビューがONではなくOFFで始まる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.