2018正版葡京赌侠诗《.NET 设计规范》第 9 章:常用的设计模式

第 9 章:常用之设计模式

9.1 聚合组件

  考虑呢常用的特性域提供聚合组件。

  要为此聚合组件来对高层的概念(物理对象)进行建模,而不是本着系统级的职责进展建模。

  要为聚合组件的讳和显的系统实体相对应,比如
MessageQueue、Process 或 EventLog,这样便会而项目更加不言而喻。

  要于设计聚合组件时若初始化尽可能地概括,这样用户就待进行简要的初始化就得以组件。如果有同起初始化是必不可少的,那么由尚未指向组件进行初始化而吸引的百般应肯定地报用户应怎么开。

  不要要求汇组件的用户在一个场面被显式地实例化多个目标。

  要力保让聚合组件支持 Create-Set-Call
使用模式,这样用户就是得先实例化组件,然后设置它的习性,最后调用一些简练的方式,以实现多数状况。

  要为具备的集合组件提供默认构造函数或生简便的构造函数。

  要呢集组件提供可读写的特性来跟构造函数中之持有参数相对应。

  要在集合组件中采用事件,不要使基于委托的 API。

  考虑就此事件来代表需要让挂的虚成员。

  不要要求汇组件的用户在常用场景中使用持续、覆盖方式以及落实接口。

  不要要求汇组件的用户在常用场景被除了编写代码之外,还要做另外的做工。例如,不应有于用户之所以配备文件来布局组件,也无应当给用户非常成资源文件,等等。

  考虑于聚合组件能够自行切换状态。

  不要涉及产生强状态的因数类型。

  考虑将集结组件集成到 VS 的设计器中。

  考虑把集组件和因子类型分开,各自放在不同之先后集中。

  考虑把集组件内部的因子类型暴露被外界看。

 

9.2 Async 模式

  要促成基于事件的 Async 模式 –
如果类型是一个支撑可视化设计器的零件(也就是说类型实现了 IComponent)。

  要落实藏的 Async 模式 – 如果必须支持等句柄。

  考虑当落实高层 API 时使用基于事件之 Async
模式。例如,聚合组件就当实现该模式。

  考虑以促成底层 API 时使用藏的 Async
模式,在这种情况下再强硬的意义、更少之内存消耗、更好的八面玲珑、更少之磁盘占用而于可用性更关键。

  避免以同一个色受到甚至是相同组有关的类别中还要落实两种植 Async 模式。

  要当啊异步操作定义 API 时遵循下面的预定。给定名为 Operation
的齐方法,应该提供名也 BeginOperation 和 EndOperation
的方法,它们的法子签名而下面所示(注意,输出参数不是必备的)。

  要包 Begin 方法的回来路实现了 IAsyncResult 接口。

  要保管联合方法的按值传递及随引用传递的参数在 Begin
方法吃还是比照值传递的。同步方法的出口参数不应当出现在 Begin
方法的签署中。

  要力保 End 方法的回路以及协办方法的回到路相同。

  要确保联合方法的其余输出参数与按引用传递的参数都作 End
方法的输出参数。同步方法中安排传递的参数不应当出现在 End 方法的签名中。

  不要继续执行异步操作 – 如果 Begin 方法抛来了酷。

  要同不成通过下的机制来打招呼调用方异步操作就完成。

    将 IAsyncResult.IsCompleted 设为 true。

    激活 IAsyncResult.AsyncWaitHandle 返回的守候句柄。

    调用异步回调函数。

  要通过打 End 方法被丢掉来老来代表爱莫能助得逞地得异步操作。

  要当 End 方法给调用时手拉手到位有没有完成的操作。。

  考虑抛来 InvalidOperationException 异常 – 如果用户用同一个
IAsyncResult 两不行调整用 End 方法,或 IAsyncResult 是起另一个休系的 Begin
方法返回的。

  要拿 IAsyncResult.CompletedSynchronously 设为 true –
当且仅当异步回调函数将在调用 Begin 方法的线程中运作的时段。

  要包于对的线程中调用事件处理程序。与经典 Async
模式相比,这是采用基于事件的 Async 模式的显要利益有。

  要保无操作都完结,还是操作失误,还是操作让撤,都是种会调用事件处理程序。不应有为应用程序无终止地等待一中间永远不会见发的风波

  要确保于异步操作失败后,访问时间参数近似的属性会抓住那个。换句话说,如果生不当致操作无法做到,那么就未该允许用户访问操作的结果。

  不要为回去值为空的章程定义新的事件处理程序要事件参数类型。要动用
AsyncCompletedEventArgs,AsyncCompletedEventHandler 或
EventHandler<AsyncCompletedEventArg>。

  要力保一旦当一个一步操作着贯彻了 PaogressChanged
事件,那么以操作的到位事件为点之后,不该更起此类事件。

  要力保一旦运用了正规的 ProgressChangedEventArgs,那么
ProgressPercentage
始终会为此来代表进度的百分于(不自然要是完全规范,但象征的必然要百分比)。如果采取的未是正规进度,那么从
ProgressChangedEventArgs 派生一个子类会重适合,这种景象下应该保障
ProgressPercentage 为 0 ;

  要于发增量结果需要报告的时候动身 ProgressChanged 事件。

  要针对 ProgressChangedEventArgs
进行扩张来保存增量结果数据,并就此扩展后的时空参数近似来定义 ProgressChanged
事件。

  要把增量结果告知及快报告分开。

  要吗每个异步操作定义单独的 <MethodName>ProgreessChanged
事件和对应的事件参数近似,来处理该操作的增量结果数据。

  

9.3 依赖属性

  要提供依赖属性 – 如果需要用他们来支撑各种 WPF
特性,比如样式、触发器、数据绑定、动画、动态资源与后续。

  要于设计乘属性之时候累自 DependencyObject
或她的子类型。该项目实现之习性存储区非常快速,它还自行支持 WPF
的数量绑定。

  要为每个依赖属性提供健康的 CLR 属性和存放
System.Windows.DependencyProperty 实例的公有静态只读字段。

  要经调用 DependencyObject.GetValue 和 DependencyObject.SetValue
的法来落实依靠属性。

  要就此依赖属性的名加上“Property”后缀来定名依赖属性之静态字段。

  不要显式地以代码中安依赖属性之默认值,应该在首位数据中设置默认值。

  不要当性能的访问器中补充加额外之代码,而相应采取规范代码来访问静态字段。

  不要采取依赖属性来保存保密数据。任何代码都能访问依赖属性,即使它是个人的。

  不要管依属性的印证逻辑在访问器中,而应当将证毁掉函数传被
DependencyProperty.Register 方法。

  不要以乘属性之访问器中落实属性改变的通知,而应该往
PropertyMetadata
注册改成通知之回调函数,后者是乘属性本身提供的一律宗特征,为了支持改变通知,必须用该特性。

  不要当乘属性之访问器中贯彻属性强制赋值逻辑,而该于
PropertyMetadata
注册强制赋值的回调函数。后者是借助属性本身提供的如出一辙桩特征,为了支持强制赋值,必须利用该特性。

  

9.4 Disopse 模式

  要呢含有可处项目实例的品类实现基本 Dispose 模式。

  要为项目实现基本 Dispose 模式并提供了方法 –
如果类型有需求由开发人员显式释放的花色,而且后者自并未结束方法。

  考虑啊接近实现核心 Dispose 模式 –
如果类似本身并无抱有非托管资源或只是办对象,但是它的子类型却可能会见有所非托管资源要只是处以对象。

  要论下的不二法门来落实 IDisposable 接口,即先调用
Dispose(true),然后再调用 GC.SuppressFinalize(this)。

  不要将任参数的 Dispose 方法定义为虚方法。

  不要啊 Dispose 方法声明除了 Dispose() 和 Dispose(bool)
之外的另外其它重载方法。

  要允许多次调用 Dispose(bool)
方法。他好当第一糟糕调用之后虽什么啊未举行。

  避免起 Dispose(bool)
方法被丢掉来特别,除非是紧急情况,所处之历程一度蒙损坏(比如泄漏、共享状态不雷同,等等)。

  要起分子中丢掉来 ObjectDisposedException 异常 –
如果该成员在对象了之后就是无法持续采取。

  考虑当 Dispose() 方法之外在供一个 Close() 方法 – 如果 close
是该领域被之一个业内术语。

  避免定义可竣工类型。

  不要定义可竣工的值类型。

  要用类型定义为而竣工类型 –
如果该档要当释放非托管资源,且非托管资源本身不有了方法。

  要呢拥有的只是竣工类型实现基本 Dispose 模式。

  不要当终止方法被做客任何可竣工对象,这样做在老非常的风险,因为让拜的目标可能都让收了。

  要用 Finalize 方法定义也叫保障的。

  不要以得了方法中推广了其他异常,除非是致命之系错误。

  考虑创建一个用于紧急情况的而是竣工对象 –
如果得了方法在应用程序域于挟持卸载或线程异常退出的情形下还必须要履行。

 

9.5 Factory 模式

  要先采取构造函数,而非是先行使用工厂,因为与新鲜的目标组织机制相比,构造函数一般的话还便于采取、更平等,也更方便。

  考虑用工厂 – 如果构造函数提供的靶子创建机制不能够满足要求。

  要运工厂 –
如果开发人员可能未知晓需要创建的对象的熨帖品种,比如对准基类或接口编程就属于这种情况。

  考虑以工厂方法 – 如果就是吃操作不提自明的绝无仅有方式。

  要在转换风格的操作着以 factory。

  要硬着头皮将工厂操作方法实现为方式,而休是实现吗性。

  要经过艺术的归来值如果无是方的出口参数来回到新创的靶子实例。

  考虑将 Create 和假设创造的类名连在一起,一破来定名工厂方法。

  考虑将要创建的档次名及 Factory
连在一起,一不好来定名工厂类型。例如,可以考虑将创建 Control
对象的厂子类型命名也 ControlFactory。

  

9.6 对 LINQ 的支持

  要促成 IEnumerabl<T>,其目的是为博基本的 LINQ 支持。

  考虑实现 ICollection<T>,其目的是为着提高查询的性。

  考虑实现 IQueryable<T> – 如果要使拜访传为 IQueryable
的积极分子的查询表达式。

  不要掉以轻心地实现
IQueryable<T>,要清楚这样做也许会见针对性能有什么影响。

  要在 IQueryable<T> 的道吃丢掉来 NotSupportedException –
如果您的数据源上无支持该操作。

  要于初类型中将 Query 模式实现啊实例方法 – 如果以 LINQ
以外的场合,这些措施以路受到还发生存在的义。否则,应该用她贯彻啊扩大方法。

  要受贯彻了 Query 模式在品种实现了 IEnumerable<T>。

  考虑以统筹 LINQ
操作符时,让它返回领域蓄意的而枚举类型。虽然于精神上来说,Select
查询方式可回来外项目,但是大家平常都期待查询的结果是不过枚举类型。

  避免但兑现 Query 模式之均等有 – 如果不愿意降低回来基本的
IEnuerable<T> 实现。

  要也平稳序列定义单独的门类,从而以它和相应之无序序列分开。这样的品种应该定义
ThenBy 方法。

  要延迟执行实际的询问操作。对 Query
模式的大多数成员来说,我期待它们只是创建一个新的靶子,并在枚举的时光才生集合重负荷查询条件的元素。

  要以用来查询的扩展方法在主命名空间中的一个叫做也“Linq”
的子命名空间被。例如,为 System.Data 特性定义的扩大方法吃放在
System.Data.Linq 命名空间。

  要以参数中行使 Expression<Func<…>>,而非是
Func<…> – 如果欲查询查询表达式。

 

9.7 Optional Feature 模式

  考虑用 Optional Feature 模式用于抽象中之可选特性。

  要供一个简约的布尔属性来叫用户检测对象是不是支持而摘特性。

  要在累积中拿可挑选特性定义也虚方法,并当该办法吃丢掉来
NotSupportedException 异常。

  

9.8 Simulated Convariance 模式

  考虑采用 Simulated Convariance 模式 –
如果急需发相同种植统一之种来表示泛型类型的有所实例。

  要管以相当价格的不二法门来落实基础类型成员与对应的泛型类型成员。

  考虑采用抽象基类来表示根基类型,而非是应用接口来代表根基类型。

  考虑就此非泛型类型作为基础类型 – 如果这么的品种已存在。

  

9.9 Template Method 模式

  避免以国有成员定义也虚成员。

  考虑动用 Template Method 模式来重新好地决定扩展性。

  考虑以非秀成员的名字加“Core”后缀为名字,来定名也该费虚成员提供扩展点的给保障之虚成员。

  

9.10 超时

  要先行让用户通过参数来制定超时长度。

  要先采取 TimeSpan 来代表过长度。

  要于过晚废弃来 System.TimeoutException 异常。

  不要通过返回错误码的道来报用户发生了晚点。

  

9.11 可供应 XAML 使用的档次

  考虑提供默认构造函数 – 如果想叫色会用于 XAML。

  要供标记扩展 – 如果想吃 XAML 读取程序能够创造不可变的项目。。

  避免定义新的类型转换器,除非这样的变换是自然而直观的。一般的话,应该以类型转换器的使限制限定于
.NET 框架中一度采取了类型转换器的地方。

  考虑用 ContentPropertyAttribute 用于最常用的特性,从而获得重新便于之
XAML 语法。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注