1

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

所以问题是——你将如何设计类结构。还提供一个示例方法,例如 Launch for Suv 并提供单元测试

在此处输入图像描述

所以 - 为了回答这个问题,我想出了如下所述的东西:

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 设置单独的界面的原因是因为总有 3 辆汽车中的一辆汽车没有这两种功能要求。如果我在基础车中声明这两种方法,那么所有汽车都将具有我不想要的两种方法 - 不确定这个原因是好的设计还是不那么重要!另外我刚刚以 SUV 为例,可以为 Sedan 和 Coupe 派生类似的类结构

4

3 回答 3

2

在这种情况下,真的没有“正确”的答案。任何基于架构的决策如果适用于给定的问题,则被认为是好的,如果它具有可扩展性、敏捷性等,则更好。相同的设计可能对另一个问题不利。

所以它归结为一个问题:“你的软件的预期功能是什么,使用给定的设计实现它们有多难?”。因为您的问题没有上下文(上下文我的意思是“更大的图景”),所以您无法回答这个问题。

于 2016-10-12T07:41:33.317 回答
1

我同意你的做法。食谱是:

  • 一个基类,您可以在其中实现核心功能
  • 每个功能的接口(自动启动也可以用于船舶,目前超出范围,但如果您明智地定义接口,将来您的设计也将支持非汽车)
  • 每个有效特征组合的基类的子类
于 2016-10-12T08:09:34.147 回答
0

Suggestion,AutoLaunch 和 AutoPilot,可以被认为是 BaseCar 的一个“特性”,并且可以是它的一部分,默认值为 false。然后,无论哪个 CarType 具有这些中的任何一个,都可以“实现”该接口,该接口将覆盖默认值。休息取决于设计师/建筑师,他/她想要如何进行以及他们想要多少灵活性。

于 2016-10-12T07:43:28.627 回答