阅读目录:
本文中的内容都是我无意中发现觉得有必要分享一下的设计经验,没有什么高深的技术,只是平时我们可能会忽视的一些设计技巧;为什么有这种想法是因为之前跟一些同事交流技术的时候会发现很多设计思维被固化了,比如之前我在做客户端框架开发的时候会去设计一些关于Validator、DTO Transfer等常用的Common function,但是发现在讨论某一些技术实现的时候会被弄的云里雾里的,会自我郁闷半天,不会及时的明白对方在说的问题;
后来发现他们一是没有把概念分清楚,比如.NETFramework、C#、VisualStudio,这三者之间的关系;二是没有理解.NET中各个对象的本质含义,比如这里的特性(Attribute),大部分人都认为它是被用来作为代码说明、标识使用的,而没有突破这个思维限制,所以在设计一些东西的时候会绕很多弯路;还有一点是很多人对C#中的语法特性分不清版本,当然我们要大概的了解一下哪些特性或者语法是C#2的哪些是C#3的,这样在我们设计东西的时候不会由于项目的版本问题而导致你无法使用设计技巧,比如扩展方法就无法使用在低于.NET3.0版本中,LINQ也无法在低于.NET3.O的版本中使用;
.NETFramework的版本不断的在升级,目前差不多5.0都快面世了;.NETFramework的升级跟C#的升级没有必然的关系,这个要搞清楚;C#是为了更好的与.NET平台交互,它提供给我们的都是语法糖,最后都是.NETCTS中的类型;就比如大家都在写着LINQ,其实到最后LINQ也就被自动解析成对方法的直接调用;
委托相信大家都玩的很熟,委托的发展到目前为止是相当不错的,从原本很繁琐的每次使用委托的时候都需要定义一个相应的方法用来实例化委托,这点在后来的C#2中得到了改进,支持匿名委托delegate{…}的方式使用,再到现在的C#3那就更方便了,直接使用面向函数式的Lambda表达式;那么这样还需要反射调用对象的方法吗?(当然特殊场合我们这里不考虑,只考虑常用的场景;)当然反射不是不好,只是反射需要考虑很多性能优化方面的东西,增加了代码的复杂性,也让框架变的很重(现在都是在追求轻量级,只有在DomainModel中需要将平面化的数据抽象;),所以何不使用简单方便的委托调用呢;
注:如果你是初学者,这里的委托可以理解成是我们平时常用的Lambda表达式,也可以将它与Expression<T>结合起来使用,Expression<T>是委托在运行时的数据结构,而非代码执行路径;(兴趣的朋友可以查看本人的:LINQ系列文章)
下面我们来看一下演示代码:
1 /*============================================================================== 2 * Author:深度训练 3 * Create time: 2013-07-28 4 * Blog Address:http://www.cnblogs.com/wangiqngpei557/ 5 * Author Description:特定领域软件工程实践; 6 *==============================================================================*/ 7 using System; 8 using System.Collections.Generic; 9 using System.Linq.Expressions; 10 using System.Linq; 11 using Infrastructure.Common.Cache; 12 using Infrastructure.Common.Validator; 13 14 namespace ConsoleApplication1.DomainModel 15 { 16 /// <summary> 17 /// Order. 18 /// </summary> 19 [EntityCache(10, true)] 20 [EntityValidator(ValidatorOperationType.All)] 21 public class Order 22 { 23 /// <summary> 24 /// Order code. 25 /// </summary> 26 public string OrderCode { get; set; } 27 28 /// <summary> 29 /// Items filed. 30 /// </summary> 31 private List<Item> items = new List<Item>(); 32 /// <summary> 33 /// Gets items . 34 /// </summary> 35 public IEnumerable<Item> Items { get { return items; } } 36 37 /// <summary> 38 /// Submit order date. 39 /// </summary> 40 public DateTime SubmitDate { get; set; } 41 42 /// <summary> 43 /// Mark <see cref="DomainModel.Order"/> Instance. 44 /// </summary> 45 /// <param name="orderCode">Order code. </param> 46 public Order(string orderCode) 47 { 48 this.OrderCode = orderCode; 49 } 50 51 /// <summary> 52 /// Sum items prices. 53 /// </summary> 54 /// <param name="itemUsingType">item type.</param> 55 /// <returns>prices .</returns> 56 public double SumPrices(int itemUsingType) 57 { 58 double resultPrices = 0.00; 59 var currentItems = items.GroupBy(item => item.ItemUsingType).Single(group => group.Key == itemUsingType); 60 if (currentItems.Count() > 0) 61 { 62 foreach (var item in currentItems) 63 { 64 resultPrices += item.Price; 65 } 66 } 67 return resultPrices; 68 } 69 70 /// <summary> 71 /// Add item to order. 72 /// </summary> 73 /// <param name="item">Item.</param> 74 /// <returns>bool.</returns> 75 public bool AddItem(Item item) 76 { 77 if (!item.ItemCode.Equals(string.Empty)) 78 { 79 this.items.Add(item); 80 return true; 81 } 82 return false; 83 } 84 } 85 }