阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

框架设计规范的新方向

  • 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:31998
用户头像

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

关注

评论

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

【Flutter 专题】61 图解基本 Button 按钮小结 (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 8月日更

Linux 虚拟文件系统(VFS)分析

赖猫

Linux 文件系统

架构训练营第 1 期 模块五作业

高远

Python代码阅读(第15篇):列表求交集

Felix

Python 编程 Code Programing 阅读代码

腾讯良心了?!!!

Jackpop

Go字符串拼接最佳实践

Rayjun

Go 语言

MySQL 系列教程之(十)索引原理:B+ 树与索引

若尘

MySQL 数据库 8月日更

从0开始的TypeScriptの十二:装饰器

空城机

JavaScript typescript 大前端 8月日更

elasticsearch7.13.4 ik中文分词器安装

Rubble

8月日更

前端基础六之jQuery效果

ベ布小禅

8月日更

帮小姐姐打分系统的模型创建,滚雪球学 Python 第三轮第 11 篇

梦想橡皮擦

8月日更

万企明道成立八周年,邀你书写留言!

明道云

【Vue2.x 源码学习】第四十二篇 - 组件部分 - 组件挂载流程简述

Brave

源码 vue2 8月日更

fil币怎么挖矿?fil挖矿怎么挖?

fil挖矿怎么挖 fil币怎么挖矿

人工智能下的音频还能这样玩!!!!

Python研究者

8月日更

仿TP钱包开发,去中心化钱包源码开发

质量基础设施一站式服务平台搭建,NQI平台搭建

ndk-build 脚本

Changing Lin

8月日更

先「干」,就对了

非著名程序员

个人成长 职场 认知提升 8月日更

C++ 中的 Pipeable 编程

hedzr

c++ pipeable

批量SQL优化实战

码农参上

sql SQL优化 8月日更

硬盘空间免费扩容了2TB!!!

Jackpop

你可能不知道的css动画性能

云小梦

CSS layout requestAnimationFrame 重排和重绘 will-change

Go,一文搞懂 string 实现原理

微客鸟窝

Go 语言 8月日更

博客升级之在线代码编辑器

devpoint

vscode 编辑器 8月日更

网络攻防学习笔记 Day112

穿过生命散发芬芳

网络安全 8月日更

程序员必备!5款小众高效的开发神器

Jackpop

☕【Java技术指南】「并发原理专题」AQS的技术体系之CLH、MCS锁的原理及实现

洛神灬殇

AQS 8月日更 MCS锁 CLH锁

为什么要选择filecoin矿机挖矿?为什么不直接购买filecoin?

分布式存储 IPFS Filecoin fil挖矿 fil矿机

上游思维:谁来为没有发生的事情买单?

石云升

读书笔记 8月日更 上游思维

服务发现机制SPI居然是破坏者!

4ye

Java 源码 后端 sping 8月日更

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