系统设计 - 为汽车创建类结构 - 面向对象

时间:2016-10-12 07:17:26

标签: oop architecture object-oriented-analysis system-design

所以我最近遇到了一个关于系统设计的问题。 根据下面给出的设计,我们有3辆车,其中2辆可以自动驾驶,其中2辆可以自动启动

所以问题是 - 你将如何设计类结构。也 提供一个示例方法,例如,为Suv启动并提供单元测试

enter image description here

所以 - 回答这个问题,我提出了如下所述的内容:

public class BaseCar
{
    // all common properties
    int height, width, length;
    string color etc.   
}

public class Suv : BaseCar
{
    LaunchCar LaunchSuv {get; set;}

    // Lets say we use DI to inject ctor
    Suv(IAutoLaunch autoLaunch)
    {
        LaunchSuv = autoLaunch;
    }

}

Interface IAutoLaunch
{
    bool Launch();
}

public class LaunchCar : IAutoLaunch
{
    // ctor based on car type
    LaunchCar(CarType)
    {
    }

    // Implementation of Launch based on Car Type

    bool Launch()
    {
        // successfully launch car here..
        return true; 
    }

}

所以在结束时,我们想要启动Suv,然后 在这种情况下,我们可以执行类似LaunchSuv.Launch();

的操作
  • 我不确定我的解决方案是否正确。如果是的话,还有改进的余地吗?

仅供参考 - 我决定为AutoPilot和AutoLaunch分别设置接口的原因是因为总共有一辆车中有一辆不具备这两项功能要求。如果我宣布这两种方法,在基地车中,不必要的所有车都会有两种我不想要的方法 - 不确定这个原因是好设计还是不那么重要!! 另外我刚刚以SUV为例,类似的类结构可以为Sedan和Coupe派生

3 个答案:

答案 0 :(得分:2)

真的,在这种背景下没有“正确”的答案。如果它适用于给定的问题,那么任何架构方面的决策都被认为是好的,如果它是可扩展的,敏捷的等等,则更好。同样的设计可能对另一个问题不利。

因此,它归结为一个问题:“对于您的软件有多大的期望值,以及使用给定设计实现它们有多难?”因为没有你的问题的背景(通过上下文我的意思是“更大的图片”),你不能回答这个问题。

答案 1 :(得分:1)

我同意你的做法。配方是:

  • 一个基类,用于实现核心功能
  • 每个功能的界面(船舶也可以想象自动启动,目前超出范围,但如果您明智地定义界面,未来您的设计也将支持非车辆)
  • 每个有效特征组合的基类的子类

答案 2 :(得分:0)

建议,AutoLaunch和AutoPilot可被视为一项功能' BaseCar的一部分,可以是默认值为false的一部分。 然后,无论哪种CarType都有这些可以实现'该接口将覆盖默认值。 休息取决于设计师/建筑师,他/她想要进行的方式以及他们想要的灵活性。