面向对象设计……编程中最重要的学习主题。
如果您是新人或在公司工作的软件工程师,那么您肯定会瞄准一些大公司,例如 Facebook、微软、谷歌或亚马逊。这些公司进行设计轮次,以检查候选人是否能够构建复杂系统的能力。这一轮可以是系统设计轮或面向对象设计轮。我们已经在采访中讨论了破解系统设计回合的话题。
在这篇博客中,我们将讨论如何在面试中进行面向对象的设计回合。如果您正在为入门级开发人员角色或高级开发人员角色做准备,那么此博客肯定适合您。
让我们从确定这一轮的主要目标开始……
- 将向候选人提供通用问题陈述,候选人必须利用其面向对象的设计技能提出技术解决方案。
- 候选人需要识别给定问题陈述中的不同对象和实体。
- 面试官将检查候选人对 OOP 概念和原则的熟悉程度,以及候选人使用这些概念设计系统的能力。
面试前的准备
1.熟练掌握一门面向对象的编程语言,如Java/C++/ Python等。有一定的相关经验,了解OOPs概念在这些语言中是如何工作的。
- 抽象
- 封装
- 遗产
- 多态性
- 关联、聚合、组合
- 班级
- 目的
- 方法
2.了解各种面向对象的设计原则,如SOLID/DRY原则等。
3.如果你对MVC、单例、工厂方法等各种设计模式有很好的掌握,那么作为入门级开发者或高级开发者,这将是一个加分点。
让我们进入下一步,即面试过程……
解决问题的分步过程
1. 需求收集
首先确定面试官在找什么?面试中是系统级设计还是对象级设计?两轮比赛将采用不同的方法。从需求收集开始。
在这里,面试官会给你一个系统的高级描述,你必须确定问题的确切范围。深入挖掘并澄清他在系统中寻找的一切。与面试官讨论这些功能并提出问题以消除混淆。试着找出面试官正在寻找的输出。
- 收集您想要包含在设计中的最高要求或功能。写下所有要求并与面试官讨论。你的面试官会提到他/她是否想包括一些其他细节或功能。
- 一旦讨论了需求,就在高层次上讨论用例。
- 现在向面试官清楚地定义你的假设。
- 在面试中提及并澄清您需要解决的范围。
让我们以在线购物系统为例。在这个例子中,我们可以考虑下面给出的一些要求……
- 客户可以搜索/查看/购买产品
- 一个购物车,供顾客放置他们想要购买的所有物品。
- 客户应该能够通过信用卡/借记卡/网上银行付款
- 客户应该能够提及可以交付他/她的订单的送货地址。
2. 用例图
在讨论需求时,您必须确定需要包含在设计中的所有用例。列出您的系统应该设计的所有用例。您将能够识别需要包含在系统中的不同组件和参与者。
- 识别用例图中的所有参与者
- 确定不同参与者的角色。
现在您需要将其转换为用例图。以下是在线购物系统的用例。
- 在网站上搜索产品
- 在网站上查看产品
- 从购物车中添加/删除产品
- 查看
- 付款并指定送货地址
3.活动图
一旦确定了参与者和每个参与者的角色,就要关注系统的逻辑、完整结构和整体流程。写出流程图。这将帮助您清楚地了解问题,并且您将有机会纠正错误。下面是在线购物系统的活动图。
4. 类图
这是面试过程的核心部分。你的面试官会对这部分更感兴趣。到现在为止,您已经拥有将它们放置在类图中的所有材料,例如不同的系统对象和参与者。
从识别核心对象开始。如何识别核心对象?以下是识别核心对象的规则……
- 需求中的名词可能是对象的候选对象。
- 要求中的动词是可能的方法。
A.您的主要目标是确定对象之间的关系。
B.确定是使用抽象类还是接口进行抽象
C.检查您是否可以在其中使用某些设计模式。
D.设计一个类图来向面试官展示一切。
请记住一件事,面试官可能会向您提出其他问题。他/她可能会问一些有关您的设计选择的问题。你必须为你所做的选择提供理由。如果将来用户在您的网站上增长,您将如何处理该系统?面试官可能会问你这类问题。
设计问题是开放式的,不同的候选人会有不同的答案。没有错误的答案……所以捍卫你的设计。
确保您牢记基本的面向对象设计原则。这些原则将帮助您绘制类图,并将帮助您有效地处理问题。
5. 描述主要用例
使用上述步骤中定义的类并运行顶级用例。这类似于活动图。如果您错过了任何组件或场景,这将对您有所帮助。你需要向面试官口头解释这一点。
6. 代码
本轮编码部分是可选的,但面试官可能会要求您为特定功能或组件编写代码。如果您被要求编写代码,请优先考虑下面给出的内容。
- 从接口或抽象类开始
- 编写核心对象和内部结构的代码。
- 写实现部分。
- 编写 JUnit
在较高级别,定义所有必需的属性、功能、接口等。