【问题标题】:system design - create class structure for cars - Object Oriented系统设计 - 为汽车创建类结构 - 面向对象
【发布时间】:2017-02-20 21:42:33
【问题描述】:

所以我最近遇到了一个关于系统设计的问题。 根据下面给定的设计,我们有 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可以推导出类似的类结构

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我同意“正确”是主观的这一事实——但在这里讨论的想法是交换知识。给定的问题陈述是您拥有的图片,并要求设计-您将如何做到? :)
    • @vran 抱歉,应该明确提及,我已经暗示我同意您的设计并牢记我的回答。只是希望有一个更复杂的用法示例,然后我对设计有一些不同的看法
    【解决方案2】:

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

    • 一个基类,您可以在其中实现核心功能
    • 每个功能都有一个界面(船舶也可以自动发射,目前不在范围内,但如果您明智地定义界面,未来您的设计也将支持非汽车)
    • 每个有效特征组合的基类的子类

    【讨论】:

    • 我的方法是利用装饰器模式,但后来我认为它可能不是必需的,我不想过度设计解决方案。但我认为我们都在同一页面上!
    • @vran,是的,我们是。如果您认为这篇文章回答了您的问题,那么您可以通过点击箭头下方的复选框来接受它。
    【解决方案3】:

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

    【讨论】:

    • 在 baseCare 上安装 AutoLaunch 和 AutoPilot 在灵活和可扩展的设计方面并不是很好。假设您想添加其他“N”差异功能会发生什么。我也不确定是否应该接受基于“标志”的设计,我的 2 美分!
    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多