📜  在面试中解决面向对象设计问题的 6 个步骤

📅  最后修改于: 2021-10-19 04:35:55             🧑  作者: Mango

面向对象设计……编程中最重要的学习主题。

如果您是新人或在公司工作的软件工程师,那么您肯定会瞄准一些大公司,例如 Facebook、微软、谷歌或亚马逊。这些公司进行设计轮次,以检查候选人是否能够构建复杂系统的能力。这一轮可以是系统设计轮或面向对象设计轮。我们已经在采访中讨论了破解系统设计回合的话题。

How-to-Approach-Object-Oriented-Design-面试中的问题

在这篇博客中,我们将讨论如何在面试中进行面向对象的设计回合。如果您正在为入门级开发人员角色或高级开发人员角色做准备,那么此博客肯定适合您。

让我们从确定这一轮的主要目标开始……

  • 将向候选人提供通用问题陈述,候选人必须利用其面向对象的设计技能提出技术解决方案。
  • 候选人需要识别给定问题陈述中的不同对象和实体。
  • 面试官将检查候选人对 OOP 概念和原则的熟悉程度,以及候选人使用这些概念设计系统的能力。

面试前的准备

1.熟练掌握一门面向对象的编程语言,如Java/C++/ Python等。有一定的相关经验,了解OOPs概念在这些语言中是如何工作的。

  • 抽象
  • 封装
  • 遗产
  • 多态性
  • 关联、聚合、组合
  • 班级
  • 目的
  • 方法

2.了解各种面向对象的设计原则,如SOLID/DRY原则等。

3.如果你对MVC、单例、工厂方法等各种设计模式有很好的掌握,那么作为入门级开发者或高级开发者,这将是一个加分点。

让我们进入下一步,即面试过程……

解决问题的分步过程

1. 需求收集

首先确定面试官在找什么?面试中是系统级设计还是对象级设计?两轮比赛将采用不同的方法。从需求收集开始。

在这里,面试官会给你一个系统的高级描述,你必须确定问题的确切范围。深入挖掘并澄清他在系统中寻找的一切。与面试官讨论这些功能并提出问题以消除混淆。试着找出面试官正在寻找的输出。

  • 收集您想要包含在设计中的最高要求或功能。写下所有要求并与面试官讨论。你的面试官会提到他/她是否想包括一些其他细节或功能。
  • 一旦讨论了需求,就在高层次上讨论用例。
  • 现在向面试官清楚地定义你的假设。
  • 在面试中提及并澄清您需要解决的范围。

让我们以在线购物系统为例。在这个例子中,我们可以考虑下面给出的一些要求……

  • 客户可以搜索/查看/购买产品
  • 一个购物车,供顾客放置他们想要购买的所有物品。
  • 客户应该能够通过信用卡/借记卡/网上银行付款
  • 客户应该能够提及可以交付他/她的订单的送货地址。

2. 用例图

在讨论需求时,您必须确定需要包含在设计中的所有用例。列出您的系统应该设计的所有用例。您将能够识别需要包含在系统中的不同组件和参与者。

  • 识别用例图中的所有参与者
  • 确定不同参与者的角色。

现在您需要将其转换为用例图。以下是在线购物系统的用例。

用例图

  • 在网站上搜索产品
  • 在网站上查看产品
  • 从购物车中添加/删除产品
  • 查看
  • 付款并指定送货地址

3.活动图

一旦确定了参与者和每个参与者的角色,就要关注系统的逻辑、完整结构和整体流程。写出流程图。这将帮助您清楚地了解问题,并且您将有机会纠正错误。下面是在线购物系统的活动图。

活动图

4. 类图

这是面试过程的核心部分。你的面试官会对这部分更感兴趣。到现在为止,您已经拥有将它们放置在类图中的所有材料,例如不同的系统对象和参与者。

从识别核心对象开始。如何识别核心对象?以下是识别核心对象的规则……

  • 需求中的名词可能是对象的候选对象。
  • 要求中的动词是可能的方法。

A.您的主要目标是确定对象之间的关系。

B.确定是使用抽象类还是接口进行抽象

C.检查您是否可以在其中使用某些设计模式。

D.设计一个类图来向面试官展示一切。

请记住一件事,面试官可能会向您提出其他问题。他/她可能会问一些有关您的设计选择的问题。你必须为你所做的选择提供理由。如果将来用户在您的网站上增长,您将如何处理该系统?面试官可能会问你这类问题。

设计问题是开放式的,不同的候选人会有不同的答案。没有错误的答案……所以捍卫你的设计。

确保您牢记基本的面向对象设计原则。这些原则将帮助您绘制类图,并将帮助您有效地处理问题。

类图

5. 描述主要用例

使用上述步骤中定义的类并运行顶级用例。这类似于活动图。如果您错过了任何组件或场景,这将对您有所帮助。你需要向面试官口头解释这一点。

6. 代码

本轮编码部分是可选的,但面试官可能会要求您为特定功能或组件编写代码。如果您被要求编写代码,请优先考虑下面给出的内容。

  • 从接口或抽象类开始
  • 编写核心对象和内部结构的代码。
  • 写实现部分。
  • 编写 JUnit

在较高级别,定义所有必需的属性、功能、接口等。