このデザインをどのようにリファクタリングする必要がありますか?このデザインをリファクタリングする方法
class Service : IChargeable, IExtendable<br />
{
}
interface IChargeable
{
decimal? ChargeableAmount {
get;
}
}
interface IExtendable
{
bool IsExtendable {
get;
}
}
class DayService : Service { }
class NightService : Service { }
class TwentFourService : Service { }
問題は、これらのサービスが、拡張可能かどうか、またはそのタイプによって異なる料金が課されることです。
サービスを延長すると課金可能額の割合が課金されます。サービス料金はChargeableAmount * Seasonal rateで、サービスごとに異なります。
私はサービスクラスまたは派生クラスのいずれかに料金を保存したくありません。 SeasonalRateを返す各ServiceTypeのメソッドを持つSeasonalRateプロバイダを作成することをお勧めしますか?
問題は、季節的な料金が変更され、頻繁に変更される可能性があることです。サービスクラスを変更することには注意が必要です。また、SeasonalRatesクラスのサービスクラスに対するメンテナンス可能な依存関係を維持したいと考えています。
ServiceClass(ビジターの一種)ごとにSeasonalRatesクラスをオーバーロードして実装することをお勧めしますか?すべてのSeasonalRatesクラスですべてのServiceTypeのメソッドを実装する必要がありますか?
SeasonalRateクラスは、DiscountRate、ZipCodeRateなどの料金を計算する他のクラスも存在するため、どのインターフェースを実装する必要がありますか?
さらにServiceTypeクラスが追加されると、すべての訪問者に変更を維持することは難しいでしょうか?
編集:すべての料金はサービスタイプによって異なります。例えば、昼と夜のサービスのためのSeasonalRatesは次のように標準のVisitorパターンを使用して上ジェフミートボールヤンによって提案されたアプローチの長所/短所だろう何異なる
あり、以下:
interface IVisitable
{
Accept(IVisitor visitor);
}
interface IVisitor
{
Visit(IVisitable visitable);
}
interface IRate
{
Rate { get; }
}
class Service : IVisitable
{
public virtual Accept(IVisitor visitor);
}
class Visitor : IVisitor
{
public virtual Visit(IVisitable visitable) { }
public virtual Visit(DayService visitable) { }
public virtual Visit(NightService visitable) { }
}
class RateVisitor : Visitor, IRateVisitor
{
decimal? _Rate;
override Visit(IVisitable visitable) { };
override Visit(DayService visitable) { // Logic Goes here, sets the _Rate Variable };
// Overrides for other services
public virtual Rate
{
return this._Rate;
}
}
こんにちは。 ansのThx。問題は、すべてのRateStrategiesが同じではないということです。例えば、ZipCodeRateはnullを返すことはありません。同様に、製品サムネイルなどを取得するなど、他の操作も追加する必要があります。これには、さまざまなStrategy基本タイプとServiceオブジェクトの頻繁な変更が必要です。 –
RatedServiceから継承したオブジェクトの変更を意味しますか? サービスの種類によって使用される戦略を変更するたびに、継承したクラスのいくつかの行を変更する必要があります。あなたがDayServiceを割引すれば、そのクラスで何かを変更する必要があります。 私がここに提案しているのは、変更することです: DayService(){super(new DefaultStrategy();} to: DayService(){super(new Discount(0.8));} 非常に小さい変更の量... – NicDumZ
+1:私はこのアプリでこのようなことをしますが、税計算のために:アプリケーションが機能している地域に応じてdif戦略メソッドがあります。 –