0

(この質問には深刻なことは何もありません)

「悪いアプリケーションアーキテクチャ」の例を読んだことがあります。

「レンダリング アプリケーション」(私が覚えている限りではブラウザ)があったので、TagA、TagUL、TagDIV クラスで「render()」メソッドを使用することは、非常に悪い習慣であると言われました。 render-code」がいたるところに塗られていました。そのため (この例では)、彼らはレンダリングを実装する RenderA、RenderUL、RenderDIV クラスを用意するようアドバイスしました。そして、タグ オブジェクトはそれらのレンダラーをカプセル化します。

なぜそれが悪い習慣なのか理解できません。この場合、多くのレンダリング コードが Render-* オブジェクトの周りに塗り付けられます。そして最後に、多くのオーバーライドされたメソッドを持つ Redner-singleton を使用しないのはなぜですか? それは、少なくとも、より安く聞こえます。

それをよりよく理解するために何を読むべきですか?

4

2 に答える 2

3

これらの異なるオブジェクトすべてのレンダリングは同じですか?もしそうなら、それは一度だけ、おそらく基本クラスで実装されるべきです。これは、完全に異なる目的を果たすシングルトンよりも優れたソリューションです。主に、一度だけ存在する必要があるリソース(メソッドではなくリソースに注意)を実装することです。

render()の各実装が異なる場合(ほとんどの場合)、それらが別々のオブジェクトに実装されていても問題はありません。これはポリモーフィズムと呼ばれます。ただし、おそらく実行する必要があるのは、render()メソッドが基本クラス(ほとんどの場合抽象クラス)で定義され、派生クラスに実装されているクラス階層を作成することです。これにより、インターフェイスが効果的に形式化されます。つまり、上記の基本クラスから継承するすべてのクラスで、render()メソッドが使用可能になり、それを実装する必要があります。

レンダリングコードの共通部分と派生クラスに固有の部分がある場合は、すべての派生クラス実装で共通部分を複製する代わりに、テンプレートメソッドパターンを使用できます。これにより、基本クラスメソッドが使用されます。共通の部分を実行し、派生クラスの実装を呼び出すように調整します。これはC++での擬似コードの例です

class TagBase {
public:
    void render() {
        // do some common stuff here
        doRender();
        // do some more common stuff here
    }

    virtual void doRender() = 0;
    ....
};

class TagA : public TagBase {
public:
    virtual void doRender() {
        // do your specific stuff here
    }
};

ここにいくつかの良い本があります:

于 2012-05-29T10:11:26.450 に答える
1

なぜそれが悪い習慣なのか理解できません。

それ自体をレンダリングするのがタグの責任ではない場合、それは悪い習慣かもしれません -単一責任の原則を参照してください。

たとえば、Tag クラスに既に HTML 解析動作が含まれていて、それにレンダリングを追加した場合、2 つの責任、2 つの変更理由、および場合によっては壊れる理由があります。それらのコロケーションにより、解析はレンダリングと密接に結合され、多くの問題が発生します。

  • たとえば、デスクトップ ブラウザーのレンダリングに加えてモバイル ブラウザーのレンダリングを追加するには、解析動作が繰り返される別のクラスを記述する必要があります。より集中した責任を持つ小さなクラスは、より多くの可動部分と追加されたモジュール性を意味します。

  • クラスに組み込まれる責任が増えるほど、クラスに変更を加えたときに、バグや副作用が偶発的に発生する可能性が高くなります。多くの場合、2 つの責任のどちらがバグの原因であるかを判断するのは困難です。

  • クラスの 1 つだけを変更した場合でも、クラスに含まれるすべての責任を再構築、再テスト、および再展開する必要があります。

  • また、他の責任が干渉する可能性がある場合、責任の 1 つをデバッグすることもより困難になります。

于 2012-05-29T12:43:56.440 に答える