Saturday, July 12, 2014

浅谈面试中的OOD面向对象设计问题

包子IT面试培训(http://baozitraining.org) , 助你拿到理想的offer!



OO设计问题是电面或者onsite中常考的问题,尤其对以Java为主要开发语言的公司(比如Amazon),OO设计问题可以算必考。OO设计题目的特点是题目非常开放,比如用OO的思想设计一个停车场,或者电梯等,没有固定的答案和套路。对于面试者,尤其是编程经验有限的毕业生,如何回答好这类问题确实是非常大的挑战。那么本篇就以设计电梯为例讲解一下回答这类问题的思路、以及需要注意的细节。


面试官:(经过若干客套)能否用设计关于一个电梯的class,合理的设计其方法和内部成员?


准确理解面试问题是成功面试的第一步,对于OO设计问题更是如此。由于题目的需求相对模糊,面试者需要通过不断的沟通和交流来确定题目中可能被遗漏的细节,从而明确需要实现的步骤和细节。


『设计电梯类』,每个人对于电梯都有一个具体的认知,但面试者自己的理解是否就和面试官一致呢?避免想当然的去假设,多问问题,明确细节,比如:


  • 电梯的容量(载重,载入数)是否考虑?
  • 电梯的运行范围是几层到几层?
  • 是一部电梯还是多个电梯?


当我们相对了解题目的具体需求之后,设计电梯类时要从OO设计基本原则入手,比如封装性,本质上就是讲class内部的状态封装在内,对外提供合理的方法接口。


从方法的角度思考相对直观:根据题目的需求,一个基本的电梯类应该提供什么样的方法呢?


  • 开门、关门
  • 移动到下一目标楼层
  • 接受去目标楼层的请求


以上都是最直观、最基本的方法,相对应的就是电梯内部的基本状态:


  • 电梯门的开关状态 (开关门会影响该状态)
  • 运行方向(移动会影响该状态,该状态也影响下一步行动);
  • 当前楼层 (移动会影响该状态,该状态也影响下一步行动)
  • 需要停的楼层集合(接受去某楼层的请求会影响该状态,该状态影响下一步行动);


如果在细一点,还可以加入『当前载重』,『当前载人数』等,可以使内部的实现更加合理。如果面试官设计的基本方法和内部状态设计没有异议,面试者一般还需要简单的实现一两个重要的方法,在本题中『移动到下一目标楼层』方法,目的在于看面试者是否有能力将接口和内部对象状态封装好。


包子Tips: 面试中很多同学喜欢临时添加变量,比如一开始没有考虑到电梯门的状态,结果到了需要实现开门、关门的方法的时候只能临时补。这样一来容易出错,二来会给面试官留下不好的印象。我们建议同学们在答题之前,最好花一点时间,把需要设计的方法、用到的内部状态想清楚,然后再深入做题,尽量做到思路清晰、连贯。


面向对象的另两个重要特性是继承和多态。设计电梯这个题目可能并不是特别适合考察这两方面,但是OO设计的思路是大概相似的:分析每一个类的外部方法和内部状态是什么,什么样的方法可以抽象成通用的接口,什么样的类之间存在继承关系等。作为一个思考的问题,大家不妨动手做一做『如何设计停车场』这个题目,欢迎留言讨论。

No comments:

Post a Comment