0

遅延インスタンス化のベスト コーディング プラクティスについて質問があります。 

ビュー コントローラーのモデルを構成するカスタム クラス (MainClass) があります。MainClass のプロパティの 1 つは、別のカスタム クラス (SubClass) です。ここで、View Controller から SubClass のいくつかのプロパティにアクセスして設定したいとします。MainClass で SubClass を遅延インスタンス化する必要がありますか?

MainClass で SubClass を遅延インスタンス化すると、プロパティの 1 つを設定するたびに SubClass の存在を確認する (存在しない場合は作成する) 手間が省けます。

一方、サブクラスが存在する場合にのみ、ビューに変数を設定する機能を失います。もっとよく説明しましょう。SubClass.name が存在する場合にのみ、テキストフィールドの stringValue を設定したいとしましょう。SubClass.name の存在を要求するたびに、MainClass は無駄な SubClass を遅延してインスタンス化します。

続行するための最良の方法は何ですか?

4

1 に答える 1

0

それがこの質問の原因である場合は、美学について決心する必要があります。または、パフォーマンスの制約について説明する必要があります。

はい、遅延初期化には長所と短所があります。

利点

  • 一度も使っていないものにお金はかかりません
  • 使用しないオブジェクトに実際にフィールドを設定する必要はありません
  • 必要に応じて、最後の最後にオブジェクトをビルドできます。これは通常、起動時にビルドするよりも望ましい方法です。

短所

  • (わずかな) 複雑さ -- 特にあなたや同僚がイディオムに慣れていない場合
  • アクセサーで Initialize() または同等の呼び出しを忘れると、一部の言語でトリッキーなバグが発生したり、他の言語でクラッシュしたりする可能性があります

ハイブリッドアプローチが可能です。重要なタスクには、遅延インスタンス化を使用します。

 - (void) display {
     [self initialize];
     [self display];
     }

重要でないタスクについては、初期化を確認するだけです。

 - (void) updateCaches {
     if ([self isInitialized]) {
         [self reloadCachedDataFrom: [self startDatabaseSession]];
     }
 }

キャッシュを更新するためだけにオブジェクトを構築したくはありませんが、オブジェクトがライブである場合は、先に進んでキャッシュをウォームに保ちたいと思うでしょう。したがって、オブジェクトが既にインスタンス化されているかどうかを確認し、既に設定されている場合にのみキャッシュをリロードします。

于 2013-03-13T22:01:00.677 に答える