VO的疑惑

各位仁兄,小弟一事不解,望多赐教~

由于之前写的一个方法参数太多, 所以architect要求组织成一个VO (WorkRequestPriorityUpdateVO)。 但我在这个VO中加了一些比较简单的逻辑(isAcceleratedChanged,isExpeditedChanged,isWRUpdatePriorityValid ), Formal Code Review的时候, 大家一致决定不能在VO中加任何逻辑。 会后, 我找了一些关于VO的文章,没有发现VO中必定不能加逻辑的说法啊, 更何况, 我加的是很简单的逻辑? 其实,我甚至觉得,如果因为方法参数太多, 而引入一个对象, 应该是DTO的概念吧? 那么是否能在DTO中加部分逻辑呢? 望大家解惑, 不甚感激!!


public class WorkRequestPriorityUpdateVO implements Serializable {
private static final long serialVersionUID = -8711970309529933921L;
private Long accountId;
private boolean expeditedFlag;
private boolean originalExpeditedFlag;
private boolean acceleratedFlag;
private boolean originalAcceleratedFlag;
private String acceleratedReason;
private String originalAcceleratedReason;
private String trackingId;
/**
* @param originalAcceleratedFlag
* - original accelerated flag
* @param acceleratedFlag
* - current accelerated flag
* @param originalAcceleratedReason
* - original accelerated reason
* @param acceleratedReason
* - current accelerated reason
*/

public WorkRequestPriorityUpdateVO ( boolean originalAcceleratedFlag, boolean acceleratedFlag, String originalAcceleratedReason,
String acceleratedReason ) {
this.acceleratedFlag = acceleratedFlag;
this.originalAcceleratedFlag = originalAcceleratedFlag;
this.acceleratedReason = acceleratedReason;
this.originalAcceleratedReason = originalAcceleratedReason;
}

/**
* Check if accelerated flag or accelerated reason is changed.
*
* @return
*/

public boolean isAcceleratedChanged() {
return (acceleratedFlag != originalAcceleratedFlag)
|| ((acceleratedReason == null && originalAcceleratedReason != null)
|| (acceleratedReason != null && originalAcceleratedReason == null) || (acceleratedReason != null
&& originalAcceleratedReason != null && !acceleratedReason.equals(originalAcceleratedReason)));
}

/**
* Validate if the data is correct to update work request priority.
*
* @return
*/

public boolean isWRUpdatePriorityValid() {
return accountId != null && trackingId != null && (this.isAcceleratedChanged() || this.isExpeditedChanged());
}

// Setter..........
// Getter............
}

构建WorkRequestPriorityUpdateVO的部分代码:


// Call before copyProperties make sure that holds the original values
WorkRequestPriorityUpdateVO wrPriorityUpdateVO = new WorkRequestPriorityUpdateVO( originalAccount.getAcceleratedFlag(),
((AccountKS)account).getAcceleratedFlag(), originalAccount.getAcceleratedReason(), ((AccountKS)account).getAcceleratedReason());

调用isAcceleratedChanged()的代码1:


if (wrPriorityUpdateVO.isAcceleratedChanged(){
wrPriorityUpdateVO.setAccountId(accountId);
wrPriorityUpdateVO.setTrackingId(trackingId);

调用isAcceleratedChanged()的代码2:


//Update accelerate reason
if (wrPriorityUpdateVO.isAcceleratedChanged()){
if (wrPriorityUpdateVO.isAcceleratedFlag()){
workRequest.setWorkRequestGrouping(WR_PRIORITY_PREFIX +
AcceleratedReasonEnumKS.valueOf(wrPriorityUpdateVO.getAcceleratedReason()).getDisplayName());
}else{
workRequest.setWorkRequestGrouping(null);
}
}

如果把isAcceleratedChanged()这个方法移出WorkRequestPriorityUpdateVO, 那么每次维护起来, 我要修改两个地方, 大家的建议如何?

[该贴被d02540315于2010-05-25 10:19修改过]

VO是要跑到UI去显示的, 如果你给我一个VO, 我只需要依据VO的属性来显示就行了, 不需要也不应该再去定义"业务逻辑".
试想一下, 假设你用MAP来传递数据, 那这些数据必须是在领域层已经处理的数据, 不在需要定义业务逻辑了.


PS: 平时讨论的充血贫血不是针对VO的, 是针对领域对象的

2010年05月25日 10:37 "icycrystal4"的内容
VO是要跑到UI去显示的, 如果你给我一个VO, 我只需要依据VO的属性来显示就行了, 不需要也不应该再去定义"业务逻辑".
试想一下, 假设你用MAP来传递数据, 那这些数据必须是在领域层已经处理的数据, 不在需要定义业务逻辑了. ...

这个VO,不是在页面上显示的。 如果按你这么理解, 这个VO本身就不是一个VO咯? 那么是什么呢?