领域特定语言
2012-02-16 19:31
127 查看
领域特定语言
总感觉项目组写的代码不规范,有时一个类能有几千行代码。那么应该如何规范代码那?我们制定了自己公司的代码规范,但我觉得还不够。于是在google中不停的寻找,终于看到领域特定语言后让我眼前一亮。文章中用到的代码大都是网上找的,具体出处也有些记不得了,就不特别声明出处了。领域特定语言的目标是主要关注我们应该做什么,而不是怎样去实现某种特定的业务逻辑。下面有一篇介绍领域特定语言的文章:
http://tech.chinaunix.net/a2010/0901/1097/000001097923.shtml
Linq简化了代码
如果使用c#开发则对应的领域特定语言就是Linq技术了。这是个表示分组的对象,用于保存分类的名称和产品数量。然后我们就会写一些十分丑陋的代码:
Dictionary<string, Grouping> groups = new Dictionary<string, Grouping>(); foreach (Product p in products) { if (p.UnitPrice >= 20) { if (!groups.ContainsKey(p.CategoryName)) { Grouping r = new Grouping(); r.CategoryName = p.CategoryName; r.ProductCount = 0; groups[p.CategoryName] = r; } groups[p.CategoryName].ProductCount++; } } List<Grouping> result = new List<Grouping>(groups.Values); result.Sort(delegate(Grouping x, Grouping y) { return x.ProductCount > y.ProductCount ? -1 : x.ProductCount < y.ProductCount ? 1 : 0; });
不过如果这里我们使用DSL,也就是LINQ,就像这样:
var result = products .Where(p => p.UnitPrice >= 20) .GroupBy(p => p.CategoryName) .OrderByDescending(g => g.Count()) .Select(g => new { CategoryName = g.Key, ProductCount = g.Count() });
方法链
其实我们在C#代码中除了Linq,其他地方也可以做类似的设计,学名叫方法链(Method chaining),类型如下实现:Object.DoSomething().DoSomethingElse().DoAnotherThing();
class Person { private string _name; private byte _age; public Person SetName(string name) { _name = name; return this; } public Person SetAge(byte age) { _age = age; return this; } public Person Introduce() { Console.WriteLine("Hello my name is {0} and I am {1} years old.", _name, _age); return this; } } //Usage: static void Main() { Person user = new Person(); // Output of this sequence will be: Hello my name is Peter and I am 21 years old. user.SetName("Peter").SetAge(21).Introduce(); }
学习Linq之前需要学习的一些必备知识
http://blog.csdn.net/patriot074/article/details/3135359var 关键字
C#扩展方法和扩展库
namespace MyExtensionsLibrary { public static class Class1 { public static void DispAssembly(this object obj) { Console.WriteLine("该对象所在的程序集位置是:{0}/n->{1}'/t", obj.GetType().Name, System.Reflection.Assembly.GetAssembly(obj.GetType())); } public static int ReverseInt(this int i) { char []digits=i.ToString ().ToCharArray (); Array .Reverse(digits ); string newDigits=new string (digits ); return int.Parse (newDigits ); } } }
对象初始化器
var point3=new Point{x=7,y=4};
匿名类型
匿名对象
var Apeople=new{Sex=”male”,Name=”Linc”,Age=”26”};
匿名对象
匿名方法
public partial class Form1 : Form { delegate void Printer(string s); public Form1() { InitializeComponent(); // 匿名方法 Printer p = delegate(string j) { textBox1.Text += j+"/r/n"; }; // 匿名委托调用后返回的结果 p("The delegate using the anonymous method is called."); //命名方法 p = new Printer(DoWork); // 传统的调用方式 p("The delegate using the named method is called."); } void DoWork(string k) { textBox1.Text += k + "/r/n"; } }
Lambda表达式
Lambda表达式语法看上去真怪异,说白了是更好的匿名方法。废话不多说,先来看看使用匿名方法://首先使用集合初始化语法建立一个整型列表
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
//匿名方法粉墨登场
List<int> oddNumbers = list.FindAll(
delegate(int i)
{
return (i % 2) != 0;
}
);//匿名方法结束
foreach (var oddNumber in oddNumbers)
{
//输出奇数
Console.WriteLine(oddNumber);
}
观察上面的匿名方法,我们使用delegate,而且还要保证输入参数的类型匹配,这种语法确实还是让人觉得冗长。下面看看Lambda表达式是如何简化FindAll()方法的:
//通过Lambda表达式就一句就搞定了!多神奇啊!传统的委托语法通通消失了
List<int> oddNumbers = list.FindAll(i => (i % 2) != 0);
解剖Lambda表达式
i => (i % 2) != 0
你一定注意到了Lambda表达式的 => 标记(读作 goes to),它的前面是一个参数列表,后面是一个表达式。
很明显,前面的参数列表并没有定义参数的类型(由编译器根据上下文推断出i是一个整型),所以它是隐式的。当然,我们也可以显示定义: (int i)=>(i%2)!=0);
我们这里参数列表只有一个参数,所以那个括号可以被省略。
Linq
自己也没有把所有资料都看完,个人对于Linq的用法大致是这样设想的,我们在做项目时会建立许多聚合根,如果我们的查询会跨多个聚合根则使用存储过程,否则使用Linq进行查询。Linq有个LinqPad的小工具用于测试,另外有网址可以参考:http://kb.cnblogs.com/zt/linq/
聚合与组合
组合的话是类似共生共灭的关系,例如大雁和大雁的翅膀。对于我们营收系统来说,就好比营业账和营业账子表而聚合则没有这么强的从属关系,比如用户和册本信息,册本信息作为一个用户的只读属性存在,但也可以单独操作册本信息。
账户可以独立存在,但用户又有一个账户信息的只读属性
系统架构
这里说的系统架构主要是逻辑上的分层,不是物理上的。主要是想利用Entity Framework在系统架构里面,替换以前的codesmith生成entity和dal,同时想引入领域模型的概念,不直接操作entity framework中的对象,而是对应的领域模型。对于领域驱动设计我会在后面的领域驱动设计的文章中介绍。相关文章推荐
- 《Groovy极简教程》第8章 Groovy:领域特定语言(DSL)
- 闭包在DSL中的应用,领域特定语言的笔记
- [导入]Visual Studio 2005 Team Edition软件架构系列课程(4):模型驱动开发的领域特定语言(Domain Specific Language )工具
- [综述]领域特定语言(Domain-Specific Language)的概念和意义
- 在Visual Studio 2012中使用VMSDK开发领域特定语言1
- ★软件架构DSL领域特定语言初探[
- dsl领域特定语言
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
- 使用Java实现内部领域特定语言
- 基于领域特定语言(DSL)的用例驱动开发(UDD)
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
- 利用C++、scala等语言的运算符重载功能定制领域特定语言(DSL,Domain-Specific Language )
- 使用Antlr开发DSL(领域特定语言)-java
- [2017-08-25]100行CSharp代码利用dynamic写个DSL(特定领域语言)
- DSL Domain-specific language 领域特定语言/领域专用语言
- 七周七语言之用Io编写领域特定语言
- DSL Domain-specific language 领域特定语言/领域专用语言
- 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)
- 23. 特定领域语言
- 正则表达式与领域特定语言(DSL)