面向对象设计

187 阅读3分钟

这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

面向对象设计

如何解答

对于面向对象设计问题,其要设计的对象多种多样:可能是真实世界的东西,也可能是某个技术任务。不论对象如何,都能以类似的途径解决。以下解题思路对解决很多问题大有裨益。

步骤1:处理不明确的地方

面向对象设计(OOD)问题往往会故意放些烟幕弹,意在检验你是武断臆测,还是提出问题以厘清问题。毕竟,开发人员要是没弄清楚自己要开发什么,就直接挽起袖子开始编码,只会浪费公司的财力物力,还可能造成更严重的后果。

碰到面向对象设计问题时,你应该先问清楚是使用者以及他们将如何使用。对某些问题,你甚至还要问清楚“6W”,即谁(who)、什么(what)、哪里(where)、何时(when)、为什么(why)、如何(how)。

举个例子,假设面试官让你描述咖啡机的面向对象设计。这个问题看似简单明了,其实不然。

这台咖啡机可能是一款工业型机器,设计用来放在大餐厅里,每小时要服务几百位顾客,还要能制作10种不同口味的咖啡。或者可能是给老年人设计的简易咖啡机,只要能制作简单的黑咖啡就行。这些用例将大大影响你的设计。

步骤2:定义核心对象

了解我们要设计的东西后,接下来就该思考系统的“核心对象”了。比如,假设要为一家餐馆进行面向对象设计。那么,核心对象可能包括餐桌(Table)、顾客(Guest)、宴席(Party)、订单(Order)、餐点(Meal)、员工(Employee)、服务员(Server)和领班(Host)。

步骤3:分析对象关系

定义出核心对象之后,接下来要分析这些对象之间的关系。其中,哪些对象是其他对象的数据成员?哪个对象继承自别的对象?对象之间是多对多的关系,还是一对多的关系?

比如,在处理餐馆问题时,我们可能会想到以下设计。

  • 宴席有很多顾客。
  • 服务员和领班都继承自员工。
  • 每一张餐桌对应一个宴席,但每个宴席可能拥有多张餐桌。
  • 每家餐馆有一个领班。

分析对象关系务必谨慎,因为我们经常会做出错误假设。比如,哪怕是一张餐桌也可能涉及多个宴席(在热门餐馆里,“拼桌”很常见)。进行设计时,你应该跟面试官探讨一下如何让你的设计做到一物多用。

步骤4:研究对象的动作

到这一步,你的面向对象设计应该初具雏形了。接下来,该想想对象可执行的关键动作以及对象之间的关系。你可能会发现自己遗漏了某些对象,这时就需要补全并更新设计。

例如,一个宴席对象(由一群顾客组成)走进了餐馆,一位顾客找领班要求一张餐桌。领班开始查看预订(Reservation),若找到记录,便将宴席对象领到餐桌前。否则,宴席对象就要排在列表末尾。等到其他宴席对象离开后,有餐桌空出来,就可以分配给列表中的宴席对象。