当前位置: 首页 > news >正文

2510C++,api设计原则,不除零

原文

API设计原则:不引诱人除以零

一个团队正带来一个API以供审查,其中一个部分涉及以三个数字表达一组支持的值:
1,允许的最小值.
2,增量.
3,允许的最大值.

支持的值增量最小值相加的最小值整数倍,最多(包括最大值).

如,如果最小值5,增量为10,最大值30,则有效值

5|Minimum
15|Minimum + 1 * Increment
25|Minimum + 2 * Increment
30|Maximum

该团队还说明,如果增量为,则只支持最小值最大值.
我说明,该设计会诱使用户除零.
这是你可能编写的函数:

int closestSupportedValue(int desired)
{int nearest = minimum +((desired - minimum + increment/2) / increment) * increment;return std::clamp(nearest, minimum, maximum);
}

首先找到超出最接近要求值的最小值的增量倍数.,可通过适当更改及增量/2来圆整.然后在允许的范围内限制该值.

除非增量为零,否则这很有效.如,你可能在所有测试中都不会遇见零,因为他们测试代码的所有硬件都支持广泛的可能值.

他们从未意识到必须在仅支持1或2个可能值的硬件上测试.

我建议团队从API中删除零.如果仅支持两个值,则按等于最大值-最小值设置增量.如果仅支持一个值,则按1设置增量.

:电网团队落入了该陷阱.PowerGridForecast类表示一系列从StartTime开始,每个预测表示BlockDuration描述的时间长度的PowerGridData对象.

即,向量的第n个符号表示从StartTime+n*BlockDuration开始,并持续到BlockDuration的预测.

要编写一个查找描述特定时间点的块的函数,可如下:

PowerGridData FindForecastForDateTime(PowerGridForecast forecast, DateTime time)
{var elapsed = time - forecast.StartTime;var index = elapsed / forecast.BlockDuration;if (index < 0 || index >= forecast.Forecast.Count) {return null;//该索引没有预测}return forecast.Forecast[index];
}

确定自第一次预测开始以来经过的时间,确定它属于哪个块索引,(如果有)并返回该索引处的符号.

该团队决定,如果没有预测,则Forecast属性将返回一个空向量(良好),而BlockDuration将为零(坏).

该团队认为,如果没有预测,区块大小就不重要,因为它描述的是不存在的东西,所以谁在乎它是否为零,但在上面看到,零区块持续时间表明索引的计算执行除零计算.

因为区块大小不重要,他们应该选择一个不太可能引起问题的值.选择一个典型有效块大小,如一小时的非零块大小.

实际上,可按大于最大值-最小值任何正值设置增量,尽管不想选择太大的值,因为这有整数溢出的风险.

http://www.dtcms.com/a/503979.html

相关文章:

  • 设计师网站欣赏网站开发在线培训
  • 【Java 开发日记】我们来说一说 Redisson 的原理
  • uncertainty propagation 基于距离和基于位置的替代方法 是什么
  • 高速公路建设网站苏州聚尚网络科技有限公司
  • 宁夏网站seo国家信用信息企业公示系统
  • Linux系统调用中的dup和dup2函数详解
  • 【Svelte】+layout.ts 会执行几次?
  • 大良营销网站建设行情沧州住房和城乡建设部网站
  • 美橙建站五站合一软件网站备案主体空壳
  • 建筑工程施工企业项目管理软件推荐及深度分析
  • 音乐分享网站开发合肥网站建设新浪营销
  • 安卓从网站获取视频怎么做个人营销网站
  • 3.3循环语句
  • 静默安装金仓数据库,到底有多简单?
  • 个人网站设计分类北京优酷首页培训机构
  • 中山网站建设的价格茂名建站价格
  • 定远建设局官方网站怎么制作自己的个人网站
  • 南宁响应式网站制作中企动力做网站 知乎
  • 制作公司网站有哪些好处微信公众号怎么二次开发
  • 保持电脑不息屏-skill
  • 配置openguass 教程(自存)
  • 3.4循环控制
  • 上海发乐门网站建设公司鞍山招聘网最新招聘
  • FastAPI之 Python的类型提示
  • 注意力机制(Attention)介绍和示例
  • 做网站要实名吗呼和浩特网站运营公司
  • 做网站二维码怎样自己做网络推广网站
  • 望牛墩做网站中国空间站对接成功
  • 6.3 文件传输协议 (答案见原书 P277)
  • BLDC电机矢量控制(FOC)深度解析:从理论到实践