《.NET 设计规范》第 6 章:扩展性设计

第 6 章:扩展性设计

6.1 扩展机制

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  

6.2 基类

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

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

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

6.3 密封

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

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

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

  

时间: 2024-11-10 00:34:25

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

数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题

程序开发中,经常遇到一条记录有多个状态位,比如一条商品,他属于热门,新品,特卖.我们的数据库如何设计呢? 一般有几种方法 (1)建立关联表 关联表字段:关系Id,商品Id,属性Id 查询:使用关联表的方式,查询某属性的商品. 程序:写入时,写商品表和关联表: (2)将多个属性存在一个字段中,用|分割 状态存储在一个字段中,比如某条商品属于热卖,新品和特卖,则字段存储的值:01|02|03 SQL查询:使用like 程序处理:(1)取值需要先将01,02,03分割,再处理.(2)写入需要先将01,

浅谈如何做业务项目通用性、扩展性设计

前言 总结下如何设计项目方案.本文从通用.扩展两个角度去考虑项目该怎么设计,有哪些常用的手段.水平有限,望大家留言指正. 必要前提 充分的业务分析 充分了解业务细节:需求分析或者prd阶段,要充分掌握需求的细节.细节可能会决定:数据从哪获取(多处数据源如何统一接入),如何流转(流程插拔),存储选型(那种存储方便扩展:比如nosql存储异构数据). 考虑不同业务线的差异:业务线的差异可能会导致:数据源不同.指标口径不同.规则差异. 未来3-5年的规划 给未来留扩展空间:这个主要考虑业务的发展趋势,

实践 | Sentinel 扩展性设计

摘要: Sentinel 提供多样的 SPI 接口用于提供扩展的能力.用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地给 Sentinel 添加自定义的逻辑. 初始化逻辑扩展机制 为了统一初始化的流程,我们抽象出了 InitFunc 接口代表 Sentinel 的一些初始化逻辑,如: 注册动态规则源(示例) 注册 StatisticSlot 回调函数(示例) 启动 Command Center 初始化心跳发送 我们可以通过注解设置 InitFunc 执行的

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

英文原文:Inside NGINX: How We Designed for Performance & Scale 为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的(process-based)架构, NGINX则以一种复杂的事件驱动(event-driven)的架构脱颖而出,这种架构能支持现代硬件上成千上万的并发连接. Inside NGINX info

在设计IOSapp时为了代码的扩展性可可维护性需要遵守的原则

作为软件工程范畴的iosApp,为了保持代码的可维护性和扩展性,必然要遵守软件的基本特性,众所周知高内聚低耦合的程序才能具备这样的特性. 首先,不能依赖于storyboard和xib,原显而易见.第一点是,在源代码管理方面,在团队项目中,一旦有人改变了一点内容storyboard就会显示modify的样子,所以让人看起来很不安,其实带着M的原因很可能就是其他团队成员鼠标手点击了一下而已,最新的源代码管理工具在Xcode中的集成基本上解决了这个问题,但是依然还是会产生严重的代码冲突,这不是团队人员

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

<.NET 设计规范>第 5 章:成员设计 5.1 成员设计的通用规范 要尽量用描述性的参数名来说明在较短的重载中使用的默认值. 避免在重载中随意地改变参数的名字.如果两个重载中的某个参数表示相同的输入,那么该参数的名字应该相同. 避免使重载成员的参数顺序不一致.在所有的重载中,同名参数应该出现在相同的位置. 要把最长的重载成员定义成重载成员中唯一的虚成员. 不要用 ref 或 out 修饰符来对成员进行重载. 不要定义这样的重载:位于同一个位置的参数有相似的类型但却有不同的语义. 要允许在传

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

1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 5. 组合(Composition),而不是继承(inheritance) 2 6. Ocp原则开闭原则2 7. Plugin系统2 8. 流程扩展工作流系统,流程自定义2 9. Ui扩展 html53 10. 数据独立性3 11. 脚本与hotdeploy3 12. 表处理扩展if else (数据与数据处理相互分离)3 13. 系统被扩展的几种形式(方法级别,模块级别)3 1

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

第 17 章 高可用设计之思路及方案 前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库系统一旦出现问题无法提供服务,所有系统都可能无法继续工作,而不像软件中部分系统出现问题可能影响的仅仅只是某个功能无法继续服务.所以,一个成功的数据库架构在高可用设计方面也是需要充分考虑的.本章内容将针对如何构建一个高可用的 MySQL 数据库系统来介绍各种解决方案以及方案之间的比较. 17.1 利用

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

第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体系,提升系统的扩展能力,通过组合多个低处理能力的硬件设备来达到一个高处理能力的系统,也就是说,我们必须进行可扩展设计.可扩展设计是一个非常复杂的系统工程,所涉及的各个方面非常的广泛,技术也较为复杂,可能还会带来很多其他方面的问题.但不管我们如何设计,不管遇到哪些问题,有些原则我们还是必须确保的.本章