zoukankan      html  css  js  c++  java
  • 浅谈面试中的OOD面向对象设计问题

    转载自:http://baozitraining.org/blog/Object-oriented-design-question/

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

    问答

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

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

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

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

    深入分析

    当我们相对了解题目的具体需求之后,设计电梯类时要从OO设计基本原则入手,比如封装性,本质上就是讲class内部的状态封装在内,对外提供合理的方法接口。 从方法的角度思考相对直观:根据题目的需求,一个基本的电梯类应该提供什么样的方法呢?

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

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

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

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

    包子Tips

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

    面向对象的另两个重要特性是继承和多态。设计电梯这个题目可能并不是特别适合考察这两方面,但是OO设计的思路是大概相似的:分析每一个类的外部方法和内部状态是什么,什么样的方法可以抽象成通用的接口,什么样的类之间存在继承关系等。

  • 相关阅读:
    关于以追加模式写入文件时,为什么第一行是空行?
    使用正则表达式的技巧
    super关键字的三种用法
    Excel快捷键
    重载与重写的区别
    方法重名
    区分子类方法中重名的三种变量
    继承
    Chapter08【String类、static、Arrays类、Math类】
    Math类
  • 原文地址:https://www.cnblogs.com/beiyetengqing/p/6042780.html
Copyright © 2011-2022 走看看