博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
依赖于自己做计算
阅读量:6086 次
发布时间:2019-06-20

本文共 1436 字,大约阅读时间需要 4 分钟。

面向对象设计范式(Object Oriented Design Paradigm)让我们更容易地抽象现实世界的对象,更容易地分析业务。但是,计算机对象不仅仅是现实世界中对象的简单映射。比如针对司机开车(Drivers drive cars)这个场景,在现实世界中开车(drive)是司机的行为,但是在计算机对象世界中, 为了高内聚(High Cohesion),如果Car拥有drive这样行为的所有信息,drive这个动作就应该写到Car对象中,而不是Driver对象中。高内聚,按照我的理解是,’一个类首先要依赖自己做计算‘。

 

下面以一个我工作中的例子阐述,一个类要‘首先依赖自己做计算’这个观点。

Figure 1

 

在面对‘判断一个User是否有某某角色’的需求时,我遇到很多人的写法都是设计成这样

Figure 2

 

这时候UserManager里有一个方法,像这样子UserManager.hasRole(User user, Role role)。这样的编程设计引进了一个新的类UserManager,增加的新的依赖,导致User对象和Role对象的变化可能引起UserManager的变化。

 

从上面的图片Figure 1中,我们看到User拥有‘判断一个User是否有某某角色’的所有信息,按照‘一个类首先要依赖自己做计算’的观点,hasRole这个方法要放到User对象中,以下是代码片段

public boolean hasAnyRole(String... roleNames) {

        if (roleNames == null) {
            throw new IllegalArgumentException("Role names cannot be null");
        }

        if (this.roles == null || roles.size() == 0) {

            return false;
        }

        for (String roleName : roleNames){

            for (Role userRole : roles){
                if (roleName!=null && roleName.equals(userRole.getName())){
                    return true;
                }
            }
        }
        return false;
}

 

另外一个例子,‘把一个订单保存成订单模板’,我重构之前的设计是这样的:在接口OrderManager中有这样的一个签名 OrderTemplate saveAsTemplate(Order order);

但是,我们知道‘把一个订单保存成订单模板’的业务逻辑是,‘在下订单之前,把用户填写的部分订单信息保存成一个订单模板’。因为订单知道订单模板的所有信息,所以OrderTemplate saveAsTemplate(Order order) 应该写到Order对象里, 代码片段是

public OrderTemplate saveAsTemplate(Order oder){

OrderTemplate orderTemplate = new OrderTemplate();

oderTemplate.setProductId(productId);

return orderTemplate;

}

转载于:https://www.cnblogs.com/cando/archive/2012/01/17/2324423.html

你可能感兴趣的文章
MVC模式与struts框架
查看>>
Linux系统的中断、系统调用和调度概述【转】
查看>>
人月神话-人月:项目滞后的原因分析
查看>>
linux驱动学习(二) Makefile高级【转】
查看>>
通过QC远程运行QTP脚本,QTP自动崩溃关闭的解决方法
查看>>
WinServer2012 R2忘记密码的解决方案+远程连接另一种莫名其妙故障
查看>>
linux的mtd架构分析【转】
查看>>
字符串反转问题
查看>>
KMP
查看>>
Mysql占用过高CPU时的优化手段
查看>>
android 布局文件 ScrollView 中的 listView item 显示不全解决方案
查看>>
怎么清理win7、win8更新垃圾(winsxs目录清理)
查看>>
windows平台下编辑的内容传到linux平台出现中文乱码的解决办法
查看>>
数据库实例: STOREBOOK > 用户
查看>>
发送键盘指令System.Windows.Forms.SendKeys.Send
查看>>
【阿里聚安全·安全周刊】Intel处理器安全漏洞事件跟踪|星巴克挖矿事件分析...
查看>>
日期不能交叉的检测算法
查看>>
浅析Java中的访问权限控制
查看>>
ASP.NET Web API身份验证和授权
查看>>
Lua代码提示和方法跳转
查看>>