0

クラスがあります: DatabaseService.as このクラスは、ローカルの sqlite 接続を作成し、存在しない場合はテーブルを作成します。接続リンクは、他のいくつかのクラスで使用されます。一部のクラスは起動時に呼び出され、他のクラスはユーザーの操作時に呼び出されます。「DatabaseService」クラスは、データベース接続が開かれたときにイベントを送出します。他のクラスは「DatabaseService」クラスを初期化し、「DatabaseReadyEvent」を待ちます。これはうまく機能しますが、同じクラスから関数/メソッドを数回呼び出す必要がある場合はどうすればよいですか?

例:

mxml コンポーネントに「PrefService」クラスのインスタンスを作成します。「PrefService」は、そのコンストラクターで新しい「DatabaseService」クラスを作成します。次に、「DatabaseReadyEvent」を待機し、SQL クエリを実行します (これは正常に機能します)。しかし、「PrefService」クラスで「addDir」メソッド(およびその他のいくつか)を呼び出す必要があり、sqlConnection プロパティがまだ設定されていないため、エラーが発生します。どうすればこれに対処できますか?私はOOPが初めてなので、おそらく非常に単純なものが欠けています...

私が試したこと/私のアイデア:

  1. 「PrefService」クラスに sqlConnection が存在するかどうかを確認できますが、これはあまり実践的ではなく、何らかの遅延メカニズムが必要になると思います。

  2. また、メソッドごとに「DatabaseService」クラスの新しいインスタンスを作成し、新しいイベント リスナーを追加することもできますが、イベントは言うまでもなく、メソッド呼び出しごとに 2 つの関数が必要になるため、これは非常に面倒です。

このシナリオで最適なオプションは何ですか?

4

2 に答える 2

3

シングルトンへの憎しみは当然のことです。それを使用する習慣を身につけないことをお勧めします。そうすれば、維持するのがどれほど恐ろしいことに気付いたとしても、その習慣を破る必要はありません.

あなたの最大の間違いは、View にサービスを作成して実行させることです。残念ながら、これは FB サービス生成コードの仕組みによって助長されています。代わりに、Robotlegs などのフレームワークによって推奨されるタイプの MVCS (Model-View-Control-Service) に似たものが必要です。

密結合アーキテクチャから疎結合アーキテクチャに移行する方法を順を追って説明するには、この例から始めます。サービスは静的クラスであり、密結合を促進する限り、シングルトンとしてほとんどすべての問題を抱えていることに注意してください。サービスを使用するクラスは 1 つしかありませんが、数十または数百のクラスがそれを参照している大規模なプロジェクトがあるとどうなるか想像してみてください。ここで、何かを変更する必要があると想像してください。イク。

次に、リファクタリングされたプロジェクトを見て、ビューがサービスを呼び出すイベントを生成するだけになるようにします。サービスはまだ静的ですが、この場合、それについて知っていることは 1 つだけです (Mate)。そのため、それを静的にしないようにしたい場合や、別のサービスを使用したい場合は、簡単にできるようになりました。

実際、 Robotlegs を使用するようにリファクタリングされたプロジェクトであるほど簡単に変更できます。私が行ったように、必ずしもフレームワークを使用する必要はありません。コア クラスに含まれる基本構造は、イベントがどのように処理されるか、またはデータがどのようにビューに取り込まれるかについて少しも気にしないことがわかります。フレームワークの使用に慣れていない場合は、独自の方法で処理してください。しかし、フレームワークが登場してからしばらく経ち、まだ思いもよらなかった多くの問題を解決してきました。

于 2012-09-01T15:11:42.143 に答える
2

コードを見ずにアドバイスするのは難しいですが、DatabaseServiceクラスをシングルトンにして、起動ルーチンの一部として(つまり、それを使用するクラスがインスタンス化される前に)一度初期化することを検討する価値があるかもしれません。 。これにより、allを使用するクラスがDatabaseServiceデータベースへの単一の接続リンクを共有し、リンクを使用するときにそのリンクを使用できるようになります。

他の言語では、パターンはクラスコンストラクターのアクセス修飾子をプライベートとして設定する機能に依存しているため(ActionScript 3.0では実行できません)、ActionScriptのシングルトンはかなりの議論を引き起こします。ただし、ここで詳しく説明するいくつかのアプローチから選択できます。

また、シングルトンは一般に、怒りで使用する前に理解する価値のあるかなりの議論を生み出します(OOPに慣れていないことを述べているので、これまでにそうしなかったと思います)。

于 2012-08-31T23:38:34.047 に答える