第 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. 下载的js文件本地编辑器打开中文乱码如何解决

    今天遇到的小问题,已解决,直接上图 下载直接打开是这样的 用记事本打开 另存为utf-8格式 正常了!

  2. Inception服务的安装以及使用Python 3 实现MySQL的审计

    Inception服务的安装以及使用Python实现MySQL的审计 Bison是Inception服务所依赖的包之一,但是某些Linux版本已安装的Bison,或者是通过yum安装的Bison,通常 ...

  3. Open-air shopping malls(二分半径,两元交面积)

    http://acm.hdu.edu.cn/showproblem.php?pid=3264 Open-air shopping malls Time Limit: 2000/1000 MS (Jav ...

  4. echarts图表里label文字过长换行的方法

    在做一些图标时,有时会出现显示文字过长的问题,需要将其按照指定的字数换行,像下图这样 而echarts没有提供换行的方法,但是可以使用fomatter方法进行设置,代码如下 formatter: fu ...

  5. light oj 1184 Marriage Media

    题目: You run a marriage media. You take some profiles for men and women, and your task is to arrange ...

  6. 客户端怎么查看SVN的代码库

    安装SVN客户端,比如TortoiseSVN,然后将代码库checkout到本地,或者通过客户端的版本库浏览器直接连接SVN服务器查看代码库的目录结构. 如果SVN服务器端安装的时候是和Apache集 ...

  7. 织梦dedeCMS留言薄

    dedeCMS留言薄模塊名爲guestbook, 留言薄模板:/templets/plus/guestbook.htm; 留言回覆模板: 管理員回覆調用/templets/plus/guestbook ...

  8. dede 你所上传的软件类型不在许可列表,请更改系统对扩展名限定的配置

    后台,系统,系统基本参数,附件设置格式

  9. 【编程技巧】addSubview和insertSubview的区别

    addSubview 是将view加到所有层的最顶层 相当于将insertSubview的atIndex参数设置成view.subviews count 即 [view addSubview:onev ...

  10. DALI解码模块

    DALI-MOD2接口模块使用手册 一.概述(联系人:张先生,电话:13923882807,QQ:813267849) 一.概述 欢迎使用本公司的DALI解码模块,该模块支持"DALI第一套 ...