- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基于多个参数计算契约(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/
考虑Uncle Bob's Clean Architecture (或洋葱架构) 我有以下场景: 我想向用户展示一个地方的信息:名称、类别、坐标。 我还希望在同一个屏幕上有一个按钮,点击该按钮后会重定
因此,当我将php与MySQL结合使用时,我只是这样做了: $result = $mysqli->query("SELECT * FROM table WHERE person='Bob'"); 我现
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
一周前,我观看了 Robert C. Martin 关于架构的演讲: http://www.youtube.com/watch?v=WpkDN78P884 我不明白您在 0:24:46 看到的图表。我
注意:这是对 SWF 文件中有关排序记录的现实问题的抽象改写。解决方案将帮助我改进开源应用程序。 Bob 有一家商店,他想打折。他的商店有许多产品,并且他有一定数量的每种产品的库存。他还有一些货架上的
我想知道我是否在使用 Clean Architecture正确的方式。我试图像这样放置它: 我读到包结构应该按用例排列,但我很难理解如何做到这一点。 让我们看看我的包结构: 请注意,我不知道将 Act
考虑 Uncle Bob's Clean Architecture (或洋葱架构) 假设作为我应用程序中的登录用户,我收到了一个深层链接 url “myapp://events/[event_id]”
Bob Jenkins 哈希函数是否有不区分大小写的变体? Generics.Defaults.BobJenkinsHash 提供快速哈希函数。不幸的是,它不能与不区分大小写的比较函数结合使用,如下所
我正在使用 jquery 在 LI 悬停时隐藏/显示 DIV。当我这样做时,div 出现了,但不停地上下弹出,直到我将鼠标从 LI 上移开。 $(document).ready(function ()
好吧,这看起来有点奇怪,但是当我尝试在 PHP 代码或 phpmyadmin 中运行 mysql 查询时,它不会返回任何内容: DELETE FROM `EmployeeNames` WHERE Fi
我已经在 CentOS 和 Python 级别上安装了所有必要的依赖项,并且认为我已经接近完成,但这就是我最后得到的。现在我不知道如何让它发挥作用。 Installed /tmp/easy_insta
这个问题在这里已经有了答案: String count with overlapping occurrences [closed] (25 个答案) 关闭 9 年前。 s = 'gfdhbo
我正在尝试使用通过 Conda 安装在我的 ubuntu 上的 bob 包;但是,在使用诸如 bob.measure.eer_threshold 之类的任何测量 API 时,会出现以下错误。我已经准备
Bob推荐其用户到install它的包使用conda , 但我不想使用 conda .如何从源代码安装它? 最佳答案 解释 首先,使用 conda 安装 Bob 要容易得多,并且是安装 Bob 的受支
考虑我在 hackerrank 上发现的这个问题: Coins Problem Alice and Bob were sitting in the sun; drinking orange juice
我想将数组元素传递给 bob bob.string.formatString 格式字符串,以便我可以传递任意数量的参数,并且它将自动填充占位符中所需的参数。这是我尝试过的。 var string =
如果我想从下面的字符串中提取值,正确的正则表达式(我可以在 Java 中使用)是什么? 我知道\将提取尖括号之间的所有内容,但我只需要提取“bob”。 字符串中唯一会改变的部分是“bob”。我还想确
在第 2 章:有意义的名称中,Bob 叔叔写道: Don't Add Gratuitous Context In an imaginary application called "Gas Statio
我正在构建一个 Bloom 过滤器并查看要使用的哈希值和 Bob Jenkins' hash由于分布均匀,这似乎是一个不错的选择。我将给定的 C++ 代码改编为 Go(可能犯了一个错误,但它似乎有效)
考虑: 用例层定义了一个接口(interface) public interface IGeocoder { Coordinate GetCoordinate(Address address)
我是一名优秀的程序员,十分优秀!