浅谈面试中的OOD面向对象设计问题
转载自:http://baozitraining.org/blog/Object-oriented-design-question/
OO设计问题是电面或者onsite中常考的问题,尤其对以Java为主要开发语言的公司(比如Amazon),OO设计问题可以算必考。OO设计题目的特点是题目非常开放,比如用OO的思想设计一个停车场,或者电梯等,没有固定的答案和套路。对于面试者,尤其是编程经验有限的毕业生,如何回答好这类问题确实是非常大的挑战。那么本篇就以设计电梯为例讲解一下回答这类问题的思路、以及需要注意的细节。
问答
面试官:(经过若干客套)能否用设计关于一个电梯的class,合理的设计其方法和内部成员?
准确理解面试问题是成功面试的第一步,对于OO设计问题更是如此。由于题目的需求相对模糊,面试者需要通过不断的沟通和交流来确定题目中可能被遗漏的细节,从而明确需要实现的步骤和细节。
『设计电梯类』,每个人对于电梯都有一个具体的认知,但面试者自己的理解是否就和面试官一致呢?避免想当然的去假设,多问问题,明确细节,比如:
- 电梯的容量(载重,载入数)是否考虑?
- 电梯的运行范围是几层到几层?
- 是一部电梯还是多个电梯?
深入分析
当我们相对了解题目的具体需求之后,设计电梯类时要从OO设计基本原则入手,比如封装性,本质上就是讲class内部的状态封装在内,对外提供合理的方法接口。 从方法的角度思考相对直观:根据题目的需求,一个基本的电梯类应该提供什么样的方法呢?
- 开门、关门
- 移动到下一目标楼层
- 接受去目标楼层的请求
以上都是最直观、最基本的方法,相对应的就是电梯内部的基本状态:
- 电梯门的开关状态 (开关门会影响该状态);
- 运行方向(移动会影响该状态,该状态也影响下一步行动);
- 当前楼层 (移动会影响该状态,该状态也影响下一步行动);
- 需要停的楼层集合(接受去某楼层的请求会影响该状态,该状态影响下一步行动);
如果在细一点,还可以加入『当前载重』,『当前载人数』等,可以使内部的实现更加合理。如果面试官设计的基本方法和内部状态设计没有异议,面试者一般还需要简单的实现一两个重要的方法,在本题中『移动到下一目标楼层』方法,目的在于看面试者是否有能力将接口和内部对象状态封装好。
包子Tips
面试中很多同学喜欢临时添加变量,比如一开始没有考虑到电梯门的状态,结果到了需要实现开门、关门的方法的时候只能临时补。这样一来容易出错,二来会给面试官留下不好的印象。我们建议同学们在答题之前,最好花一点时间,把需要设计的方法、用到的内部状态想清楚,然后再深入做题,尽量做到思路清晰、连贯。
面向对象的另两个重要特性是继承和多态。设计电梯这个题目可能并不是特别适合考察这两方面,但是OO设计的思路是大概相似的:分析每一个类的外部方法和内部状态是什么,什么样的方法可以抽象成通用的接口,什么样的类之间存在继承关系等。
浅谈面试中的OOD面向对象设计问题的更多相关文章
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈iOS中MVVM的架构设计与团队协作【转载】
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈iOS中MVVM的架构设计
MVVM就是在MVC的基础上分离出业务处理的逻辑到viewModel层. M: Model层是API请求的原始数据,充当DTO(数据传输对象),当然,用字典也是可以的,编程么,要灵活一些.Model ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 【转】浅谈Java中的hashcode方法(这个demo可以多看看)
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...
- 浅谈Java中的final关键字
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 【转】浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...
- 浅谈HTTP中GET、POST用法以及它们的区别
浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...
随机推荐
- HTML入门笔记案例展示(2)
结上一篇(1)http://blog.csdn.net/qq_32059827/article/details/51399288 6.超链接(重要): 超链接标签 就是 a 标签 <!-- 超链 ...
- Shell script 传参数处理(默认变量)
变量 含义 $0:shell脚本的名字: $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 "$*" :代表"$1c$2c$3 ...
- iOS开发经验相关知识
一. iPhone Size 手机型号 屏幕尺寸 iPhone 4 4s 320 * 480 iPhone 5 5s 320 * 568 iPhone 6 6s 375 * 667 iphone 6 ...
- OpenCV GUI基本操作,回调函数,进度条,裁剪图像等
代码为转载,出处找不到了,不贴了 工具条进度条: // ConvertColor.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #incl ...
- Linux常用命令(第二版) --网络通信命令
网络通信命令 1.write /usr/bin/write 格式: write [用户名] #用于向用户发送信息,前提是这个用户已经登录到了这台服务器主机,不然的话,也没有办法给他留言,所以,writ ...
- OBJ-C中dispatch_once的用法
见如下代码: +(GameState*)sharedGameState{ static GameState *sharedInstance; static dispatch_once_t onceTo ...
- 一键安装Android开发环境
一键安装Android开发环境 1 下载tadp-3.0r4-linux-x64.run 进入下面的地址下载: https://developer.nvidia.com/gameworksdownlo ...
- obj-c中SEL签名和Invocation示例
参考小示例,代码如下: #import <Foundation/Foundation.h> @interface PlayList:NSObject @property NSMutable ...
- Oracle创建视图view权限不足问题剖析
问题: 使用USER1等其他用户登录Oracle以后,创建视图,提示"权限不够",怎么解决? 这是因为USER1这个帐户目前没有创建视图的权限. 解决方法为: 首先使用system ...
- ethtool确定网卡对应的物理网口
在配置有多个网络接口的设备时我们会犯难,eth0.eth1.--到底是那个接口? 我使用的机器是CentOS系统,打开终端,输入ethtool –help 显示帮助信息,下面我就简要介绍一下最常用的两 ...