第一次尝试DDD

项目背景

最近客户让我们添加了一个小功能。在客户登记入库信息的时候,可以看到仓库货架的存储情况,并提供货品位置选择功能。简单思考后,我大概花了三个小时将功能完成了,核心就是两层嵌套循环拼接小图片。下午展示给客户看到时候,客户说你忽略了一点仓库货架是三维的,还应该添加一个层的概念。我一想对啊,再加一层循环就可以了,回来在原来代码的基础上加了一层循环,再去给客户看。客户又说你们的配色不好看,我们需要自定义货品展示背景色……

每次仅仅是一个小的需求改变,就需要去改动很多源码,这既不符合设计原则,也没有形成模块化封装思想,更别提重构了!于是我就想,我来试试DDD。

我与DDD

第一次接触DDD大概是三年前在博客园看见netfocus 的BookLibraryExample,当时唯一的感觉就是他的代码好OO。那个时候刚刚才毕业的我,正在努力的用活动记录模式写三层,他的代码看的不是很懂,于是就放下了。后来自己在学习设计模式的时候,只言片语的也接触过。去年年底在学习写框架的时候看见了应用程序框架实战系列才在博主的带领下慢慢学习DDD。我目前的状态是为了领域而领域,因为这样可以让我的代码更加OO

 上面都是废话,而且我还是标题党。说是DDD实战,其实就是用充血模型封装了一个控件而已,大家原谅责个……

需求分析

 选仓库,展示货架,货架按货架编号排序,货架中分层显示出货品,货品按种子编号和坐标排序。该控件就是一个聚合,四个层次:货架列表控件,包含货架层控件 货架层控件包含货架行控件 包含物品控件;三个层次:货架列表控件,包含货架控件,货架控件包含货品控件。

经过两天的努力,现在编码已经完成,下面附上截图。没有美工界面有点丑陋,请大家自动忽视。

主要收获

这样子设计代码更加对象化,聚合的思想是把复杂度层层分解,让每一层都变得简单。原则就是一个层只操作自己的下级,下级再去操作下级,不能出现跨层操作,通过不同的对象之间协作来共同完成一个操作。 在这次尝试中我做到了:

  1. 每行代码没有超过15行
  2. 没有任何嵌套循环
  3. 没有跨层操作

结局是我老大说我这样做更加浪费性能,但是我心理想说的是我们追求不一样!

作者:Dynamic-xia

博客地址:http://www.cnblogs.com/dynamic-xia

声明:本博客以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。

时间: 2024-10-07 09:08:17

第一次尝试DDD的相关文章

在CentOS上部署Asp.Net MVC3的第一次尝试

关注mono已经很久了,现在才有时间真正的尝试一下在linux中部署asp.net的网站,也算是记录 一下自己的第一次尝试吧. 我的实践的环境是win7 + VM10 + CentOS6.5 下面就是具体的步骤: 1.在linux下搭建asp.net所需要的环境(mono 3.12.0+jexus 5.6.3.12),这一步也已经有很多 可以参考的文章了,大家可以看看惊鸿哥的博客和张善友先生的博客来搭建环境,我搭建的最终如 下: 2.环境搭建好了,当然就是要开发了.开发我是在VS上,将发布后的文

第一次尝试自己写轮播图

其实嗯,对于前端我与很多很多想说的话,但是看着种种最后却不知道说什么了,既然这样那就什么都不要说 第一次尝试自己写轮播图,对于初学前端的我来说我感觉我晚了很久了 为什么要模仿写一份出来呢,我也不知道,做个纪念吧 html代码页面 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <meta charset="UTF-8"> 11 <title></title> 12 <link r

uwp - MVVM - 初学完全无基础第一次尝试1

[前记] 学c#断断续续算来也有2年上下的时间了,接触的框架仅有asp.net mvc,而且也是只用过一两次.最近在尝试uwp开发听说了mvvm,呃,第一次看到或者听到这个英文的时候是前几天,当时感觉就是应该很厉害,很屌,然后,就没了,我也没去用,我觉得大多是个框架而已,我才懒得弄得那么麻烦,直接这样写多快. 第二次看到是在微软的build视频上,因为我在找一些资料偶然看到这个视频,视频里演示了一个完整的项目Kliva(也是放在github上开源共享)我被项目中的动画深深吸引住了,就把项目下载来

[单元测试]Java单元测试,基于Mockito的第一次尝试

Mockito 进行Mock单元测试入门 个人理解: 单元测试:对程序中最小的运行单元就行测试,java中通常是一个类 Mock的作用是在JUnit的基础上,对于依赖进行模拟,人为的将集成测试封闭成黑盒的单元测试. 其他的具体用发和概念可以自行google,网上已经有很多解释,这里只给像我这样刚刚入门,第一次写单元测试的人做一个引导. 这里主要讲一下Mockito中 when(...).thenReturn(...) 的使用时机: 在单元测试的方法中,但有需要依赖于服务A的方法B的返回的时候,需

C语言后ATM第一次尝试

#include <stdio.h>#define PASSWORD 9527#define RMB 100000#define DORROR 10000 void exit(int x){ while(x != 0) { printf("0:Cancle\n"); scanf("%d",&x); } return; } void take(int choice,int a[]){ int x; while(choice) { if(choice

堆排序(c++第一次尝试)

对排序的实现思路有两种 第一种:1.构建最小堆.2.将最小堆的堆顶元素取出放到辅助数组的0号下标.3.重新调整成最小堆(向上调整) 4.重复2-3 第二种:1.构建最大堆.2.将堆顶元素(0号)与最后一个元素调换位置.3.最后一个元素不变,剩下的数据调整成最大堆. 4.重复2-3. 这里用的是第二种方式. 几点说明: 1.构建堆用的是数组来存储,即堆顶为s[0],第一层为s[1],s[2]以此类推. 2.下面的程序可能存在bug,因为是笔者用一组写在代码里面的数组来测试的.旨在说明问题. 3.为

第一次接触C语言,第一次尝试做的ATM机

#include <stdio.h>#include <string.h> #define LINE "=====================================\n" #define KEY "123456" #define accounts "123456789" int main(){ //设置变量 int num; //用户选项 int m=10000; //账号初始金额 char key[6];

ios越狱开发第一次尝试记录

1.THEOS的makefile文件中的THEOS_DEVICE_IP要写在第一行 2.如果make package install报错 dpkg status database is locked by another process 则在iphone终端输入 sudo rm /var/lib/dpkg/lock sudo dpkg --configure -a 其余参考<ios应用逆向工程>即可

c 睡觉前请关灯 的第一次尝试

#include"wz.h" /*int check3(int x[][5]) {  int i,j;  int sum=0; for(i=0;i<5;i++)  { for(j=0;j<5;j++)   sum+=x[i][j];  } if(sum==1) return 1; else return 0; }*/ int check3(int x[][5]) {  int i,j;    for(i=0;i<5;i++)  { for(j=0;j<5;j++