首页 新闻 会员 周边

哪个类设计得更完美?

0
[已解决问题] 解决于 2014-06-30 14:18
/*
 * 感觉车2设计更合理些,但看了很多开源框架,都是采用车1的形式
 * 车1的弊端是,同一个oil对象存在两个指针,如果哪天加一个setOil方法
 * 就要同时修改车和发动机里面油的引用。
 */


public class 车1 {
    
    油 oil;
    发动机1 engine;
    
    车1(油 oil){
        this.oil = oil;
        engine = new 发动机1(oil);
    }
    
    void 启动(){
        engine.启动();
    }
}

class 车2 {

    油 oil;
    发动机2 engine;
    
    车2(油 oil){
        this.oil = oil;
        engine = new 发动机2();
    }
    
    void 启动(){
        engine.启动(oil);
    }
}

class 油{
    int i = 5;
}
class 发动机1{
    油 oil;
    发动机1(油 oil){this.oil=oil;};
    void 启动(){
        oil.i--;
    }
}
class 发动机2{
    发动机2(){};
    void 启动(油 oil){
        oil.i--;
    }
}

哪个类设计得更好呢?车1还是车2?

angelshelter的主页 angelshelter | 大侠五级 | 园豆:9887
提问于:2014-06-16 12:48
< >
分享
最佳答案
0

目测关系差不多,车子和 发动机、油 有关系;发动机和油有关系。

不同的是 发动机1和油是组合,发动机2和油是依赖,所以 耦合度 发动机2 更小,车2合理。

奖励园豆:5
Qlin | 老鸟四级 |园豆:2403 | 2014-06-16 13:39

赞同

世界万物 | 园豆:276 (菜鸟二级) | 2014-06-16 16:20

@世界万物: 我目前也是觉得车2要好些,最近看的一些开源框包出现的是车1的设计样式,比如httpclient。所有我发个博客,想问问,车1有没有我目前没想到的好处。

angelshelter | 园豆:9887 (大侠五级) | 2014-06-16 16:45
其他回答(1)
0

你的油可以使抽象的啊,改变的油只要重新实现一个不就得了,用不着修改

你的发动机2的启动方法还要用个参数油,到时候你怎么能保证这个油是在这个汽车的油箱呢?不太合理吧!

车1合理

刘宏玺 | 园豆:14020 (专家六级) | 2014-06-16 13:04

对于你的第一个问题:我说的修改,不是在初始化的时候修改,而是在运行过程中修改。针对你提到的,我们也可以扩展下,比如有两种油,分别油1和油2,都是油的子类。这两种油在发动机的消耗是不同的,比如油1每公里100g,油2每公里200g。刚开始初始化的时间,传入的是油1 ,后来油1用完了,用set方法改为油2 ,就要修改两处。

你的第2个问题:说到点子上了,正因为它是作为一个参数来传的,这个参数由它的宿主来传递,耦合相对小些,如果是汽车,汽车有个油箱(一个油的属性)就由汽车来供,如果换成卡车,也是这样。

支持(0) 反对(0) angelshelter | 园豆:9887 (大侠五级) | 2014-06-16 14:35

@angelshelter: 按照你的说法, 油也应该是一个类,这个时候你的启动要调用油的一个耗油的方法,不然你以后再怎么设计都是不正确的

第二点,我还是觉得发动机2的设计不合理,如果这个是多态的话,你能确定你用的油是那辆车里面的油?

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2014-06-16 21:14

@刘宏玺: 对于你的第一个问题,我觉得油可以有很多种,但耗油的方法并不应该放在油类里面,而应该是发动车里面,发动车根据不同的油,输出不同的效果。

对于你的第二个问题,我反问一下,我有必要确定是哪辆车里面的油吗?多态是继承关系,又不是共享关系。总不是父类有一个oil的属性,各个实现它的子类都调用它,存在混淆吧。

支持(0) 反对(0) angelshelter | 园豆:9887 (大侠五级) | 2014-06-17 09:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册