2010-06-09 66 views
0

这3种方法中的哪一种可以选择,为什么?哪个设计选择? - 优缺点

// This is the one I would choose 

class Car { 

} 

class FeeCalculator { 

    public double calculateFee(Car car) { 
     return 0; 
    } 
} 

//在这种情况下,当我们使用ORM框架的问题可能是,我们尝试调用保存与参数租车

class Car { 

    private FeeCalculator calculator; 

    public double calculateFee() { 
     return calculator.calculateFee(this); 
    } 
} 

class FeeCalculator { 

    public double calculateFee(Car car) { 
     return 0; 
    } 
} 

//在这种情况下,问题上述解决了,但我不喜欢这种设计

class Car { 

    public double calculateFee(FeeCalculator calculator) { 
     return calculator.calculateFee(this); 
    } 
} 

class FeeCalculator { 

    public double calculateFee(Car car) { 
     return 0; 
    } 
} 
+2

为什么您首先需要'Car.caclucateFee'?看起来'FeeCalculator'已经可以处理这个任务了 – 2010-06-09 17:54:40

回答

0

我会在第二个主题上使用变体。我会在车上注入一个FeeCalculator(旧的Skool或者通过DI框架--Spring/Guice等),然后让汽车通过委托来计算费用。然而,我会让FeeCalculator API不知道Car(否则你有一个循环依赖,你必须从Car暴露你可能不需要的东西)。相反,我会使用FeeCalculator的API来获取计算的基本输入数据 - 雇用天数,日费率,客户折扣计划等。

3

我为第一个投票。这样的计算器不是汽车的一部分,汽车通常没有计算费用的能力。

第二个设计模型类似车有-A-计算器,第三个选项是接近车是-A-计算器(即使它代表了计算到其他类)。


此外,ORM框架不应该影响模型的体系结构。该模型应该反映“真实世界”,有足够的专家在任何ORM框架中实现该模型。

0

汽车与计算费用有什么关系?没有什么,很可能。在这方面,我喜欢选项1.