gpt4 book ai didi

java - 我应该如何重构此方法以遵守 Uncle Bob 规则,即参数不得超过 2 或 3 个?

转载 作者:行者123 更新时间:2023-12-02 00:32:09 24 4
gpt4 key购买 nike

我有一个基于多个参数计算契约(Contract)利息的重型方法。我确实需要这些参数中的每一个,但这违反了鲍勃叔叔的规则,即参数不得超过 2 或 3 个。

public double calculInteretsParPeriode(double encours, double tauxWithMarge, Date dtEch, Date dtEchPrec, boolean isFirstEcheanceInterets, Periode periodiciteK,
BaseCalcul baseCalcul, TauxProportionnelOuEquivalent tauxProportionnelOuEquivalent, int tauxNDecimal,
Periode periodiciteI, PeriodeCalculInterets periodeCalculInterets) {

...

int nMensualiteAnPlusGrand = CalculMensualite.calculNMensualiteParAnsMax(periodiciteK, periodiciteI);

double coeffI = CalcEmprunt2014.calcCoeffInterets(
baseCalcul.getNumerateur(),
baseCalcul.getDenominateur(),
dtEch,
dtEchPrec,
nMensualiteAnPlusGrand,
baseCalcul.getProrata(),
isFirstEcheanceInterets
);

//les intérêts sont calculés avec le taux + la marge du contrat
switch (tauxProportionnelOuEquivalent) {
case PROPORTIONNEL:
return MathUtils.round2D(encours * MathUtils.arrondi(tauxWithMarge, tauxNDecimal) / 100.0 * coeffI);
case EQUIVALENT:
return MathUtils.round2D(encours * (Math.pow((1 + MathUtils.arrondi(tauxWithMarge, tauxNDecimal) / 100), coeffI) - 1));
case PROPORTIONNEL_EQUIVALENT:
return MathUtils.round2D(encours * (MathUtils.arrondi((Math.pow((1 + MathUtils.arrondi(tauxWithMarge, tauxNDecimal) / 100), coeffI) - 1) * nMensualiteAnPlusGrand, tauxNDecimal + 2) * coeffI));
default:
throw new GenericRuntimeException("Méthode de calcul des intérêts non pris en charge: " + tauxProportionnelOuEquivalent);
}
}

我尝试过使用构建器模式,但这似乎是作弊,因为我只是将所需的变量移动到类字段,并且仍然需要将它们传递给构建器,这感觉就像一团糟:

ew CalculInteretsParPeriodeBuilder()
.withEncours(10000)
.withTauxWithMarge(1.0)
.withDtEch(DateCalculs.getDate(2019, Month.FEBRUARY, 1))
.withDtEchPrec(DateCalculs.getDate(2018, Month.FEBRUARY, 1))
.withIsFirstEcheanceInterets(false)
.withPeriodiciteI(Periode.ANNUELLE)
.withPeriodiciteK(Periode.ANNUELLE)
.withTauxNDecimal(2)
.withPeriodeCalculInterets(PeriodeCalculInterets.PAR_PERIODE)
.withBaseCalcul(BaseCalcul.BC_360360)
.withTauxProportionnelOuEquivalent(TauxProportionnelOuEquivalent.EQUIVALENT)
.build()
.calculInteretsParPeriode()

最佳答案

为了展示一些代码,我最终完全按照 @GameDroids 的建议使用 Builder 来执行“通用”参数,并在 calcul() 方法的签名中包含更多“特定”参数。

public class CalculInteretsParPeriodeBuilder {
private ContratBasic contratBasic;
private DefinitionTaux contratTaux;
private Periode periodiciteK;
private Periode periodiciteI;
private BaseCalcul baseCalcul;
private TauxProportionnelOuEquivalent tauxProportionnelOuEquivalent;
private Integer tauxNDecimal;
private PeriodeCalculInterets periodeCalculInterets = PeriodeCalculInterets.PAR_PERIODE;

public CalculInteretsParPeriodeBuilder withContratBasic(ContratBasic contratBasic) {
this.contratBasic = contratBasic;
return this;
}

public CalculInteretsParPeriodeBuilder withContratTaux(DefinitionTaux contratTaux) {
this.contratTaux = contratTaux;
return this;
}

public CalculInteretsParPeriodeBuilder withPeriodiciteK(Periode periodiciteK) {
this.periodiciteK = periodiciteK;
return this;
}

public CalculInteretsParPeriodeBuilder withBaseCalcul(BaseCalcul baseCalcul) {
this.baseCalcul = baseCalcul;
return this;
}

public CalculInteretsParPeriodeBuilder withBaseCalcul(com.dev1.seldon.infodette.beans.contrat2014.commons.enums.BaseCalcul baseCalcul) {
this.baseCalcul = new BaseCalcul(baseCalcul);
return this;
}

public CalculInteretsParPeriodeBuilder withTauxProportionnelOuEquivalent(TauxProportionnelOuEquivalent tauxProportionnelOuEquivalent) {
this.tauxProportionnelOuEquivalent = tauxProportionnelOuEquivalent;
return this;
}

public CalculInteretsParPeriodeBuilder withTauxNDecimal(int tauxNDecimal) {
this.tauxNDecimal = tauxNDecimal;
return this;
}

public CalculInteretsParPeriodeBuilder withPeriodiciteI(Periode periodiciteI) {
this.periodiciteI = periodiciteI;
return this;
}

public CalculInteretsParPeriodeBuilder withPeriodeCalculInterets(PeriodeCalculInterets periodeCalculInterets) {
this.periodeCalculInterets = periodeCalculInterets;
return this;
}

public CalculInteretsParPeriode build() {

if (contratBasic != null && contratTaux != null) {
this.periodiciteK = contratBasic.getPeriodiciteK();
this.periodiciteI = contratTaux.getPeriodiciteI();
this.baseCalcul = contratTaux.getBaseCalculI();
this.tauxProportionnelOuEquivalent = contratTaux.getTauxProportionnelOuEquivalent();
this.tauxNDecimal = contratTaux.getTauxNDecimal();
this.periodeCalculInterets = contratTaux.getPeriodeCalculInteret();
}

if (periodiciteK == null) throw new MandatoryMethodParameterException("periodiciteK");
if (baseCalcul == null) throw new MandatoryMethodParameterException("baseCalcul");
if (tauxProportionnelOuEquivalent == null) throw new MandatoryMethodParameterException("tauxProportionnelOuEquivalent");
if (tauxNDecimal == null) throw new MandatoryMethodParameterException("tauxNDecimal");
if (periodiciteI == null) throw new MandatoryMethodParameterException("periodiciteI");

return new CalculInteretsParPeriode(periodiciteK, baseCalcul, tauxProportionnelOuEquivalent, tauxNDecimal, periodiciteI, periodeCalculInterets);
}
}

public class CalculInteretsParPeriode {

private PeriodeCalculInterets periodeCalculInterets;
private Periode periodiciteI;
private Periode periodiciteK;
private TauxProportionnelOuEquivalent tauxProportionnelOuEquivalent;
private int tauxNDecimal;
private BaseCalcul baseCalcul;

public CalculInteretsParPeriode(Periode periodiciteK, BaseCalcul baseCalcul, TauxProportionnelOuEquivalent tauxProportionnelOuEquivalent, int tauxNDecimal,
Periode periodiciteI, PeriodeCalculInterets periodeCalculInterets) {
this.periodiciteK = periodiciteK;
this.periodiciteI = periodiciteI;
this.baseCalcul = baseCalcul;
this.tauxProportionnelOuEquivalent = tauxProportionnelOuEquivalent;
this.tauxNDecimal = tauxNDecimal;
this.periodeCalculInterets = periodeCalculInterets;
}

public double calculInteretsParPeriode(double encours, double tauxWithMarge, Date dtEch, Date dtEchPrec, boolean isFirstEcheanceInterets) {

if (dtEch == null) throw new MandatoryMethodParameterException("dtEch");
if (dtEchPrec == null) throw new MandatoryMethodParameterException("dtEchPrec");

int nMensualiteAnPlusGrand = CalculMensualite.calculNMensualiteParAnsMax(periodiciteK, periodiciteI);

double coeffI = CalcEmprunt2014.calcCoeffInterets(
baseCalcul.getNumerateur(),
baseCalcul.getDenominateur(),
dtEch,
dtEchPrec,
nMensualiteAnPlusGrand,
baseCalcul.getProrata(),
isFirstEcheanceInterets
);

return MathUtils.round2D(encours * MathUtils.arrondi(tauxWithMarge, tauxNDecimal) / 100.0 * coeffI);

}

}

非常感谢

关于java - 我应该如何重构此方法以遵守 Uncle Bob 规则,即参数不得超过 2 或 3 个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58004975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com