第 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. Oracle 11G Client 安装就可以用上Oracle11G啦,不用傻傻的安装2G多的Oracle啦,安装特别简单,使用起来更简单

    下载地址: http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_client.zip 先将下载下来的ZIP文件解压,并运行se ...

  2. 如何让一个DIV水平,垂直方向都居中于浏览器?

    <style type="text/css"><!-- div {position:absolute;top:50%;left:50%;margin:-150px ...

  3. hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)

    #1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...

  4. 2017ecjtu-summer training #6 Gym 100952D

    D. Time to go back time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  5. 拿到List<Map<String,String>>对用属性的值。。。。。。。

    list.get(i).get("orderNumber") 来拿到下面的对应属性的值

  6. Django App(二) Connect Mysql & defualt App admin

    这一篇接着上一篇polls App自动创建admin app.     1.安装数据库 这里的内容从官网看越看越像 EntityFramework的内容.Python支持SQLite,MySql,Or ...

  7. [国嵌笔记][027][ARM协处理器访问指令]

    协处理器作用 协处理器用于执行特定的处理任务,如数学协处理器可以执行控制数字处理,以减轻处理器的负担.ARM处理器最多可以支持16个协处理器,其中CP15是最重要的一个协处理器 CP15的作用 CP1 ...

  8. parsing XML document from class path resource [config/applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [config/applicationContext.xml] 解决方案

    parsing XML document from class path resource [config/applicationContext.xml]; nested exception is j ...

  9. 【转载】keil5中加入STM32F10X_HD,USE_STDPERIPH_DRIVER的原因

    初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题.出现如下警告或错误提示: warning: #223-D: function &qu ...

  10. 宝塔linux面板.txt

    安装命令: yum -y install screen wget && screen -S bt wget -O install.sh http://103.224.251.79:58 ...