面向对象设计面试题
![](https://i-blog.csdnimg.cn/blog_migrate/d70aa17aa800d496a051fab0a10d6504.png)
(某些背景:我已经采访了数百名在Facebook和Microsoft从事软件工程工作的应聘者。当我不准备时,我也几次未能通过编程采访。)
面向对象设计(OOD)技能是软件工程师的一大优势 。 他们给面试官以下方面的想法:
- 候选人是否可以将一个复杂的问题转化为一组具体的对象,并确定这些对象之间的相互作用以解决当前的问题。
- 候选人是否可以在设计时识别模式,并在可行的情况下有效地应用经过时间考验的解决方案,而不是重新发明轮子。
如果您正在寻找一个完整的面向对象设计的面试课程,请访问以下资源:
探究面向对象的设计面试 。
软件设计模式:面向软件开发人员的最佳做法 。
为软件工程师准备的面试准备课程。
如果您想作为一名软件工程师获得成功,那么面向对象的设计面试是必不可少的,但是很多工程师都害怕OOD面试问题(包括我面试时的我自己!)。 造成这种情况的主要原因如下:
- 他们可以很快地变得非常抽象。 OOD问题要求能够“缩小”问题,并真正地从高层次考虑组件(但不要太抽象)。
- 对于给定问题,通常不只有一个正确答案。 可以通过许多不同的方式来考虑或解决问题。
- 许多初学者开发人员还没有机会从头开始设计复杂的系统。
- 面向对象的设计通常在大学中以某种看起来像无聊的理论课程的方式教授,因为在系统真正复杂之前,您无法欣赏到这种设计的价值,而且很难跟踪所有这些信息。头脑中的物体和互动。
![](https://i-blog.csdnimg.cn/blog_migrate/7d99ad9ae9f93f094d12beec6efa6acc.png)
好消息是,在Educative ,我们已经与数百名候选人进行了交谈,我们的作者与Google,Amazon,Microsoft和Facebook等顶尖高科技公司的招聘经理合作,详细解决了常见的面试问题。
除了涵盖这些公司可能会提出的一些最流行的OOD面试问题之外,我还将介绍解决这些问题的一般方法,因此您也可以将自己的技能应用于其他问题。
OOD面试问题的处理方法:
在面向对象设计问题中,访调员正在寻找您对复杂问题细微差别的理解,以及您将需求转换为可理解类的能力。
实际上,OOD问题通常都将遵循非常相似的模式。 系统将为您提供一个模糊的问题和一套约束,供您设计系统,而其他方面则很少。 然后,由候选人(候选人)决定访调员正在寻找的解决方案的“级别”,需要哪种功能,并提出可行的解决方案。
采访者正在寻找一件主要的事情:在既可立即使用又可适应未来变化的解决方案之间找到适当的平衡。
为简化起见,您可以对遇到的任何OOD问题采用以下方法:
- 明确要求:确保您了解面试官的期望。 如有必要,请问清楚问题—面试官不会介意,并且可能会很感激。 例如,“您是否正在寻找我来演示解决方案的结构或完全实施它?” 在此处执行此操作大约需要5-10秒,但可以节省大量时间。
- 提出主要的用例:考虑然后讨论用例。 确保您了解系统期望具有的所有不同功能。 大声谈论它也可以帮助您遇到期望或想法,如果您直接进入,可能不会意识到。
- 确定关键对象:现在,确定将在解决方案中起作用的所有对象。 例如,如果您要设计一个停车场,这些将是车辆,停车位,车库,入口,出口,车库操作员等。
- 标识对象支持的操作:算出您期望上一步中标识的每个对象具有的所有行为。 例如,汽车应该能够移动,停在给定的地点并持有车牌。 停车位应能够容纳两轮车或四轮车等。
- 识别对象之间的交互:绘制需要相互连接的不同对象之间的关系。 这就是所有的地方。 例如, 汽车应该能够在停车位停车 。 停车场应能够容纳多个停车位 ,依此类推。
我现在将逐步介绍一些我建议练习的最重要的问题。 对于每一个问题,我还将分享一些有关访问者在您回答此类问题时可能会寻找的内容的提示。
要查看详细的解决方案,请查看“ Grokking面向对象设计面试 ”课程。
设计Amazon / Flipkart(在线购物平台)
![](https://i-blog.csdnimg.cn/blog_migrate/b438f841fedac5398d6adcae137072ce.png)
除了基本功能(注册,登录等)之外,访问者还将寻找以下内容:
- 可发现性:买方将如何发现产品? 搜索结果如何?
- 购物车和结帐:用户期望购物车和结帐以某种方式运行。 设计将如何遵循这些已知的最佳实践,同时引入创新的结账语义(如“一键购买”)?
- 付款方式:用户可以使用信用卡,礼品卡等进行付款。付款方式如何在结帐过程中起作用?
- 产品评论和评分:用户何时可以发布评论和评分? 如何跟踪有用的评论并降低优先级较低的评论的优先级?
2.设计电影票预订系统
![](https://i-blog.csdnimg.cn/blog_migrate/eb89c86cf2cb0fd2dd6265421b986330.png)
面试官希望看到您回答中的以下几点:
- 复制:您如何处理实例,例如同一个电影院有多个同时显示不同电影的电影院? 还是同一部电影在同一电影院/电影院在不同时间放映?
- 付款处理 :用户购买机票的流程是什么?
- 选择:用户将如何挑选座位,以确保尚未被其他人预订?
- 价格差异:如何考虑折扣价? 例如,针对学生或儿童。
3.设计一个ATM
![](https://i-blog.csdnimg.cn/blog_migrate/3b3bfa8eb824f64f3b7221f2b7ba7df7.png)
面试官希望看到您讨论以下内容:
- 透支 :当ATM上没有现金时,您会怎么办?
- 密码验证 :如果用户多次输入错误的PIN怎么办?
- 读卡:如何检测卡是否已正确插入?
4.设计航空公司管理系统
![](https://i-blog.csdnimg.cn/blog_migrate/74eb1f559c49a6248b67461f952a8ffe.png)
从面试官的角度来看,一个好的答案将解决:
- 行程复杂度 :多程行程如何运作? 如何处理同一行程中的多名乘客?
- 提醒:如果航班状态发生变化,如何通知客户?
- 外部访问:系统将如何与预订同一航班的其他参与者(例如航空公司的前台运营商)进行交互?
5.设计二十一点(纸牌游戏)
![](https://i-blog.csdnimg.cn/blog_migrate/d205fb476e0ded070c4ff5155b25277f.png)
理想情况下,您的答案应考虑以下因素:
- 计分:在系统的哪个级别处理计分? 这有什么优点和缺点?
- 规则:如有需要,可以灵活地使用不同的内部规则吗?
- 投注:如何处理投注支出? 如何计算赔率?
6.设计酒店管理系统
![](https://i-blog.csdnimg.cn/blog_migrate/a3c9977e7783a70cc43cdad42f7d3dcc.png)
您需要确保涵盖:
- 房间复杂度:系统将如何支持同一酒店内的不同房间类型?
- 警报:系统如何提醒用户他们的入住日期临近? 还有哪些其他警报可能对您有用?
- 定制:用户将如何在其房间上提出特殊要求? 将支持什么样的特殊请求?
- 取消/修改:系统将如何处理预订取消(在允许的时间内)? 那其他的变化呢? 涵盖哪些类型的修改?
7.设计一个停车场
![](https://i-blog.csdnimg.cn/blog_migrate/397ee8c8e98c9871b6b9626f18960f83.png)
这是最常见的OOD面试问题之一,也是必须知道的问题。
面试官希望听到您的讨论:
- 付款灵活性:客户如何在不同地点(即在每个楼层的客户信息控制台或出口处)以不同的方式(现金,信贷,优惠券)付款?
- 容量:如何考虑每个停车场的停车容量? 当很多东西吃饱了会怎样?
- 车辆类型:如何将容量分配给不同的停车位类型,例如摩托车,紧凑型汽车,电动汽车,残障车辆等?
- 定价:定价将如何处理? 每小时应有不同的费率。 例如,客户必须在第一个小时支付4美元,第二个小时和第三个小时支付3.5美元,其余所有小时支付2.5美元。
8.设计一个在线股票经纪系统
![](https://i-blog.csdnimg.cn/blog_migrate/64cb71081b33c4022c44b840d914ab1b.png)
一个好的答案将涵盖以下几点:
- 监视列表:系统将如何处理用户创建的监视列表以保存/监视特定股票?
- 交易类型:系统将如何处理不同的交易类型,例如止损和止损限价单? 支持哪些类型?
- 库存批次:如果用户多次购买相同的股票,系统将如何区分同一库存的不同“批次”以进行报告?
- 报告:系统将如何生成月度,季度和年度更新的报告?
9.设计租车系统
![](https://i-blog.csdnimg.cn/blog_migrate/71b47c6b70c779a22c9f544e70433598.png)
候选人应该能够讨论以下内容:
- 识别:如何唯一识别每个车辆并将其放置在停车场内?
- 费用:系统将如何收取滞纳金,以防延迟退货?
- 日志:系统将如何维护每个车辆和每个成员的日志?
- 定制:系统将如何处理会员对其他服务的请求,例如路边援助,全面保险和GPS?
10.设计Facebook-一个社交网络
![](https://i-blog.csdnimg.cn/blog_migrate/30288e1f38c3ae47a7ececc769e37a3e.png)
理想情况下,您的答案应涵盖:
- 可发现性:用户如何搜索其他用户的个人资料?
- 跟随:用户如何能够跟随/取消关注其他用户而不成为直接连接?
- 组/页面:成员除了自己的用户配置文件外,如何还能创建组和页面?
- 隐私权:系统将如何处理具有某些内容的隐私权列表,仅显示给指定的连接?
- 警报:如何向用户通知预选事件?
如果您正在寻找上述问题的详细答案,包括实际的UML图和代码段,我强烈建议您看一下Grokking面向对象设计面试 。
如果您发现此帖子有帮助,请单击 👏 符号并关注我以获取更多帖子。 如果您有任何反馈意见,请通过 Twitter 与我联系 。
面向对象设计面试题