Comment refactoriser cette conception? Le problème est que ces services sont facturés à des débits variés, selon qu'ils sont extensibles ou en fonction de leur type.
Un pourcentage du montant facturé est facturé si le service est prolongé. Les frais de service sont ChargeableAmount * Taux saisonnier, qui diffère pour chaque service.Comment refactoriser cette conception
Je ne veux pas stocker les tarifs dans la classe de service ou l'une des classes dérivées. Serait-ce une bonne idée de créer un fournisseur SeasonalRate qui a des méthodes pour chaque ServiceType qui retourne le SeasonalRate?
Le problème est que les taux saisonniers peuvent changer et changent souvent et nous hésitons à apporter des changements aux classes de service. Nous aimerions également avoir des dépendances maintenables sur les classes de service dans nos classes SeasonalRates.
Est-ce une bonne idée d'implémenter une classe SeasonalRates avec des surcharges pour chaque classe ServiceClass (une sorte de visiteur)? Serait-ce un problème que toutes les classes SeasonalRates devront implémenter des méthodes pour tous les ServiceTypes?
Quelle interface la classe SeasonalRate doit-elle implémenter car il y aura également d'autres classes qui calculeront des taux tels que DiscountRate, ZipCodeRate, etc.?
Si plus de classes ServiceType sont ajoutées, sera-t-il difficile de maintenir les modifications à tous les visiteurs?
Modifier: Tous les tarifs varient en fonction du type de service. Par exemple, SeasonalRates jour et nuit services sont différents
Quels seraient les avantages/inconvénients de l'approche proposée par Jeff Meatball Yang plus en utilisant le modèle de visiteur standard comme suit:
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;
}
}
Salut. Merci pour les ans. Le problème est que toutes les RateStrategies ne sont pas identiques. ZipCodeRate par exemple ne retournera jamais une valeur nulle. De même, il y a d'autres opérations à ajouter, par exemple obtenir une vignette de produit, etc. Cela nécessiterait beaucoup de différents types de base de stratégie et des changements fréquents aux objets Service. –
Vous voulez dire des changements aux objets hérités de RatedService? Chaque fois que vous souhaitez modifier la stratégie utilisée par un type de service, vous devez modifier quelques lignes dans la classe héritée. Aka si vous ne payez pas DayService, vous devrez changer quelque chose dans cette classe. Ce que je propose ici, est de changer: DayService() {super (nouveau DefaultStrategy();} à: DayService() {super (nouveau Discount (0,8));} Il ressemble à un très petit montant des changements ... – NicDumZ
+1: Je fais quelque chose comme ça dans notre application, mais pour les calculs de taxes: J'ai une méthode de stratégie dif selon la province dans laquelle l'application fonctionne. –