zoukankan      html  css  js  c++  java
  • 领域特定语言

    领域特定语言

    总感觉项目组写的代码不规范,有时一个类能有几千行代码。那么应该如何规范代码那?我们制定了自己公司的代码规范,但我觉得还不够。于是在google中不停的寻找,终于看到领域特定语言后让我眼前一亮。文章中用到的代码大都是网上找的,具体出处也有些记不得了,就不特别声明出处了。

    领域特定语言的目标是主要关注我们应该做什么,而不是怎样去实现某种特定的业务逻辑。下面有一篇介绍领域特定语言的文章:

    http://tech.chinaunix.net/a2010/0901/1097/000001097923.shtml

    Linq简化了代码

    如果使用c#开发则对应的领域特定语言就是Linq技术了。

    这是个表示分组的对象,用于保存分类的名称和产品数量。然后我们就会写一些十分丑陋的代码:


    不过如果这里我们使用DSL,也就是LINQ,就像这样:


     

    方法链

    其实我们在C#代码中除了Linq,其他地方也可以做类似的设计,学名叫方法链(Method chaining),类型如下实现:


     


     

    学习Linq之前需要学习的一些必备知识

    http://blog.csdn.net/patriot074/article/details/3135359

    var 关键字

    C#扩展方法和扩展库


     

    对象初始化器


    匿名类型

    匿名对象


     

    匿名对象

    匿名方法


     

    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中的对象,而是对应的领域模型。对于领域驱动设计我会在后面的领域驱动设计的文章中介绍。

            

  • 相关阅读:
    WebGL着色器32位浮点数精度损失问题
    Web地图呈现原理
    虚拟DOM详解
    webgl开发第一道坎——矩阵与坐标变换
    作为前端应当了解的Web缓存知识
    浅谈模板引擎
    WebGL中深度碰撞方法总结
    不加班的项目从排期开始
    从0到1带人做项目
    webgl自学笔记——深度监测与混合
  • 原文地址:https://www.cnblogs.com/zyizyizyi/p/2497829.html
Copyright © 2011-2022 走看看