利用泛型减少重复,实现简易AOP

 

利用泛型减少重复,实现简易AOP

一、设计原则之DRY,不要重复自己

   在所有设计原则中,DRP(Don't Repeat Yourself)是最基础的原则之一。是由 Andy Hunt 和 Dave Thomas 在 The Pragmatic Programmer 中总结出来的,

成为软件开发和设计的最佳实践基础。开发者认识到,通过好的实践和适当的抽象可以减少重复,使程序的代码变得简洁。
 
   重复是一种浪费。程序中的每一行代码都需要维护,重复就会导致出现bug的机会增多,也增加了系统的复杂度。对开发者而言,修改一个地方,而没有修改其他相同
逻辑的地方会让他们感到很难维护。单一职责要求:每个知识点必须有一个唯一的,明确的,权威的描述。
 
   重复的过程需要自动化。DRP可以用在过程上,比如手工测试,慢,容易出错,而且难以重复,自动化测试就可以解决这些问题。凡是可以标准化,重复的过程都可以自动化。
 
   重复的逻辑需要抽象。逻辑中的重复,比如拷贝的if-then swith-case 语句是很容易检查到的,很多设计模式就是来解决这种问题。如果一个对象的创建之前需要做很多事情,
可以用工程模式来封装,如果一个对象的行为有很多种变化,可以用策略模式来处理,而不是用大量的if else  语句。
 
   DRP 是基础,比如开闭原则,单一职责,一次且仅一次的原则都是建立在DRP原则之上
 

二、泛型基础

 

   泛型是C# 2.0 提出的特性,所谓泛型,即通过参数化类型实现在同一份代码上操作多种类型的数据,泛型编程是一种范式的转化,利用参数化类型,将类型抽象化,

从而实现代码的灵活复用,精简代码。泛型的好处:

 

   a.减少了对对象进行装箱和拆箱所导致的性能成本,提高了效率。

   b.赋予了代码更强的类型安全。

   c.实现了更为灵活的代码复用。

 

例如: 安全性 装箱拆箱

var list = new  ArrayList();
list.Add(44); //装箱
list.Add("mystring");
list.Add(new  MyClass());
int i = (int)list[0]; //拆箱
 
list的就是不安全的,如果我们要对他继续类型转换,那么他就会出现异常。而且他add int类型,string类型的时候就要涉及装箱,你取出来的时候要涉及的拆箱

 

泛型格式:

泛型类      class MyClass<T>{}

泛型方法    T Function<T>()

泛型接口    interface MyInterfac <T> ,.NET类库里有很多泛型的接口 比如:IEnumerator<T>、IList<T>等

泛型委托    delegate void MyAction<T>(T obj);


.NET类库在System名称空间,下定义了三种比较常用的泛型委托
Predicate<T>委托:delegate bool Predicate<T>(T obj);
Func<T>委托     :TResult Func<in T, out TResult>(T arg);
Action<T>委托   :delegate void Action<in T>(T obj);

 

在定义泛型时,可以对客户端代码在实例化类时用于类型参数的类型施加一些限制,这些限制称为约束,约束是使用where关键字实现的。..

下表列出了五种类型的约束:

 

T:struct

类型参数必须是值类型。 Nullable can be specified.">可以指定除 Nullable 以外的任何值类型。 

T:类

类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。 new() constraint must be specified last.">当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。

class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
    // ...
}
 
这个是多类,接口,无参数的公共构造函数 各种进行了约束

 

 

默认值,  我们可以用default关键字为  泛型 设置默认值

public T GetT()
{
    return default(T);
}

 

三、EAP里面的重复代码

 

   在Imp 接口实现层,有很多重复的代码,最常见的重复是日志和异常的处理代码,还有返回值的处理,例如:

   这里真正的业务代码只有1句   result.Value = this.BillBfl.GetImportBillSubSys();

 

   这里真正的业务代码只有2句  

   TNBillLayout layout = TNBillLayout.FromJson(jsonparam); 

   this.BillBfl.SaveBillLayout(layout);

     这种代码在Imp层有很多,随处可见。 其他都是类似的,拷贝的,容易出错。

 

四、利用泛型改造后的代码

      利用泛型方法和泛型委托,可以将上面的日志和异常处理提炼出来。例如:有返回值的泛型方法   

   无返回值的泛型方法

 

EAP中封装了如下的泛型方法,包含多至5个参数的又返回值和无返回值的泛型方法
 

 

专门针对IMP层代码的泛型方法

  

  

最多6个参数的泛型方法

 

 

改造后的代码:

 

 

 

 

  总结: 利用泛型方法,可以实现日志,异常,性能计数的拦截,实现简易的AOP,同时减少重复,使代码变得简洁。

 


 

转载于:https://www.cnblogs.com/drivenwinder/p/4475837.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值