2011-01-09 15 views
1

誰かがこれを設計する必要がありますどのような方法を共有することができます:フラッシュ/ ActionScriptの - アプリケーション設計の質問

のは、私がEntriesを使用して構築されたいくつかのデータモデルを、持っているとしましょう。 ( - それはケースのためにそれほど重要ではありませんまたはインタフェースIEntry)と、このクラスのいくつかの実装がある -

基本的に、私は1つの抽象クラスEntryを持ってMovieEntrySoundEntryFoodEntryを、何でも...

の各それらはいくつかのデータ(URL、説明、カロリー数など)のラッパーであり、このデータはそれぞれの対応するクラスにまとめられています。


今 - 私は、画面上の表示にエントリのデータをご希望の場合は(のはMovieEntryのための映画のポスターや注釈を言わせて) - 私はそれをどのように設計する必要がありますか?

もちろん、私は別のインターフェイス/抽象クラスを提供し、DrawableEntryそれを呼び出す(そしてそれがSpriteを継承する)、次にようになりますDrawableMovieEntryDrawableSoundEntryのようなクラスの束構築することができ:

class DrawableMovieEntry extends DrawableEntry { // which also extends 'Sprite' 

    private movieEntry:MovieEntry; 

    public override function draw(backend:*) { 
     // Draw everything using the 'movieEntry' reference 
     // stored. 
}; 

をしかし、これは小規模なアプリケーションのための過度の種類のようです。

別のアプローチはMovieEntrySoundEntry、...拡張スプライトを作成し、描画の実装そのものを提供することである - それは、可視化ルーチンをだと、データが強く結合された状態になるので、これは、明らかに悪いです。

これはどのように行う必要がありますか?たぶん、MVCのアプローチにはこのようなケースがありますか?

+0

シンプルなミニサイトやプレゼンテーションのようなものであれば、アプリケーションに依存しますが、これについてはあまり心配しないでください。最も一般的に使用されている動作は、ビュー・クラスにあり、ベース・ビュー・クラスでコード化し、それぞれ別々のビューで拡張できます。また、描画メソッドをオーバーライドする必要のあるクラスがいくつかあります。 –

答えて

1

あなたのユースケースは、Strategy patternまたはCommand patternの完全な例のようです。 1簡単である
戦略は、ここでの例です:

は、このようなIDrawStrategyインターフェイスを作成します。

package { 
    public interface IDrawStrategy { 
    function draw(obj:Object) : void; 
    } 
} 

は、いくつかのDrawStrategies実装します

package { 
    public class SoundEntryDrawStrategy implements IDrawStrategy { 
    public function draw (obj:Object) : void { 
     // cast obj to SoundEntry and do all the drawing necessary, 
     // or fail if obj is null or not a SoundEntry 
    } 
    } 
} 

package { 
    public class MovieEntryDrawStrategy implements IDrawStrategy { 
    public function draw (obj:Object) : void { 
     // cast obj to MovieEntry and do all the drawing necessary 
     // or fail if obj is null or not a MovieEntry 
    } 
    } 
} 

など

を次に追加しますエントリークラスに新しいメンバー:

private var _drawStrategy:IDrawStrategy; 

とsetterを作成します。

public function set drawStrategy (strat:IDrawStrategy) : void { 
    _drawStrategy = strat; 
} 

とドロー法:

public function draw() : void { 
    _drawStrategy.draw(this); 
} 

あなたは今、あなたのエントリのそれぞれにフィッティング戦略を割り当て、実行することができます。

var mov:MovieEntry = new MovieEntry(); 
mov.drawStrategy = new MovieEntryDrawStrategy(); 
mov.draw(); 

BTW Spriteで情報を描画することはできますが、DrawStrateのメンバーにすることはできませんgyクラスですが、後でclear()メソッドを追加したい場合は、参照を保持する方が良いでしょう)。

1

データモデルを作成するエントリは、とりわけ値オブジェクト(VO)またはデータ値オブジェクト(DVO)と呼ばれます。あなたの最後の質問に最初に答えるために、私はを絶対ににします.VOはVOクラス以外のものを拡張していますので、後でSpriteを拡張しないでください。

階層を超えています。具体的なサブクラスを作成するために抽象クラスEntryを拡張していますが、可能なインタフェースについても言及しているので、extendを使うべきかどうかはわかりません。値オブジェクトが実際に共通のプロパティを共有する場合にのみ、共通の基本クラスを使用してください。すべてのエントリにtitleプロパティがある場合は、それをEntryに入れてサブクラス化します。あなたの要約が空の場合は、代わりにマーカー(=空)インターフェイスを使用することをお勧めします。

私は値オブジェクトのための共通のマーカーインターフェイスを持っています。これは、xmlの解析や合成などの機能を追加するためのより特定のサブインターフェイスを備えています。このためにインターフェイスを使い始めると、簡単に拡張できます。

次に表示します。あなたの例はまだかなり広いので、これには正解は一つもありません。しかし、VOを保存してそれ自体を再描画する方法を使って、オブジェクト全体にVOを渡します。

interface IEntryDisplay { 
    redrawWithEntry(entry:IEntry):void; 
} 

オブジェクトを全体として渡すには、IEntryインターフェイスを使用します。あなたの実装では、is Type条件のifカスケードを使用して図面を実行します。

public function redrawWithEntry(entry:IEntry):void { 
    this.entry = entry; 

    if (entry is MovieEntry) { 
     title.text = MovieEntry(entry).title; 
    } else if (entry is SoundEntry) { 
     title.text = "(Sound) "+SoundEntry(entry).fileName; 
    } 
} 

エントリ階層の基本クラスを使用する場合は、インターフェイスの代わりにそのクラスを使用します。必要なオブジェクトに近い値のオブジェクトタイプを求めるメソッドを必要とします。

ディスプレイクラスにエントリを格納するので、後でディスプレイをクリックしたときや、何か他のことをしたいときに、すぐに渡すのは簡単です。

これは役に立ちますか?