四色原型与DCI代码

关注jdon好久了,一直是没有注册,也木有发过帖子,只是默默的看大家的精彩分享和评论(汗--),从这里开始接触到DDD,DCI,四色原型,也常常去设计模式板块复习复习,最近还是接触到四色原型,这两天在图书馆找到了彩色UML建模(java modeling in color with uml),于是迫不及待的看了起来。但是感觉疑惑蛮多,在dci中,感觉通过role就确定了责任。而在四色中,role和mi的职责总是搞不明白。直接贴代码吧,希望banq以及其他大虾分析下原因出在哪里,谢谢。

首先是根据dci自己假设的场景和代码 (自己逻辑感觉很清晰,当然例子实在太简单了,,主要是想体会其中的思想。。)


/**
* @description: 男人角色接口---定义了男人职责
*/

public interface IManRole {
//爱护女人
public void loveWomen();
//赚钱
public void earnMoney();
//打坏人
public void hitStranger();
}

/**
* @description: 女人角色接口----定义女人的职责
*/

public interface IWomanRole {
//爱老公
public void loveMan();
//打扮自己
public void makeSelfBeautiful();
//照顾孩子
public void careBaby();
}

/**
* @description: 客户端测试
*/

public class RoleDemo {
public static void main(String[] args) {
IManRole xl = new XiaoluMan();
xl.loveWomen();
xl.earnMoney();
xl.hitStranger();

IWomanRole xw = new XiaoWangWoman();
xw.careBaby();
xw.loveMan();
xw.makeSelfBeautiful();

}
}

/***********************************************************************/
class XiaoluMan implements IManRole {

@Override
public void loveWomen() {
System.out.println(
"疼爱女人");
}

@Override
public void earnMoney() {
System.out.println(
"努力工作赚钱");
}

@Override
public void hitStranger() {
System.out.println(
"打跑了坏人");
}

}

class XiaoWangWoman implements IWomanRole {

@Override
public void loveMan() {
System.out.println(
"我疼爱老公");
}

@Override
public void makeSelfBeautiful() {
System.out.println(
"我使得自己更漂亮");
}

@Override
public void careBaby() {
System.out.println(
"我花更多时间照顾小baby");
}

}
/***********************************************************************/

在这里 dci的datamodel我认为就是数据model(贫血对象---XiaoWangWoman/XiaoLuMan两个实体),只是在这个例子里面没有属性。


接下来的是我根据四色原型得到的。。。简直觉得惨不忍睹,耦合性大,也没有面向接口,扩展性,,,所以疑惑自己是否哪里思考的有问题,否则四色原型做出来如此丑陋。。。


/**
* @[author]purpose[/author]: 探究四色原型
*/


/** test sub*/
public class ColorUMLDemo {
public static void main(String[] args) {
Person p = new Person(
"xiaolu",new PersonDesc("男"));
MaleRole role = new MaleRole();
role.setP(p);
MI mi = new MI(role);
mi.doWork();
}
}

/***************************************************************/
/** @archetype ppt */
class Person {
// 在这里认为所有人的名字都是不同的
private String name;

private PersonDesc personDesc;

public PersonDesc getPersonDesc() {
return personDesc;
}

public Person(String name, PersonDesc personDesc) {
this.name = name;
this.personDesc = personDesc;
}

public void setPersonDesc(PersonDesc personDesc) {
this.personDesc = personDesc;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

/** @archetype desc */
class PersonDesc {
//抽出不变的一类属性,类似值对象
private final String sex;

public PersonDesc(String sex) {
this.sex = sex;
}

public String getSex() {
return sex;
}
}

/** @archetype role */
class MaleRole {
private Person p;

public Person getP() {
return p;
}

public void setP(Person p) {
this.p = p;
}

public String showInfo() {
return
"我是一个男人!";
}
}

/** @archetype moment-interval */
class MI {
private MaleRole m;

public MI(MaleRole role) {
this.m = role;
}

public MaleRole getM() {
return m;
}

public void doWork() {
System.out.println(
"男人干活.\n" + m.showInfo());
}
}
/***************************************************************/

请各位指教,谢谢。身边也木有能讨论的人。。。

[该贴被admin于2014-11-19 06:57修改过]
[该贴被admin于2014-11-19 06:58修改过]

2014-11-19 07:18 "@banq"的内容
四色是属于分析领域,分析 --》设计 --》代码, ...

谢谢banq的回答。领域模型是分析的结果。通过dci来理解四色能好理解一些,data--ppt,dci中似乎不存在值值对象之说(或者说和具体场景有关,我的判断依据是是否需要可以确定不同的对象),i是通过context中的role来确定有哪些交互,至于四色中的mi,看到有些人认为它是领域中的一些关键动词。比如销售,购买,,我可否把mi理解为用例。在思考过程中,我甚至于觉得mi是一个活动,“什么(desc)什么样的事物(ppt)实现了什么样的角色(role)才可以做什么活动(mi)",不知道这样理解是否正确?因为role只有在场景中才有意义,因此觉得mi更像用例(一组场景---正常事件流/异常事件流)。是否不知不觉中把dci和四色有点混为一谈?另外一个是,四色作为一种分析模式,究竟是用来验证的构建的领域模型,还是用来分析领域呢(http://www.infoq.com/cn/articles/xh-four-color-modelinganch103951#0-qzone-1-24662-d020d2d2a4e8d1a374a433f596ad1440),这个例子感觉比较实用点,思维觉得有点逆推的感觉,从活动-->ppt-->role....是否不太符合平时思维呢?谢谢

2014-11-19 07:18 "@banq"的内容
四色是属于分析领域,分析 --》设计 --》代码, ...

谢谢banq的回答。领域模型是分析的结果。通过dci来理解四色能好理解一些,data--ppt,dci中似乎不存在值值对象之说(或者说和具体场景有关,我的判断依据是是否需要可以确定不同的对象),i是通过context中的role来确定有哪些交互,至于四色中的mi,看到有些人认为它是领域中的一些关键动词。比如销售,购买,,我可否把mi理解为用例。在思考过程中,我甚至于觉得mi是一个活动,“什么(desc)什么样的事物(ppt)实现了什么样的角色(role)才可以做什么活动(mi)",不知道这样理解是否正确?因为role只有在场景中才有意义,因此觉得mi更像用例(一组场景---正常事件流/异常事件流)。是否不知不觉中把dci和四色有点混为一谈?另外一个是,四色作为一种分析模式,究竟是用来验证的构建的领域模型,还是用来分析领域呢(http://www.infoq.com/cn/articles/xh-four-color-modelinganch103951#0-qzone-1-24662-d020d2d2a4e8d1a374a433f596ad1440),这个例子感觉比较实用点,思维觉得有点逆推的感觉,从活动-->ppt-->role....是否不太符合平时思维呢?谢谢

2014-11-19 20:30 "@jdonTao"的内容
我甚至于觉得mi是一个活动,“什么(desc)什么样的事物(ppt)实现了什么样的角色(role)才可以做什么活动(mi)",不知道这样理解是否正确?因为role只有在场景中才有意义,因此觉得mi更像用例(一组场景---正常事件流/异常事件 ...

你说得非常好,我赞同。从分解和组合角度看,DCI属于分解+组合,而四色是纯粹分解。

需求或用例被四色分解到初步的类图,下一步可以通过DCI进一步分解组合,也可以通过事件流进一步分解(事件建模风暴),这两种方式取决于语言平台,是面向对象范式设计还是函数编程范式。

面向对象分析的概念模型和实现细节的不匹配说明了分析和设计之间的鸿沟,四色可以认为是概念模型,实现细节是语言平台。

2014-11-19 20:30 "@jdonTao"的内容
什么(desc)什么样的事物(ppt)实现了什么样的角色(role)才可以做什么活动(mi) ...

个人建议,如果你换个思路,'为了做什么活动(mi)需要什么样的角色(role)它是什么(desc)什么样的事物(ppt)',,,应该不会有困惑了