热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

面向对象设计面试题_开发人员应该知道的十大面向对象设计面试问题

面向对象设计面试题(某些背景:我已经采访了数百名在Facebook和Microsoft从事软件工程工作的应聘者。当我不准备时,我也几次未能

面向对象设计面试题

(某些背景:我已经采访了数百名在Facebook和Microsoft从事软件工程工作的应聘者。当我不准备时,我也几次未能通过编程采访。)

面向对象设计(OOD)技能是软件工程师的一大优势 。 他们给面试官以下方面的想法:

  1. 候选人是否可以将一个复杂的问题转化为一组具体的对象,并确定这些对象之间的相互作用以解决当前的问题。
  2. 候选人是否可以在设计时识别模式,并在可行的情况下有效地应用经过时间考验的解决方案,而不是重新发明轮子。
如果您正在寻找一个完整的面向对象设计的面试课程,请访问以下资源:
探究面向对象的设计面试
软件设计模式:面向软件开发人员的最佳做法
为软件工程师准备的面试准备课程。

如果您想作为一名软件工程师获得成功,那么面向对象的设计面试是必不可少的,但是很多工程师都害怕OOD面试问题(包括我面试时的我自己!)。 造成这种情况的主要原因如下:

  1. 他们可以很快地变得非常抽象。 OOD问题要求能够“缩小”问题,并真正地从高层次考虑组件(但不要太抽象)。
  2. 对于给定问题,通常不只有一个正确答案。 可以通过许多不同的方式来考虑或解决问题。
  3. 许多初学者开发人员还没有机会从头开始设计复杂的系统。
  4. 面向对象的设计通常在大学中以某种看起来像无聊的理论课程的方式教授,因为在系统真正复杂之前,您无法欣赏到这种设计的价值,而且很难跟踪所有这些信息。头脑中的物体和互动。

好消息是,在Educative ,我们已经与数百名候选人进行了交谈,我们的作者与Google,Amazon,Microsoft和Facebook等顶尖高科技公司的招聘经理合作,详细解决了常见的面试问题。

除了涵盖这些公司可能会提出的一些最流行的OOD面试问题之外,我还将介绍解决这些问题的一般方法,因此您也可以将自己的技能应用于其他问题。

OOD面试问题的处理方法:

在面向对象设计问题中,访调员正在寻找您对复杂问题细微差别的理解,以及您将需求转换为可理解类的能力。

实际上,OOD问题通常都将遵循非常相似的模式。 系统将为您提供一个模糊的问题和一套约束,供您设计系统,而其他方面则很少。 然后,由候选人(候选人)决定访调员正在寻找的解决方案的“级别”,需要哪种功能,并提出可行的解决方案。

采访者正在寻找一件主要的事情:在既可立即使用又可适应未来变化的解决方案之间找到适当的平衡。

为简化起见,您可以对遇到的任何OOD问题采用以下方法:

  1. 明确要求:确保您了解面试官的期望。 如有必要,请问清楚问题—面试官不会介意,并且可能会很感激。 例如,“您是否正在寻找我来演示解决方案的结构或完全实施它?” 在此处执行此操作大约需要5-10秒,但可以节省大量时间。
  2. 提出主要的用例:考虑然后讨论用例。 确保您了解系统期望具有的所有不同功能。 大声谈论它也可以帮助您遇到期望或想法,如果您直接进入,可能不会意识到。
  3. 确定关键对象:现在,确定将在解决方案中起作用的所有对象。 例如,如果您要设计一个停车场,这些将是车辆,停车位,车库,入口,出口,车库操作员等。
  4. 标识对象支持的操作:算出您期望上一步中标识的每个对象具有的所有行为。 例如,汽车应该能够移动,停在给定的地点并持有车牌。 停车位应能够容纳两轮车或四轮车等。
  5. 识别对象之间的交互:绘制需要相互连接的不同对象之间的关系。 这就是所有的地方。 例如, 汽车应该能够在停车位停车停车场应能够容纳多个停车位 ,依此类推。

我现在将逐步介绍一些我建议练习的最重要的问题。 对于每一个问题,我还将分享一些有关访问者在您回答此类问题时可能会寻找的内容的提示。

要查看详细的解决方案,请查看“ Grokking面向对象设计面试 ”课程。

设计Amazon / Flipkart(在线购物平台)

除了基本功能(注册,登录等)之外,访问者还将寻找以下内容:

  • 可发现性:买方将如何发现产品? 搜索结果如何?
  • 购物车和结帐:用户期望购物车和结帐以某种方式运行。 设计将如何遵循这些已知的最佳实践,同时引入创新的结账语义(如“一键购买”)?
  • 付款方式:用户可以使用信用卡,礼品卡等进行付款。付款方式如何在结帐过程中起作用?
  • 产品评论和评分:用户何时可以发布评论和评分? 如何跟踪有用的评论并降低优先级较低的评论的优先级?

2.设计电影票预订系统

面试官希望看到您回答中的以下几点:

  • 复制:您如何处理实例,例如同一个电影院有多个同时显示不同电影的电影院? 还是同一部电影在同一电影院/电影院在不同时间放映?
  • 付款处理 :用户购买机票的流程是什么?
  • 选择:用户将如何挑选座位,以确保尚未被其他人预订?
  • 价格差异:如何考虑折扣价? 例如,针对学生或儿童。

3.设计一个ATM

面试官希望看到您讨论以下内容:

  • 透支 :当ATM上没有现金时,您会怎么办?
  • 密码验证 :如果用户多次输入错误的PIN怎么办?
  • 读卡:如何检测卡是否已正确插入?

4.设计航空公司管理系统

从面试官的角度来看,一个好的答案将解决:

  • 行程复杂度 :多程行程如何运作? 如何处理同一行程中的多名乘客?
  • 提醒:如果航班状态发生变化,如何通知客户?
  • 外部访问:系统将如何与预订同一航班的其他参与者(例如航空公司的前台运营商)进行交互?

5.设计二十一点(纸牌游戏)

理想情况下,您的答案应考虑以下因素:

  • 计分:在系统的哪个级别处理计分? 这有什么优点和缺点?
  • 规则:如有需要,可以灵活地使用不同的内部规则吗?
  • 投注:如何处理投注支出? 如何计算赔率?

6.设计酒店管理系统

您需要确保涵盖:

  • 房间复杂度:系统将如何支持同一酒店内的不同房间类型?
  • 警报:系统如何提醒用户他们的入住日期临近? 还有哪些其他警报可能对您有用?
  • 定制:用户将如何在其房间上提出特殊要求? 将支持什么样的特殊请求?
  • 取消/修改:系统将如何处理预订取消(在允许的时间内)? 那其他的变化呢? 涵盖哪些类型的修改?

7.设计一个停车场

这是最常见的OOD面试问题之一,也是必须知道的问题。

面试官希望听到您的讨论:

  • 付款灵活性:客户如何在不同地点(即在每个楼层的客户信息控制台或出口处)以不同的方式(现金,信贷,优惠券)付款?
  • 容量:如何考虑每个停车场的停车容量? 当很多东西吃饱了会怎样?
  • 车辆类型:如何将容量分配给不同的停车位类型,例如摩托车,紧凑型汽车,电动汽车,残障车辆等?
  • 定价:定价将如何处理? 每小时应有不同的费率。 例如,客户必须在第一个小时支付4美元,第二个小时和第三个小时支付3.5美元,其余所有小时支付2.5美元。

8.设计一个在线股票经纪系统

一个好的答案将涵盖以下几点:

  • 监视列表:系统将如何处理用户创建的监视列表以保存/监视特定股票?
  • 交易类型:系统将如何处理不同的交易类型,例如止损和止损限价单? 支持哪些类型?
  • 库存批次:如果用户多次购买相同的股票,系统将如何区分同一库存的不同“批次”以进行报告?
  • 报告:系统将如何生成月度,季度和年度更新的报告?

9.设计租车系统

候选人应该能够讨论以下内容:

  • 识别:如何唯一识别每个车辆并将其放置在停车场内?
  • 费用:系统将如何收取滞纳金,以防延迟退货?
  • 日志:系统将如何维护每个车辆和每个成员的日志?
  • 定制:系统将如何处理会员对其他服务的请求,例如路边援助,全面保险和GPS?

10.设计Facebook-一个社交网络

理想情况下,您的答案应涵盖:

  • 可发现性:用户如何搜索其他用户的个人资料?
  • 跟随:用户如何能够跟随/取消关注其他用户而不成为直接连接?
  • 组/页面:成员除了自己的用户配置文件外,如何还能创建组和页面?
  • 隐私权:系统将如何处理具有某些内容的隐私权列表,仅显示给指定的连接?
  • 警报:如何向用户通知预选事件?

如果您正在寻找上述问题的详细答案,包括实际的UML图和代码段,我强烈建议您看一下Grokking面向对象设计面试

如果您发现此帖子有帮助,请单击 👏 符号并关注我以获取更多帖子。 如果您有任何反馈意见,请通过 Twitter 与我联系

翻译自: https://hackernoon.com/the-top-10-object-oriented-design-interview-questions-developers-should-know-c7fc2e13ce39

面向对象设计面试题



推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
author-avatar
mobiledu2502869603
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有