VO的疑惑

10-05-25 d02540315
各位仁兄,小弟一事不解,望多赐教~

由于之前写的一个方法参数太多, 所以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............ 
}
<p>

构建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());

<p>

调用isAcceleratedChanged()的代码1:

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

调用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);
		    }
		}
<p>

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

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

    

icycrystal4
2010-05-25 10:37
VO是要跑到UI去显示的, 如果你给我一个VO, 我只需要依据VO的属性来显示就行了, 不需要也不应该再去定义"业务逻辑".

试想一下, 假设你用MAP来传递数据, 那这些数据必须是在领域层已经处理的数据, 不在需要定义业务逻辑了.

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

d02540315
2010-05-25 10:54
2010年05月25日 10:37 "icycrystal4"的内容
VO是要跑到UI去显示的, 如果你给我一个VO, 我只需要依据VO的属性来显示就行了, 不需要也不应该再去定义"业务逻辑".

试想一下, 假设你用MAP来传递数据, 那这些数据必须是在领域层已经处理的数据, 不在需要定义业务逻辑了. ...

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

猜你喜欢