第 6 章:扩展性设计

6.1 扩展机制

  考虑用不包含任何虚成员或受保护的成员的非密封类来为框架提供扩展性。这种方法所提供的扩展性广受用户欢迎,而且它的开销也不高。

  考虑将受保护的成员用于高级的定制方案。

  要在对安全性、文档及兼容性进行分析时,把非密封类中受保护的成员当做公有成员那样来对待。

  考虑使用回调函数来允许用户向框架提供自定义的代码供框架执行。

  考虑使用事件来允许用户对框架的行为进行定制,这样就不需要用户对面向对象设计有深入的了解。

  要优先使用事件,而不是简单的回调函数,其原因在于广大开发人员更熟悉事件,而且事件与 VS 的语句自动完成特性结合得很好。

  避免在对性能要求很高的 API 中使用回调函数。

  要在定义用了回调函数的 API 时,使用新的 Func<...>、Action<...> 或 Expression<...> 类型,而不要使用自定义的委托。

  要在用 Expression<...> 来代替 Func<...> 和 Action<...> 委托的时间进行测量,从而了解它可能对性能产生的影响。

  要理解在调用委托时可以执行任何代码,这可能会引起安全性、正确性及兼容性的问题。

  不要使用虚成员,除非有合适的理由,而且对设计、测试及维护虚成员的开销有清楚地认识。

  要优先使用受保护的虚成员,而不是公有虚成员。公有成员应该通过调用受保护的虚成员的方式来提供扩展性(如有必要)。

  不要提供抽象,除非为该抽象开发出多个具体实现并通过用到该抽象的 API 对其进行过的实际测试。

  要在设计抽象时谨慎地选择抽象类或接口。

  考虑为抽象的具体实现提供参考测试。这类测试应该能告诉用户,他们是否正确地实现了契约。

  

6.2 基类

  考虑将基类定义为抽象类,即使他们并不包含任何抽象成员。这能够清楚地告诉用户,设计这些类的目的完全是为了让用户使用它们来派生自己的子类。

  考虑把基类与用于主要场景的类型分开,并放到单独的命名空间中。根据定义,基类是为了高级的扩展场景而设计的,因为大多数用户对它们并不感兴趣。

  避免在命名基类时使用“Base”后缀 - 如果公共 API 会用这个类。

6.3 密封

  不要把类密封起来,除非有恰当的理由。

  不要在密封类中声明受保护的成员或虚成员。

  考虑在覆盖成员时将其密封。

  

《.NET 设计规范》第 6 章:扩展性设计的更多相关文章

  1. 深入NGINX:我们如何设计它的性能和扩展性

    为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的 (proc ...

  2. 《.NET 设计规范》第 5 章:成员设计

    <.NET 设计规范>第 5 章:成员设计 5.1 成员设计的通用规范 要尽量用描述性的参数名来说明在较短的重载中使用的默认值. 避免在重载中随意地改变参数的名字.如果两个重载中的某个参数 ...

  3. Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结

    Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结 1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 ...

  4. MySQL性能调优与架构设计——第 17 章 高可用设计之思路及方案

    第 17 章 高可用设计之思路及方案 前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库 ...

  5. MySQL性能调优与架构设计——第12章 可扩展设计的基本原则

    第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体 ...

  6. 设计模式如何提升 vivo 营销自动化业务扩展性 | 引擎篇01

    在<vivo 营销自动化技术解密 |开篇>中,我们从整体上介绍了vivo营销自动化平台的业务架构.核心业务模块功能.系统架构和几大核心技术设计. 本次带来的是系列文章的第2篇,本文详细解析 ...

  7. 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)

    引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概 ...

  9. Zend server最大化应用程序的性能、扩展性和可用性

    如果我有8个小时去砍到一棵树,我会花6个小时磨斧子”——林肯(美国总统) 你可以知道? 世界页面访问量的峰值超过7000万每分钟. CloudFare公司服务器问题,导致785000站点崩溃一小时. ...

随机推荐

  1. MySQL如何插入测试数据

    关于插入MySQL测试数据,这里介绍两种方法: 选择优先级(结合PHP生成测试数据 > 使用存储过程 ). 使用存储过程(建议测试数据小于1000条使用该方法) 具体代码如下: 创建表: mys ...

  2. NEST 中的协变

    Convariant search results version 5.x NEST 直接支持返回协变结果集合.这意味着,可以将搜索结果的类型指定为一个接口或者基类,但是其真实类型仍然是接口或基类的一 ...

  3. python对pywifi模块的认识

    pywifi是一个用来搞wifi的模块 下一章我们将用他破解wifi密码 pywifi安装 pip install pywifi 下列代码判断是否有无限网卡 import pywifi import ...

  4. CSS position: absolute、relative定位问题详解

    CSS2.0 HandBook上的解释:  设置此属性值为 absolute 会将对象拖离出正常的文档流绝对定位,而不考虑它周围内容的布局.假如其他具有不同 z-index 属性的对象已经占据了给定的 ...

  5. jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式

    jQuery是继prototype之后又一个优秀的Javascrīpt框架.它是轻量级的js库(压缩后只有21k) , 它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safa ...

  6. bzoj:1659: [Usaco2006 Mar]Lights Out 关灯

    Description 奶牛们喜欢在黑暗中睡觉.每天晚上,他们的牲口棚有L(3<=L<=50)盏灯,他们想让亮着的灯尽可能的少.他们知道按钮开关的位置,但喜闻乐见的是他们并没有手指.你得到 ...

  7. Linux文件链接hard link与symbolic link

    Linux中文件链接有两种方式,一种是hard link,又称为硬链接:另一种是symbolic link,又称为符号链接.要区分两者的不同要回顾Linux常用的ext2文件系统.这种文件系统使用in ...

  8. Redis进阶实践之五Redis的高级特性

    一.引言    上一篇文章写了Redis的特征,使用场景,同时也介绍了Redis的基本数据类型,redis的数据类型是操作redis的基础,这个必须好好的掌握.今天我们开始介绍一些Redis的高级特性 ...

  9. 一篇文章让你深透理解cookie和session,附带分布式WEB系统redis共享session方案

    cookie和session有什么区别?这是一个很基础的知识点,大家可能都知道一个大概:cookie是存在客户端的,session是存储在服务端,cookie和session用来验证识别用户的登录状态 ...

  10. Composer 是什么

    简单来说,Composer 是一个新的安装包管理工具,服务于 PHP 生态系统.它实际上包含了两个部分:Composer 和 Packagist.下面我们就简单说一下他们各自的用途. Composer ...