1

優れたコード プラクティスと MVC モデルに関する理論的な質問をしたいと思います。

この設計には、RootViewController とシングルトン クラスが含まれています。シングルトンは、アプリ全体で使用できるタイマー オブジェクトを持つコントローラーとして機能します。タイマー オブジェクトは UISwitch と NSTimer で構成され、どちらもシングルトン コントローラーによって所有されるため、必要に応じて UISwitch を新しい viewController に追加でき、アプリ全体でタイマー オブジェクトにアクセスできます。

RootViewController の画面を現在のタイマーのカウントで更新するために、シングルトンで RootViewController へのポインターを作成し、[singeltonOBject setDelegate:self] のように、RootViewController をそのポインターに設定しました。この設計を使用すると、タイマーが作動したときに RootViewController の UILabel にアクセスし、シングルトンから更新できます。通常のデリゲートを実装する時間がなかったので、そうすることにしました。

RootViewController は AppDelegate によって所有されており、シングルトン クラスは明らかに RootViewController によって所有されていないことに注意してください。したがって、保持サイクルはありません。

質問: シングルトンから RootViewController へのポインターを設定し、シングルトン コントローラーから UILable を更新することは、優れたコーディング プラクティスに違反していますか? 満たされていない基本原則はありますか?

ご回答有難うございます!

4

1 に答える 1

5

問題

一般的に、何かが正しく感じられない場合、それはそうではないからです。

コードは機能しますが、将来的に保守するのは簡単ではなく、壊れやすくなります。このコードを二度と見る予定がない場合でも、適切なコーディング規則を実践することは常に良いことです。

より良いコードを書く方法に関するプログラマー向けのヒントがたくさん含まれているThePragmaticProgrammerを読むことをお勧めします。それらのヒントの1つは、モジュール間の結合を最小限に抑えることです。現在、RootViewControllerはSingletonを認識しており、SingletonはRootViewControllerを認識しているため、両方が相互に結合されています。将来、一方を変更すると、もう一方も変更する必要が生じる可能性があります。

別のラベルを追加したい場合はどうなりますか? RootViewControllerにラベルを追加してから、シングルトンを変更してそのラベルも更新する必要があります。

ラベルを完全に削除するとどうなりますか?数年後にこれに戻ってラベルを削除するとします。突然、コンパイルされていない別のクラスがあり、その理由を思い出せない場合があります。アプリケーションの完全に別の部分でコードが壊れています。

次のMVCに関しては、これは違反です。ビューは別の何かによって変更されています。MVCが正しくセットアップされていれば、データ(この場合はタイマー)を制御しているコードを変更することなく、必要な数のビューを表示できるはずです。

これで、メモリ管理に関しては、RootViewControllerがこのシングルトンによって保持されます。シングルトンは、アプリケーションの存続期間全体にわたって存在します。技術的には保持サイクルがありませんが、RootViewControllerの割り当てが解除されることはありません。ほとんどのアプリケーションでは、RootViewControllerは常にスタックの一番下にあるため、これは問題ではありませんが、これは偶然であり、したがって確実にプログラムすることはできません。これは実際には、The Pragmatic Programmer、Do n't ProgrambyCoincidenceからのもう1つのヒントです。

解決

より良い解決策は、あなたが言うようなグローバルタイマーが本当に必要な場合に通知を使用することです(別の話は、グローバルタイマーシングルトンは良い考えのように聞こえないということです)。シングルトン内からラベルを更新するときはいつでも、代わりに通知を発行できます。RootViewControllerはこの通知を受け取り、そのラベルを更新できます。必要に応じて、通知でデータを渡すことができます。将来、ビューに変更を加えて他の何かを更新したい場合は、1つの場所(RootViewController)のコードを変更するだけで済みます。

于 2012-11-08T23:46:33.320 に答える