title author date CreateTime categories
从 dotnet core 3.0 的特性让 WPF 布局失效讨论 API 兼容
lindexi
2019-4-17 10:5:35 +0800
2019-04-17 09:41:42 +0800
WPF dotnet

在 dotnet core 3.0 为了支持 IEEE 浮点数计算标准,修改了 Math.Max 的算法,于是在 WPF 的 Track 里面的布局依赖于之前的计算,于是在 dotnet core 3.0 的修改就让布局计算不对了。改动现有 API 的行为会让现有的代码出现不兼容问题,那么要让一个框架能稳定支持升级需要满足什么条件

在我准备睡的过程,某 神樹 桜乃 告诉我现在的 Math.Max 对于 0 和 NaN 的返回和之前不一样,于是在他的帮助下,我找到了dotnet core 3.0 的新特性,符合 IEEE 标准的浮点计算的提交 在这个提交里面,作者说明了这个提交将会是改变 API 行为的

于是刚好在 WPF 的 Slider 用到了 Track 的布局,刚好在布局里面就依赖了 Math.Max(0,NaN) 返回 的是 NaN 而不是 0 的坑,详细请看 神樹的回复

本来 dotnet core 遵守 IEEE 标准是好的,因为有一个标准可以让多个语言迁移成本降低,但是在 .NET Framework 已经用了这个坑很久了,没有人能说明有多少以前的代码会依赖于这个坑。于是修改 dotnet core 3.0 浮点计算的作者就提议不更改原有的 API 的行为,另外新增新的 API 而不是改变原有的 API 用来兼容现在的代码,请看Expose Math.MaxNumber and Math.MinNumber functions that don't propagate NaN

我十分同意一个稳定的框架的 API 设计是能做到上下兼容的,一个不兼容的 API 只需要满足以下条件

  • 接口更改,包含方法或属性名等的变更
  • 返回值更改
  • 公开属性更改,包括属性类型和属性可访问
  • 公开 API 行为修改
  • 方法参数变更,包含参数类型和参数个数

作为一个公开的框架,将会有很多历史问题,一个发布出去的 API 将会被很多小伙伴在很多地方使用,如果变更了不兼容的 API 从版本号规范上,需要升级主版本号。在版本号规则,升级主版本号就是表示存在 API 不兼容,基本上就是需要修改现在的代码才能跑起来。而升级次版本号就是表示有新增的 API
可以不更改原有的代码就可以升级库。也就是只要不是主版本号更改,那么就是愉快升级库而不需要考虑兼容

作为超级多项目引用的基础 dotnet core 库是需要做到上下兼容的,任何很小的 API 不兼容都需要其他很多项目很大的兼容代价

如何设计一个好的框架,请看好的框架需要好的 API 设计 —— API 设计的六个原则 - walterlv

现在 WPF 和 dotnet core 都是开源的,如果遇到任何的问题都可以在社区上询问

Some cleanup of the Math functions from #20788 by tannergooding · Pull Request #20912 · dotnet/coreclr

Expose Math.MaxNumber and Math.MinNumber functions that don't propagate NaN · Issue #36925 · dotnet/corefx

Problem with WPF's Slider style (and a few thoughts on porting DX11 rendering engine to Core3) · Issue #521 · dotnet/wpf

最新文章

  1. ORA-01438: 值大于为此列指定的允许精度
  2. zip命令的常用选项
  3. CSS3中-webkit-overflow-scrolling: touch 的使用方法详解
  4. ganglia及ganglia-api相关介绍
  5. windows log 打印语句
  6. 重新定位svn地址的方法(windows和linux),svn switch(sw)的帮助信息
  7. asp.net webuploader粘贴,拖拽,点击上传图片
  8. 十四、Android学习笔记_Android回调函数触发的几种方式 广播 静态对象
  9. Restful based service 的跨域调用
  10. 《神经网络算法与实现-基于Java语言》的读书笔记
  11. 记一次laravel远程关联查询
  12. [leetcode]8. String to Integer (atoi)字符串转整数
  13. 写一份简单的webpack2 的配置文件,无比简单
  14. Chrome disable cache & clear memory cache
  15. C++设计模式 ==> 装饰(者)模式
  16. SV中的task和function
  17. To set Nginx Upload Size For “413–Request Entity Too Large” Error
  18. 番外篇 之 JS调用
  19. 【Java面试题】57 short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
  20. 关于Gateway

热门文章

  1. vue表格之tableHeaderColor(修改表头背景色)
  2. java笔试之自守数
  3. 【主席树】 [CQOI2015]任务查询系统
  4. 02.MyBatis在DAO层开发使用的Mapper动态代理方式
  5. [转]WPF的BitmapImage的文件无法释放及内存泄露的问题
  6. java.util.concurrent中的几种同步工具类
  7. springboot让内置tomcat失效
  8. iOS之CGPath相关属性(一)
  9. 07_Hibernate多事务并发运行时并发问题检索方式
  10. 11-3-while