.NET 框架设计(理解)c#、.NET Library 整理(一)

1、类、继承、接口(六大原则)

    简单理解,类是定义对象结构的一个过程,静态语言都需要这样的一个定义过程,也就是定义对象实例化的模板,从这个模板出来的所有对象都是一致的。

    其实类是对业务建模过程的定义,当我们通过面向对象的思想来将业务切割、建模,并创建出一个个具有真实业务概念的类时,类会体现出这门设计语言的价值和重要性。

类是用来体现领域模型的元素,所以我们对类的定义要尽量贴近领域模型,贴近真正的业务逻辑,将领域模型中的数据、逻辑进行抽象归纳,最后得出一个丰富饱满的对象。

 2、字段、属性、常量、枚举

    字段是用来保存状态值的最终归宿,在类中声明一个字段,最为中要的就是考虑其访问范围,设计原则告诉我们,字段尽量使用属性进行访问,这对后面的重构起到很大的帮助。如果将字段直接暴露给外部使用,那么至少使用该字段的地方都直接依赖该字段,你将无法对该字段做任何改动。

    大型分布式系统从分组开发到合并代码在到集成测试上线,中间会经历很多复杂的流程,而常量和枚举是最容易出现问题的地方之一。其中最容易出现问题是他们本身代表的之被替换了或被弄反了,通常出现的场景是:将枚举值作为数据库的调用参数,而数据库里却直接使用了数字来进行判断,所以这里千万要注意。还有在分组开发的时候,你声明的枚举没有定义默认值,这样当别人的定义替换你之前的位置时,你的枚举值被莫名其妙修改了,这种场景在和别合并分支代码的时候最容易出现。因此在定义枚举的时候要记得赋上初始值。

    而常量主张用来定义字符串的不变量。比如我们经常在点吗中使用”魔幻数字“,这时我们应该将其提取出来定义成一个不变的常量集合。如果时跟配置相关的,应该跟配置文件的DOM对象声明在一个命名空间中,这样便于查找。

   3、方法、委托、事件

      方法扮演着对象的行为一职,因此就存在这重用,当类型被继承时就会设计对基类行为的访问和扩展。在编写方法的时候,要尽量避免大块的代码耦合在一个方法里面(单一职责),试着将大块的代码段碎片化形成高重用的方法群。方法碎片化就好比SOA思想一样,重用性极高,更易于维护,每个方法都是相互调用,互相组合来完成一个逻辑。

       每个方法尽量只做与他返回的类型相关的工作。

      方法能重用当然很好,但是前提是我们必须具有方法所在的对象实例,才有可能成功的调用方法,因为方法作为对象的行为存在于对象实例中,也就意味着要依赖我们调用方法的对象。高内聚、低耦合是软件设计中的一个航灯。

       委托:通过委托,我们就可以在不需要方法宿主实例的情况下直接调用某个方法。委托将方法对象化,然后可以无任何时空限制的传递这个对象,甚至可以序列化到地球的另一端,然后再自然的调用。

对委托本质的理解很重要,这将直接决定你如何提供对外接口。委托是对方法的对象化包装,其主要的目的是让方法可以传递,这可以让我们在设计某个逻辑的时候无缝的集成一些第三方过滤算法。

在后续理解中,将包括委托的高级应用,就是把委托当成SOA接口的一个算法参数对象,这将设计委托的序列化和传输。

     对象的行为是被动的,只有在被调用的时候,才能去完成某些工作。那么对象的动态行为是如何完成的?比如,当订单对象中的所有商品都没有库存时,我们该如何告知用户:商品由于库存不足无法及时派送。从领域驱动设计专业角度来讲,这其实就是领域事件。当领域实体内部发生事件能及时通知到相关者,以便其能做出适当的响应。

/*******************************************************************************

 使用事件时的注意事项:

         1、多播事件注意内存溢出:如果你的事件时可以被多个对象监听的,那么在释放对象时,一定要及时清理你所暴露出来的事件。因为有可能某个对象的方法还挂在你的事件上,导致你的对象无法及时被GC回收。如果这个对象是一些边角的辅助对象还无所谓,但是,如果这个对象时核心业务点中的一个,那么就可能给系统带来瓶颈,而且也很难查找定位问题。其实,往往所有事件通知的对象都是比较重要的对象。

         2、移除时的判断:在对事件移除时,一定要记住先判断,然后在进行移除操作。避免在移除过程中频繁抛出异常。

         3、异步领域事件与事件回溯:事件的作用很大,在复杂业务场景中,我们会使用异步事件来保存领域状态,必要时用回溯事件之来还原领域模型。而使用异步保存领域模型的状态值也恰恰可以个高并发的系统架构带来很好的性能提升,将同步与异步进行读写分离。

            由于是采用异步的方式操作,所以我们可以将对事件的具体事件处理放在一个相对平稳的运行环境中,然后在进行高并行异步数据处理,类似于EDA(Event Driven Architecture)。这种应用场景多半在对核心业务进行操作跟踪时使用。

**********************************************************/

2. 泛型、协变/逆变、类型推断

     泛型的出现让模板化代码成为可能,我们可以共用一组算法对任何领域实体进行相同的计算,这也是泛型元素出现的根本需求。

   泛型可以让类型参数化,这就允许我们在设计功能的时候可以提高设计思路,更加提倡面向抽象编程。在泛型计算的时候,我们可以先不去估计客户到底会传递什么类型的参数,只要对类型参数做抽象化的约束就性,使用泛型约束来强制参数类型范围。例:public TResult GetPrice(TSource order) where TResult:Class   => TResult 泛型限制为类。

   既然泛型可以类型参数化,类型时存在这泛化关系的。这是就需要使用协变/逆变来解决泛型使用过程中的类型转换。

   协变:派生类向基类转换

    逆变:基类向派生类转换

在使用泛型时,可以使用泛型的类型推断,让平台自动的计算潜在的类型到底是什么类型。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(.NET 框架设计(理解)c#、.NET Library 整理(一))