武汉的开发者们注意啦!AI技术战略、框架以及最佳实战尽在Azure OpenAI Day 了解详情
写点什么

框架设计规范的新方向

  • 2008-11-06
  • 本文字数:1361 字

    阅读完需:约 4 分钟

微软的框架设计规范是设计的准则,它期望所有的微软类库和独立开发者都能够遵循这一准则。随着每个.NET 框架版本的发布,以及在行业内的测试,它们的版本也得到了精化。通过 Cwalina 与 Abram 所著的《框架设计规范》第二版的发布,我们可以看到微软在今后几年的发展方向。

或许最令人惊讶的事实是日渐增长的对于测试驱动开发和依赖注入的重视。在可重用框架的场景下,通过测试驱动开发设计出的框架是真实可用的,而不是简单地推理。他们希望这样可以反过来杜绝某种趋势,那就是过度复杂地设计一些根本不会用到的功能。

谈到这一问题,就不得不指出的是微软当前正在推动的一个活动,即针对所有库的第 1 个版本进行最低限度设计。这不同于在第一次就要试图将所有事情做对,微软推荐在最开始只需要满足需求中绝对需要的特性。Abrams 和 Cwalina 建议在最初并不需要考虑扩展性,只有到需求变得非常清晰的时候,才在后一个版本中考虑。从某个方面来讲,这是微软旧有传统的回归,它只会在第三个版本中提供真正完成的应用程序。

在其它领域,微软则完全没有改变。他们仍然强调所谓的“基坑成功(Pit of Success)”,并将其作为设计圭臬,特别是在谈及开发者的生产力时,尤其如此。例如,对于 Exception 类的构造函数应该定义为 protected,而不是 public,这就可以强迫开发者采取正确的方式,抛出一个适当的异常。相反地,我们现在必须借助于 FxCop 准则对此进行检查。

他们不断鼓吹的另一个原则是“相同的力量”,对这一目标的追求可以使得新类库的工作方式,对于其他.NET 类库的用户而言是直观的。它被应用在代码的各个方面,包括命名规范、术语约定以及设计模式。

微软强调的新增内容是依赖注入。虽然他们总是被用在各个类库中,但从未如此正式地将其看作为一种设计模式。相反,它仅仅在 API 需要时作为一种补充。这种情况到了.NET 3.0 有所改变,依赖注入与控制反转都是一种特定的要求。

一旦涉及到 CLR 顶端的技术,框架设计规范就是不可知的。例如,微软并没有用它来推动依赖注入类库,即托管的可扩展性框架的运用。相反,其重点放在设计目标、编写松散耦合、可测试的代码上。

在 PDC 中,特别强调了某些特定的建议,包括:

类的构造函数应该是延迟的。从本质上讲,他们所要做的不仅仅是要捕获参数,因为通常不会用到新的被实例化的类。

属性应该:

  • 不要抛出异常(getter)
  • 不要被用作转换(getter)
  • 不要产生副作用(setter)
  • 足够快速,而不用考虑对象的状态
  • 永远不要返回一个数组,或者一个克隆的列表(getter)

扩展方法应该用于为接口“添加”重载,也可以用于管理类库之间的依赖。例如,如果程序集 B 依赖于程序集 A,则 A 中的类不会暴露 B 中的功能。然而,A 中的类可以通过 B 中的扩展方法进行标记,提供依赖的效果,但实际这种依赖并不存在。

对于类的层级,总体不应超过 2 到 3 个层级。过深的层级会导致很难保证每个实现,因为实现必须遵循整个契约。谈到这一问题,其中至关重要的一点,就是为了保证工作正确,任何重写的成员都应该具有一个显式的契约细节,以包含子类需要做的内容。

接口应该小,最好只包含一个方法。每增加一个额外的方法,就可能使得接口难以正确设计,而在将来甚至会需要更多的方法。如果不适用于抽象基类,可以将接口串联在一起,以构建其功能。

查看英文原文: New Directions in Framework Design Guidelines

2008-11-06 23:31990
用户头像

发布了 109 篇内容, 共 39.6 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

鸿蒙App开发该如何提速

Geek_2305a8

青否数字人源码软件平台开发!

青否数字人

数字人

动手实践丨轻量级目标检测与分割算法开发和部署(RK3568)

华为云开发者联盟

人工智能 自动驾驶 华为云 华为云ModelArts 华为云开发者联盟

能碳双控| AIRIOT智慧能碳管理解决方案

AIRIOT

智慧系统 能碳管理 智慧能碳

智能化测试框架与平台的设计与实现:基于人工智能技术的创新

测吧(北京)科技有限公司

测试

数字人SaaS系统源码部署,轻松实现直播带货!

青否数字人

鸿蒙应用成企业布局新方向 鸿蒙人才成开年之后“香饽饽”

最新动态

如何为数据采集项目选择合适的API

Noah

SD-WAN:三步轻松实现异地访问总部内网

Ogcloud

SD-WAN 企业网络 SD-WAN组网 SD-WAN服务商 SDWAN

从零开始用Rust编写nginx,原来TLS证书还可以这么申请

EquatorCoco

nginx rust 开发语言 语言 & 开发

教你学会Next.js14(c-shopping电商开源)

Geek_9da61c

JWT Tailwind next.js joi rtk query

微软曾想将 Bing 搜索卖给苹果;英伟达首次公开将华为列为对手丨 RTE 开发者日报 Vol.151

声网

小程序应用、页面、组件生命周期(涵盖启动、显示、隐藏、错误、未找到、卸载阶段)

天津汇柏科技有限公司

小程序开发 软件定制开发 软件开发定制

鸿蒙Next升级是否有便捷的方法?

Geek_2305a8

AI数字人SadTalker实战

不在线第一只蜗牛

AI 数字人 人工智能技术

面试官:限流的实现方式有哪些?

王磊

Java 面试

拟人化智能自动化遍历

测吧(北京)科技有限公司

测试

企业过二级等保采购哪家堡垒机好?电话多少?

行云管家

等保 堡垒机 等保测评 二级等保

提升生产能力的必备工具——MES系统自动排产

万界星空科技

生产管理系统 mes 万界星空科技 生产管理 自动排产

大模型如何助力开发者打造新质生产力

百度开发者中心

人工智能 大模型

大模型时代软件研发效率革命

百度开发者中心

人工智能 大模型

分库分表如何管理不同实例中几万张分片表?

程序员小富

Java 分库分表 springboot

解决混合精度训练大模型的局限性问题

百度开发者中心

人工智能 深度学习 大模型

DAPP算力质押NFT合约系统开发|项目方案|技术成熟

l8l259l3365

英特尔首推面向AI时代的系统级代工

E科讯

文心一言 VS 讯飞星火 VS chatgpt (202)-- 算法导论15.3 1题

福大大架构师每日一题

福大大架构师每日一题

框架设计规范的新方向_.NET_Jonathan Allen_InfoQ精选文章