0

私は次のオブジェクトモデルを持っています:

class CheckoutAd{
  int AdId;
  int ImpressionCap;
  int ClickCap;
  int ConversionCap;
  // ...
}

class SiteAd{
  int AdId;
  int ImpressionCap;
  int ClickCap;
  //...
}

ご覧のとおり、重複したコードがあります。そこで、重複したコードを基本クラスに配置し、上記のクラスを基本クラスから次のように拡張することにしました。

class BaseAd{
   int AdId;
   int ImpressionCap;
   int ClickCap;
} 

しかし、それから私は、この基本クラスが適切な候補ではないかもしれないというMobileAdクラスがある将来について考え、それを変更する必要があります。

代わりにこれらのプロパティを委任する必要がありますか?

どうしますか?

戦略パターンを使用する必要がありますか?この動作をどのように委任しますか?

4

4 に答える 4

3

重複するコードはありません。同じ名前と型のメンバーを持ついくつかのクラスが表示されます。

Is CheckoutAd a SiteAd? (yes inherit)
Does CheckOutAd have a SiteAd? (yes aggreate)
No to both, leave them the heck alone..
于 2012-08-09T21:29:42.143 に答える
0

メソッドが重複しない限り、継承について考える必要はありません。あなたは共通の分野を持っているので、何ですか?私はあなたが何を意味するのか正確に推測することはできませんが...、これは無意味なことだと言えます。したがって、基本クラスは一般化されたフィールド自体をまったく使用しません。

私のチームでは、複製されたフィールドを基本クラスに移動することについていくつかの衝突がありました。基本クラスに共通フィールドを残すと、SRPに違反する可能性があります。将来について言えば、特定のフィールドに機能的なゲッター/セッターを提供して、何らかの副作用を与えることを決定する場合があります。基本クラスのインターフェイスから表示されるため、アクセスを完全に制御することはできません。

2つのクラスで同じ名前のフィールドには、異なる動作が関連付けられている必要があります。動作が同じ場合は、基本クラスを作成し、そこで重複したメソッドを抽出します。

したがって、私の一般的な推奨事項:リンクされた動作を一般化しない限り、データメンバーを一般化しないでください

PSトニーホプキンソンはそれをまっすぐに言った

于 2012-08-09T21:41:29.107 に答える
0

将来のクラスについては推測できないので、ここで見ると、これはインターフェイスまたは抽象クラスのどちらにも最適な場所です。

Absractクラスには、オーバーライドする必要があるメソッドとプロパティを入力できます。

空のプロパティがあるだけなので、インターフェイスの方が適切に見えます。

見てみましょう:C#インターフェース-ポイントは何ですか?

于 2012-08-09T21:14:23.180 に答える
0

これは、アプリケーション、目標、および時間枠に大きく依存します。

複雑さを軽減すると思われるソリューションを実装する必要があります。オブジェクトが動作とデータを共有し、それらを基本クラスから継承することで、アプリケーションがより理解しやすく、読みやすくなり、混乱しにくくなる場合は、必ず、すべてのユースケースを特定してください。広告、基本クラスを構築し、継承します。

やりたくないことは、まだ考えていない「可能な」シナリオに基づいて設計を選択することです。あなたは、現在の状態にとって意味をなさない何か、そして起こらないかもしれない何かのための構造を不必要に含んでいる何かになってしまうでしょう.

今考えられる広告の種類をすべて特定してください。動作、データ、共有なし、またはその両方を共有するかどうかを識別します。動作を共有する場合は、動作を定義する基本クラスから継承します。動作とデータを共有する場合は、動作とデータを定義する基本クラスから継承します。それらがデータを共有する場合は、そのデータをクラスのインスタンスに含めます。

目標は複雑さを軽減することです。今すぐ最も簡単な解決策を採用し、問題が発生したときにそれを繰り返します。発生する可能性があると推測する問題を想定して設計しないでください。

于 2012-08-09T21:25:16.330 に答える