Lassen Sie uns zuerst das Problem lösen, das Sie heute haben, was eine Möglichkeit ist, den repetitiven Berechnungscode zu bereinigen.
mit zu beginnen, müssen wir das stratgey Muster zu Ihrer Preisberechnung werden die Definition der Schnittstelle der Berechnung und Bewegen der unterschiedlichen Berechnungslogik-Code in ihre neue Heimat anzuwenden:
// calculation common interface
public interface IPriceCalculation
{
public InsurancePrice CalculatePrice(CarData data);
}
// result from the calculation
public class InsurancePrice
{
public string Description { get; set; }
public decimal Price { get; set; }
}
// concrete implementations
public class BrandDealerMonthlyPaymentCalculation : IPriceCalculation
{
public InsurancePrice CalculatePrice(CarData data)
{
// logic to perform calculation of BrandDealer = true, MonthPayment = true
// just for example...
return new InsurancePrice()
{
Description = "Policy price with a Brand dealer and monthly payments",
Price = 250.25;
};
}
}
public class BrandDealerYearlyPaymentCalculation : IPriceCalculation
{
public InsurancePrice CalculatePrice(CarData data)
{
// logic to perform calculation of BrandDealer = true, MonthPayment = false
}
}
public class NonBrandDealerYearlyCalculation : IPriceCalculation
{
public InsurancePrice CalculatePrice(CarData data)
{
// logic to perform calculation of BrandDealer = false, MonthPayment = false
}
}
public class NonBrandDealerMonthlyCalculation : IPriceCalculation
{
public InsurancePrice CalculatePrice(CarData data)
{
// logic to perform calculation of BrandDealer = false, MonthPayment = true
}
}
Mit den Berechnungen definiert, Sie installieren sie. Innerhalb der Klasse, die die GetInsurance-Methode definiert (wir nennen es InsuranceFactory), werden wir dies in Ihrem ctor tun.Dies könnte über eine andere Klasse erfolgen treibt sie über Eigenschaften in über config über DI, was auch immer, aber der Ctor einfachste zur Veranschaulichung ist:
public class InsuranceFactory
{
private List<IPriceCalculation> _priceCalculators = new List<IPriceCalculation>();
public InsuranceFactory()
{
_priceCalculators.Add(new BrandDealerYearlyPaymentCalculation());
_priceCalculators.Add(new BrandDealerMonthlyPaymentCalculation());
_priceCalculators.Add(new NonBrandDealerYearlyCalculation());
_priceCalculators.Add(new NonBrandDealerMonthlyCalculation());
// easy to add more calculations right here...
}
}
Als nächstes werden wir Ihre GetInsurance Methode in der InsuranceFactory Klasse erneut oben:
Beachten Sie, wie sich Ihre GetInsurance-Methode nicht mehr jedes Mal ändern muss, wenn Sie eine neue Berechnung erstellen. Wenn Sie die Ergebnisse in einer Liste innerhalb des Versicherungsobjekts speichern (insurance.PriceOptions
), muss Ihre Versicherungssparte auch nicht geändert werden. Ihr UI-Code kann alle Optionen darstellen, indem er diese Liste wiederholt. Dieses Beispiel ist etwas vereinfacht, aber sollte Sie weiterbringen.
Jetzt ein paar Worte zu einem möglichen zweiten Problem, das ich erwarten kann. Wenn Ihre Berechnungsunterklassen zusätzliche Permutationen haben, werden Sie eine Klassenexplosion haben. Zum Beispiel haben Sie jetzt 2 Faktoren (Brand und PaySchedule) mit jeweils 2 Wahlmöglichkeiten, die Ihnen 2 x 2 = 4 Klassen geben. Aber was ist, wenn wir Credyscore mit 3 Wahlmöglichkeiten hinzufügen (Goor, Fair, Poor)? Dann erhalten Sie:
GoodCreditBrandDealerYearlyPaymentCalculation
GoodCreditBrandDealerMonthlyPaymentCalculation
GoodCreditNonBrandDealerYearlyCalculation
GoodCreditNonBrandDealerMonthlyCalculation
FairCreditBrandDealerYearlyPaymentCalculation
FairCreditBrandDealerMonthlyPaymentCalculation
FairCreditNonBrandDealerYearlyCalculation
FairCreditNonBrandDealerMonthlyCalculation
PoorCreditBrandDealerYearlyPaymentCalculation
PoorCreditBrandDealerMonthlyPaymentCalculation
PoorCreditNonBrandDealerYearlyCalculation
PoorCreditNonBrandDealerMonthlyCalculation
Dies wird nur von hier schlechter. Dies ist wirklich eine eigene Frage und Antwort, wenn es aufkommt, aber es ist etwas, auf das Sie achten sollten. Wenn es so wird, refaktorieren Sie die Berechnungsklassen. Aber was schön ist, muss der Code in GetInsurance immer noch nicht ändern.
So viele Fragen ... zuerst, ist die Methode in der Insurance-Klasse oder einer anderen Klasse? – tcarvin