在这篇文章中,我想介绍一些我觉得非常有趣的东西,.NET 团队是如何设计API的? 我们先来看下.NET团队面临的有哪些挑战,您正在设计一套API库,每天有数百万的开发人员在使用这些库,它们在世界各地运行在重要的应用程序上面,您要对其进行改进并添加新功能或增强功能,而且不能破坏数百万个现有应用程序,这确实让人头大。

我喜欢编写C#代码,自己也写过很多API库,其中很多都是内部使用的库,而使用这个库的不到30人,即使这样,我仍然写了bug,那我得修啊,但我没有意识到所有的环境下这个库都是否可以使用, 以过去我的经验,我觉得设计公共API很困难。

在本文的其余部分中,我将按照我的理解来解释.NET API设计过程,这些是我根据对这一过程进行了几年的观察而得出的自己的解释,团队所做的大部分工作都是公开发布的,因此可以从他们如何组织.NET Core(和.NET 5)的API设计中学到很多东西。

为了使解释更具体,我将遵循最近的新库的设计,该库将作为.NET 5的.NET BCL(基类库)的一部分包括在内,比如,System.Net.Http.Json 这个库优化了 HttpClient 处理Json,我今天不讲这个库如何使用,我们将专注于它是如何产生的。

1.设计阶段 - Design

最开始,Immo Landwerth 发现在HttpClient中处理Json很麻烦,于是他在github提了一个json扩展的建议,里面包含了遇到了哪些问题,然后如何改进。

用简单明了的术语,描述了这个设计如何变得更好,以及用户(开发人员)对该功能的使用体验,包括示例代码,表达了开发人员会在什么情况下使用这个API。

在明确方案的情况下,接着继续介绍新的API的要求,它必须实现什么目标,在什么时间范围内?然后是设计本身,该设计包括建议的公共API,但是没有任何实现细节, 这包括设计引入的所有公共方法和类型。

2.NET设计审查阶段 - Review

.NET流程的下一个阶段是进行API设计审查, 这在Github上面进行,团队创建了一个 Issue,https://github.com/dotnet/runtime/issues/32937, 大家都有权限看到,这是公开的,因此社区可以征询反馈和建议,我真的很喜欢这些.NET开放的氛围!

API开始审查,在此会议上,.NET团队的核心专家汇聚一堂,评估方案并确保公共API适合目标框架,这是至关重要的一步,为了兼容性,设计中的错误或疏忽可能会持续很长时间,这意味着API决策需要彻底,团队也希望该API易于使用。

在API审核期间,会有人代表提案,并说明拟议设计的目标和原因,然后,团队将对其进行讨论,并确定提案是否需要进一步的工作,然后再批准,在被认为可以接受之前,可以在多次设计评审中提出一个API。

我真正欣赏团队的一点是,他们在YouTube上现场直播了这次会议,任何人都可以观看,尽管有时在会议期间聊天中留下的评论和反馈可能被认为是讨论的一部分,但这主要是一种仅查看的方法,在YouTube上,.NET Foundation 频道下的所有播放记录都可以去浏览。

您可以在YouTube上查看HttpClient JSON扩展方法的设计的讨论,https://www.youtube.com/watch?v=_AHbjIS8_0I

当我感兴趣的API有讨论的时候,我就会经常上去看这些,我发现听到讨论并观看.NET团队对设计框架的想法非常有趣,在此过程中必须考虑许多细微的差异,这里面包含了大量的.NET 方面的知识,通常会提出一些细微的实现细节行为,例如现有API的历史方面及其行为,可能观看这样一次会议,要花一两个小时, 但我还是建议您有空可以参加其中的一些会议,来真正欣赏.NET框架的设计。

在审查期间,通常会使用GitHub Issue的标准做法, .NET的程序经理 Immo Landwerth 通常主持会议并在讨论过程中做笔记, 任何关注,反馈和更改都将记录为设计审查的输出。

3. 提交阶段 - PR

一旦获得批准,开发人员开始写写写,来实现这个API,就像这个示例一样,可能某些工作已经试验完成,然后还将需要把一些更改的内容,记录到设计评审的反馈中。

该功能的大部分工作由David Cantu完成,可以在GitHub上的拉取请求(PR)这里看到,https://github.com/dotnet/runtime/pull/33459 , 同样的它在Github,公开透明,任何人都可以订阅通知,甚至发表评论。

我建议开发人员应该很熟悉这个阶段,开发人员在git分支上完成了一些工作,一旦该工作完成并准备好考虑合并,就可以创建一个PR,一般可以直接合并到项目,但是出于质量考虑,其他开发人员通常会进行一个或多个代码审查,在Microsoft .NET世界中,这必须要考虑全面,因为不一致和性能问题可能是以后要解决的问题。

在这个例子中(Json扩展库),我们可以看到很多评论,包扩多个有经验的专家,您将看到有关代码复杂性的详细反馈,这是我从提出和讨论的小项目中学到很多东西的地方,随着时间的推移,您可以观看PR,甚至可以查看较新的提交,这些提交可以解决反馈并解决任何问题。

4.合并发布 - Release

一旦所有的审阅者批准了这个PR,然后这些代码被合并到master分支中,因为.NET 运行时是一个非常复杂的库,里面有高级的构建过程,来处理这些新合并的代码。

最终,新代码将出现在相关库的夜间版本中(nightly),也可能被推送到MyGet或NuGet feed中以供预览使用和测试,对于本篇的示例,生成了一个新程序包,并在NuGet上作为预发布预览发布了该程序包

总结

这个过程非常有趣,我们了解到了.NET 团队,最初由一个想法,再经过设计,审查,讨论,最终上线,这些都在Github进行,都是公开的,在这个过程中,我们可以学习非常全面的.NET的知识,因为微软的专家处理这些事情,考虑的非常全面和细致。

最后

欢迎扫码关注我们的公众号 【全球技术精选】,专注国外优秀博客的翻译和开源项目分享,也可以添加QQ群 897216102

探索 .NET团队对API的设计流程的更多相关文章

  1. 从涂鸦到发布——理解API的设计过程(转)

    英文原文:From Doodles to Delivery: An API Design Process 要想设计出可以正常运行的Web API,对基于web的应用的基本理解是一个良好的基础.但如果你 ...

  2. OpenResty api网关设计

    本文讲述 OpenResty api网关设计,主要涉及api网关介绍.openresty api网关 请求路由(路由判断.路由重写.服务判断.限流).授权验证(统一认证).动态Upstream 以及这 ...

  3. 实现API优先设计的重要性和实现方式

    应用API优先的方法意味着设计API时,使其具有一致性和适应性,无论应用于哪些开发项目.对API使用API​​描述语言(如OpenAPI)是关键,因为它有助于建立API与其他程序通信的枢纽,即使这些系 ...

  4. vue 源码详解(一):原型对象和全局 `API`的设计

    vue 源码详解(一):原型对象和全局 API的设计 1. 从 new Vue() 开始 我们在实际的项目中使用 Vue 的时候 , 一般都是在 main.js 中通过 new Vue({el : ' ...

  5. 好RESTful API的设计原则

    说在前面,这篇文章是无意中发现的,因为感觉写的很好,所以翻译了一下.由于英文水平有限,难免有出错的地方,请看官理解一下.翻译和校正文章花了我大约2周的业余时间,如有人愿意转载请注明出处,谢谢^_^ P ...

  6. 关于API的设计与实现

    http://blog.csdn.net/horkychen/article/details/46612899 API的设计是软件开发中一个独特的领域.最主要的特殊点在于API是供开发者使用的界面,即 ...

  7. RESTful API的设计原则

    好RESTful API的设计原则   说在前面,这篇文章是无意中发现的,因为感觉写的很好,所以翻译了一下.由于英文水平有限,难免有出错的地方,请看官理解一下.翻译和校正文章花了我大约2周的业余时间, ...

  8. VerilogHDL概述与数字IC设计流程学习笔记

    一.HDL的概念和特征 HDL,Hard Discrimination Language的缩写,翻译过来就是硬件描述语言.那么什么是硬件描述语言呢?为什么不叫硬件设计语言呢?硬件描述语言,顾名思义就是 ...

  9. 好的RESTful API的设计原则

    转载自一位大佬 英文原版 Principles of good RESTful API Design Good API design is hard! An API represents a cont ...

随机推荐

  1. AutumnWater 秋水SRC平台

    持续给自己挖坑,简单介绍一下AutumnWater 秋水SRC平台趴: SRC开源漏洞响应平台 AutumnWater 秋水SRC平台 后端使用Python-Flask(蓝图)编写 前端使用少量VUE ...

  2. javascript是面向对象的,怎么体现javascript的继承关系?

    一个简单的例子: var A =function(){ } A.prototype = { v : 5, tmp : 76, echo : function(){console.log(this.tm ...

  3. 冲刺Day6

    每天举行站立式会议照片: 昨天已完成的工作: 1.确认商品搜索栏页面(全) 2.订单模块的大部分代码 3.用户模块的大部分代码 今天计划完成的工作: 成员 任务 高嘉淳 检查用户模块的功能并更正 覃泽 ...

  4. 【题解】Railway [Uva10263]

    [题解]Railway [Uva10263] 传送门:\(\text{Railway [Uva10263]}\) [题目描述] 给出点 \(M\) 以及一个由 \(n\) 条线段依次相连的类曲形图(由 ...

  5. AH/HNOI 2017 礼物

    题目链接 描述 两个序列 \(x, y\),可以将一个序列每个值同时加非负整数 \(c\),其中一个序列可以循环移位,要求最小化: \[\sum_{i = 1}^{n}(x_i - y_i) ^ 2 ...

  6. 动态规划之经典数学期望和概率DP

    起因:在一场训练赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有\(X,Y,Z\)块钱 ...

  7. 把演讲人的桌面、头像、声音合成后推送到 指定的直播流平台上; 录制电脑桌面、摄像头头像、声音保存为本地视频; 适用于讲课老师、医生等演讲内容保存为视频; 提供PPT嵌入Winform/WPF解决方案,Winform/WPF 中嵌入 office ppt 解决方案

    提供PPT嵌入Winform/WPF解决方案,Winform/WPF 中嵌入 office ppt 解决方案 Winform/WPF 中嵌入 office ppt(powerpoint)解决方案示: ...

  8. A Simple Framework for Contrastive Learning of Visual Representations 阅读笔记

      Motivation 作者们构建了一种用于视觉表示的对比学习简单框架 SimCLR,它不仅优于此前的所有工作,也优于最新的对比自监督学习算法, 而且结构更加简单:这个结构既不需要专门的架构,也不需 ...

  9. CSS知识点记录

    1.浏览器style中显示的样式 这里面的样式,是行内样式或者是使用js添加的样式

  10. 微信小程序下拉加载下一页

    小程序做得多了,有些常用功能就有必要记录一下 请看详解: 微信小程序之下拉触底时加载下一页 wxml参考: <scroll-view class='dataContainer' scroll-y ...