问题背景,定义三个概念先:
1。percent。就是百分比。
2。weight。如果percent是10,weight就是0.1,weight=percent/100.
3。amount。如果percent是10,总数是1000,那么amount就是100. amount=total*weight.
在程序中,我们很多时候需要在amount, weight, percent之间来回转换。根据不同模块的需要,把同一个数据点转换成percent或者weight或者amount。
目标是设计一个类Portion,它的接口如下:
public class Portion {
public double getPercent();
public double getWeight();
public double getAmount();
public double getTotal();
public static Portion fromPercent(double total, double percent);
public static Portion fromWeight(double total, double weight);
public static Portion fromAmount(double total, double amount);
}
另外,程序中还使用这样一个习惯:如果total为0,那么从amount计算percent和weight的时候也是0。(以避免divide by 0)
我的pair想这样实现:
public class Portion {
private final double total;
private final double amount;
Portion(double total, double amount) {
this.total = total;
this.amount = amount;
}
public double getPercent() {
return getWeight()*100;
}
public double getWeight() {
return total==0?0:amount/total;
}
public double getAmount() {
return amount;
}
public double getTotal() {
return total;
}
public static Portion fromPercent(double total, double percent) {
return new Portion(total, total*percent/100);
}
public static Portion fromWeight(double total, double weight) {
return new Portion(total, total*weight);
}
public static Portion fromAmount(double total, double amount) {
return new Portion(total, amount);
}
}
我对这个设计是不满意的。我提出了几点问题:
1。假设在某一点total不可知,那么怎样用Portion来封装唯一可知的percent/weight?Portion.fromWeight(0, 0.1).getPercent()在这个设计中不会返回我期待的10,而是0。
2。double是有误差的。如果客户写一个
assertEquals(weight, Portion.fromWeight(777, weight).getWeight(), 0)
居然也要失败,不免尴尬。
所以我提议这样做:
public class Portion {
private final double total;
private final double amount;
private final double percent;
private final double weight;
Portion(double total, double amount, double percent, double weight) {
this.total = total;
this.amount = amount;
this.percent = percent;
this.weight = weight;
}
public double getPercent() {
return percent;
}
public double getWeight() {
return weight;
}
public double getAmount() {
return amount;
}
public double getTotal() {
return total;
}
public static Portion fromPercent(double total, double percent) {
return new Portion(total, total*percent/100, percent, percent/100);
}
public static Portion fromWeight(double total, double weight) {
return new Portion(total, total*weight, weight*100, weight);
}
public static Portion fromAmount(double total, double amount) {
double weight = total==0?0:amount/total;
return new Portion(total, amount, weight*100, weight);
}
}
这样,虽然double计算有误差,我至少可以保证Portion.fromWeight(total, weight).getWeight()永远等于weight。
但是,pair对这种设计感觉不舒服,他不喜欢把逻辑放在静态工厂方法中。
而且,pair对我提出的几个他的方案的缺陷如此回应:
1。total为0的情况本身就特殊。根据整个系统目前的情况,getWeight()和getPercent()都返回0可以接受。
2。我不care是否有误差,反正我们现在比较double的时候都是用一个tolerance的。
我的pair对整个系统了解的比我多,我相信他说的话。只不过,要我做一个单独的小模块,却总要依赖于外部系统的“对特殊情况A,我们可以容忍;对情况B,我们不在乎”这些assumption,让我深藏于心底的洁癖非常不舒服。
我并不是绝对排斥使用适当的assumption来简化实现复杂度。但是当两个方案的复杂度相近时,我很反感把外界的一些assumption引进来。
那么,你怎么想?
分享到:
相关推荐
然而,《Zero Assumption Digital Image Recovery 1.2》提供的是免注册版本,意味着用户可以直接使用全部功能,无需支付任何费用。这降低了用户尝试和使用该软件的门槛,也是其受到广大用户欢迎的原因之一。 在使用...
在图像处理领域,"Gray-World Assumption"(灰度世界假设)是一种常见的色彩校正技术,用于自动白平衡。这种假设认为无论拍摄环境如何,一个图像中的所有颜色经过平均后应该趋向于一种中性灰色。自动白平衡的目的是...
CRYPTO 2009的一篇文章,提出了一个标准模型下基于RSA的短签名方案
The follow examples will illustrate the ideas and ...this be a reasonable assumption? (PROBABILITY MODELS) If we let the random variable X = number of fumbles in a game and assume that the Poisson mod
在这种情况下,"Zero Assumption Digital Image Recovery"(零假设数字图像恢复)绿色版便成为了一个强大的工具,帮助用户找回那些看似失去的宝贵瞬间。 “Zero Assumption Digital Image Recovery”是一款专为恢复...
Leveson在《An Experimental Evaluation of the Assumption of Independence in Multi-Version Programming》中提出的观点。文章的核心是评估多版本编程(N-version programming)中的独立性假设的有效性,并通过...
白平衡之Gray World Assumption matlab源码
在使用ZADIR时,首先需要连接丢失照片的存储设备,然后运行软件进行扫描。ZADIR会快速识别出可恢复的图像文件,并以预览的形式显示出来。用户可以选择查看这些文件,确认它们是否可成功恢复。此外,ZADIR还提供了...
4. **低功耗VHDL设计**:在硬件描述语言如VHDL中,可以使用特定的属性和语句来实现低功耗设计,例如,使用“if...else”语句来控制信号的开关,或者使用“wait”语句来暂停进程直到有事件发生。 5. **电源管理**:...
ID-Based Strong Designated Verifier Signature over R-SIS Assumption ID-Based Strong Designated Verifier Signature(基于身份的强指定验证者签名)是一种特殊类型的数字签名方案,旨在确保签名的安全性和签名...
「安全资讯」Revisiting_the_Secret_Hiding_Assumption_Used_in_Verifiable_(Outsourced)_Computation - 等级保护 勒索软件 风险评估 安全集成 漏洞挖掘 金融安全
此外,作者还使用这一技术对Waters签名进行了全新的安全性分析。Waters签名是目前唯一已知的基于计算Diffie-Hellman假设,在标准模型下既短又无状态的签名方案。 #### 四、方案细节 1. **方案概述**:该签名方案的...
零件加工通过刀具假设模拟换刀,并统计换刀时间
Laravel试图通过减轻大多数Web项目中使用的常见任务来减轻开发工作的痛苦,例如: 。 。 用于和存储的多个后端。 富有表现力,直观的 。 数据库不可知。 。 。 Laravel易于访问,但功能强大,可提供大型,强大的...
[sudo] gem install basic_assumption 在Rails应用程序中使用它 对于Rails 2,在environment.rb中: gem . config 'basic_assumption' 对于Rails 3,在您的Gemfile中: gem 'basic_assumption' 要在另一个上下文...
非交互式洗牌论证在低信任假设下的应用 在AI安全和大数据安全领域,确保人才安全体系的构建至关重要。其中一个核心挑战是如何实现自动化渗透测试、安全开发和应对安全威胁。在这一背景下,"A Non-Interactive ...
R-SIS假设是一种基于格理论的 hardness assumption。它假设在给定的格中,找到一个短向量是困难的。R-SIS假设广泛应用于密码学领域,例如数字签名、加密算法和身份验证等。 基于R-SIS假设的SDVS 在本文中,我们...
In this paper, we present a new leakage-resilient public key encryption scheme whose security is based on the classical DDH (decisional Diffie-Hellman) assumption. In the computational cost, our ...
这类判断的证据是一个允许自由使用假设J1的推导过程,以证明J2。值得注意的是,在推导过程中,并不一定需要使用假设J1。 - **参数判断**(Parametric Judgment)的形式为“对于任何参数a,判断J成立”。这种类型的...