【问题标题】:OOP Design Problems in Interviews [closed]面试中的 OOP 设计问题 [关闭]
【发布时间】:2013-10-23 05:14:44
【问题描述】:

我是一名拥有 2 年经验的软件开发人员。我参与了几个“小”模块的设计和开发。

我最近一直在接受技术面试。我被要求对各种问题的设计进行建模(例如 Apple Genius 推荐系统等)。到目前为止,我的专长是开发相对较小的模块。我想提一下我如何处理手头的设计问题:

(1) 识别最重要的用例。

(2) 根据行为对系统进行动态建模(如协作图)

(3) 根据步骤2中的动态建模绘制类图。

(4) 找出更多用例并迭代此过程。

(5) 当我感到满意时,我会请我的同行来评价它。

虽然到目前为止我在项目中的表现还算不错,但面试官对这种方法并不满意。我在为一个大问题建模时是否遗漏了什么?

我将不胜感激。

附: : 我不从类图开始,因为这样做我发现非常集中的架构,而动态建模帮助我分散设计。

【问题讨论】:

  • 听起来不错,他们到底说了什么?
  • 感谢您的回复。他们担心的是我无法捕获整个系统。即使经过几次迭代,仍有许多基本功能。在设计最重要的用例之前,我是否应该列举几个用例?虽然据我了解,在面试时必须评估“方法”,因为系统无法在 1 小时内完美设计。
  • 没问题。您不能提及所有内容,但我添加了一个可能会有所帮助的答案。

标签: oop architecture


【解决方案1】:

您是否被要求进行高级模型(模块)设计或低级模型设计?解决高级模型设计的大问题或领域是一个好主意,因为对于低级模型设计通常需要较小的问题或领域。

通常需求/问题来自提问者(用户/面试官),因此我们不再需要定义业务需求。但我们仍然需要设计系统。

高级模型

我对“Apple Genius Recommendation System”不太熟悉,所以我将使用不同的问题类比,即常见的Point Of Sales 问题。对于高级模型,您将定义整个系统。通常是:

  • 订购
  • 提交订单
  • 首付
  • 发货
  • 返回

这都是高级模型/模块。如果有人问我如何实现模型,我将执行以下步骤:

  1. 定义用户和系统之间的标准用例
  2. 将用例倒入一些协作图中,例如丰富的图片(或任何熟悉的东西)
  3. 定义异常用例。如果可以轻松定义异常,请立即将其用于建模。如果没有,请将模型标记为案例例外,以便与业务团队进一步讨论

    一些用例例外可能是更改已提交订单、在首付后更改已提交订单、取消已付款订单、商品缺货等。

  4. 迭代过程。通常第 3 步可以变成第 1 步(例外可以/将是另一个用例)

    例如,更改的已提交订单可以是一个用例,因为发生的更改很高。

  5. 当第3次完成没有额外的用例异常(所有用例都已处理)时,通常我添加value-additional operations

    这些操作可以是通知(电子邮件/屏幕上)、历史数据维护、提醒、错误处理等。一些操作也可以是另一个用例,所以也许你需要迭代到 no.1 .

    例如,当您在首付结算过程中遇到错误时,您可能需要另一个用例来手动输入首付数据。或者您可能需要在另一个系统中维护提醒系统。

  6. 移至低级模型

对于其他信息,我通常使用状态图来表示用例/功能,例如订单状态。

低级模型

低层次模型将从高层次解决较小的问题。很容易说,您从高层(可能是订购)获取一个用例,然后从它开始设计低层。我通常不会先定义类图,而是使用某种形式的sequence diagram。以下是一些原因:

  1. sequence 为您提供有关获取输入、获取数据和提供响应的并发视图
  2. 它很好地描述了与其他系统(如数据库和 Web 服务)的关系
  3. 它可以为您提供有关入口点或界面的图片,这些图片对于您的应用程序的基本架构非常有用
  4. 您可以以此为基础创建类图,并在序列设计而不是类图期间轻松发现缺陷

然后我会继续系统状态图(可编辑、可查看等)。

最后,我会继续database designclass diagram

为什么类图在最后一步?

类图(和数据库设计)非常依赖于您的整个过程。并发如何发生、通知、外部系统交互等都会影响接口和类图的设计。它也是与您的代码库最接近的设计。

希望能有所帮助,这完全是我的经验和意见。

【讨论】:

  • 非常感谢。我今天接受了一次面试,这次我可以根据您的建议做得更好。
【解决方案2】:

我会说,也许您应该给出一个一般性的观点/概述,然后再深入一点。就像您给出的“Apple Genius Recommendation System”示例一样,我认为您应该从总体设计(系统的大图)开始,以确定系统的适当架构,例如确定需要哪些组件,什么协议等。您需要识别组件、连接器和论文的配置。然后,您可以通过建议模式和工具开始深入研究。最后,通过场景、用户案例等验证架构。

【讨论】:

  • 非常感谢。我今天接受了一次面试,这次我可以根据您的建议做得更好。
【解决方案3】:

我认为您的方法可能会错过non-functional requirements。我还会提到如何捕获这些。

【讨论】:

  • 非常感谢。我今天接受了一次面试,这次我可以根据您的建议做得更好。
【解决方案4】:

根据我从您的问题中收集到的信息,您要求的是“模型”而不是“方法”或“流程 "正如你所概述的那样。

因此,他们所要做的就是设计(可能使用 UML)Apple Genius Recommendation System 可以处理各种问题的场景。提示,如果是这种情况,设计的主要部分是有一个名为 Probleminterface 与核心 interface methods 相关问题。例如,getSeveritygetDescriptiongetDateReportedgetDateSolved 等。当然,它们需要其他类协作用这个界面来完成设计。

希望以上对你有所帮助。

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2015-07-11
    • 2010-11-27
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多