0

私は数人の同僚と一緒にウェブサイトに取り組んでおり、クラスアーキテクチャの見方にいくつかの違いがあるため、これを投稿しています。この問題についてより大きなコミュニティがどのように感じているかを確認してください。同様の状況。

アクティブ レコード パターンを介して実装されたモデルで MVC アプローチを使用しています。モデルの 1 つは、データベース内の製品テーブルに関連する「製品」モデルです。つまり、有形 ( type = 1 ) と非有形 ( type = 2 ) の 2 つの主なタイプの製品があります。コード全体を通して、まさにこのタイプの製品に関連する大量のロジックがあります。(有形の場合はこれを行い、無形の場合はあれを行います...)

したがって、1 つのアプローチは、クラス TangibleProduct および NonTangibleProduct を作成し、ファクトリを介してどちらか一方を取得することです。もちろん、これらのクラスには重複するメソッドがあります。つまり、isTangible() または isNonTangible() が両方のクラスに存在しますが、あるケースでは true を返し、別のケースでは false を返します。(これは単なる例です)。製品タイプに基づいて異なる値を返すクラスで、少なくとも約 30 の異なるメソッドが見られると予想しています。

もう 1 つの方法は、Product クラスを 1 つだけ持ち、各メソッドで IF ブロックを実装し、製品が有形または無形の場合にロジックを実行し、結果を返すことです。

これが漠然とした質問であることは承知していますが、OO 環境で作業しているほとんどの人は、ある時点で同様の状況にあったと思います...

あるアプローチを他のアプローチよりも選択した場合、長期的な結果は見られますか? 他のアプローチよりも優れているか、または劣っているアプローチはありますか?

編集:申し訳ありませんが、私はあまりにも明確ではないかもしれません. これら 2 つのクラスは、Product クラスを拡張します。(つまり、「class TangibleProduct extends Product」および「class NonTangibleProduct extends Product」)

ありがとう

4

3 に答える 3

2

アーキテクチャ的に言えば、有形の製品と無形の製品の違いはドメイン内で非常に基本的なものであるため、最良のアプローチは、別々のクラスTangibleProductを用意しIntangibleProduct、両方をインスタンス実装として処理することですIProduct(最初のアプローチのバリエーション)。ORM ツールでこれを実行できる場合は、問題ありません。

2 番目のアプローチは、非常に厳しく回避する必要があります。

于 2012-09-03T10:40:57.580 に答える
1

オブジェクト指向では、この種の区別をクラス階層で行うことが一般的に推奨されます。

ファクトリ メソッドを使用して適切なサブクラスを作成する場合、動作が異なる各メソッドではなく、作成時に 1 回だけ条件付きロジックを実行します。

新しいタイプをより簡単に追加することもできます。決定ロジックが多くのメソッドで繰り返される場合は、それらすべてを変更する必要があります。ファクトリに統合されている場合は、そこにブランチを追加して新しいサブクラスを実装するだけでよく、既存のすべてのサブクラスは変更されないことがよくあります。

于 2012-09-03T10:47:40.420 に答える
0

完全な要件にアクセスできなければ、それを判断するのは困難です。

それは主に、自明ではない方法があるかどうかに依存します。

  1. 有形製品と非有形製品では、動作が大きく異なります。
  2. 有形または無形の製品のコンテキストでのみ意味があります。

次のような多くのメソッドを作成することになった場合:

public void doSomething()
    if (isTangible) {
        [...loads of code...]
    }
    else {
        [...loads of different code...]
    }
}

別のクラスにしたほうがいいでしょう。

于 2012-09-03T10:44:56.800 に答える