Notes · 2024.10.26
面向对象 100
会考试和会写项目中间有缝。
面向对象编程语言这门课我考了 100。卷子上封装、继承、多态是填空和改错。教室里投影仪打出类图,箭头从父类指到子类,看起来整齐。交卷出门的时候我觉得自己会了。过了两周在项目仓库里翻组件,才发现没有人按那张类图画。
智链 3.0 的页面是一块块组件拼的。TextGuard 的接口按请求进、结果出。两边都有「对象」,但对象是被接口和截止日期逼出来的,不是先画 UML 再开工。课上的 100 说明作业做得干净。项目里的干净是另一套标准:能不能在别人的机器上跑起来。
卷子上的对象
作业要求你把「学生、课程、选课」建成一组类,方法名对齐评分表。getter、setter、构造函数漏一个就扣。我按表写,测例全绿,报告截图也齐。老师给满分,给的是这份对齐。
多态在卷子上是:父类指针调用子类方法,输出哪一句。背过就能写。真正写页面的时候,多态很少以那种形状出现。更常见的是同一个表格组件吃不同的列定义,失败时返回同一份错误结构。你硬套教材的继承树,会多出一层没人用的基类。那一层在作业里加分,在仓库里加罪:多一个文件,多一次跳转,新人读不懂你在炫什么。
我后来给自己立了一条。该抽的抽:两处以上复制、且以后会一起改的,才抽。只出现一次的逻辑,留在原处。为了「面向对象」硬抽,课设报告好看,项目 review 难看。
作业还有一套必写的类图。类图和代码一旦分叉,答辩就变成翻译。翻译很累。我最后一版是:先改代码,再从代码倒出类图,倒不出来的箭头删掉。课件里的菱形箭头很好看,我的作业用不上就不用。用上却实现成普通引用,老师追问「这是组合还是聚合」,答不上来的那一分,不值得为图上的装饰去赌。
项目里的对象从哪来
智链的筛选、表格、请求,是产品经理和截止日期一起逼的。先有一页能点的界面,再有状态该放哪、请求该复用哪。Vue3 的组件和课上的 Java 类不是同一套词,但有一件事通:边界要清楚。组件不知道太多全局的事,接口不知道太多页面的事。
TextGuard 那边更硬。检测请求会超时,会空结果。你不能把「成功」写成唯一路径。课上的异常处理是 try/catch 填空。项目里的异常处理是:超时返回什么、空结果页面怎么说、日志写在哪。这些在 100 分的卷子上没有对应题号。
仓库用什么栈就跟什么栈。不要把课上的命名习惯硬套到 Vue,也不要把 React 的习惯套回课设。这一条我后来给别的仓库写约定时又写了一遍。当时只是被报错逼的。
截止日期会逼出坏对象:一个类知道页面、知道接口、知道缓存、知道日志格式。坏对象在截止前能跑。跑完下一周要改其中一件事,四处一起炸。炸过之后我才肯把日志从业务类里搬出去。搬的时候没有设计模式名字。名字是后来才补到笔记里的。笔记补名字可以。代码先补边界。
作业干净和能交之间
课上作业可以在自己电脑上满分。项目要在演示用的那台电脑上满分。路径、依赖、端口、代理,哪一项没写进 README,演示就会停。面向对象课没教 README。课教的是类。项目教的是:类之外还有一堆让类能被别人打开的东西。
我交课设时会把 README 写成步骤,而不是写成「本系统采用面向对象思想」。思想老师已经从代码里看了。步骤是给 10 分钟答辩用的。步骤里出现「思想」两个字,通常意味着我还没把按钮讲清楚。
100 分我留着。留着的意思是承认作业分。不把作业分说成已经会做平台。平台是后来一截,截在接口、超时、空结果、和截止日期上。
答辩我按「打开、点、失败一次、再成功」走。失败一次是给老师看异常路径。课上异常是填空。现场异常是弹窗或返回码。返回码若只在控制台,老师盯界面会以为没做。界面上要有一句人话。人话写「未找到」,不要写堆栈。堆栈留给自己。自己看堆栈,老师看人话。这是 100 分作业里我学到的、卷子上没有的那一截。
下次写类之前先问
再写新模块,我先问三句。有没有已经存在的接口形状?失败怎么返回?谁会在截止前维护它?三句答不上,先不要建继承树。树可以后补。先有一条能跑的请求。
课还要继续考。考前仍会背多态输出。背完去仓库里看一眼自己上周写的组件,提醒自己:卷面 100 和项目对象中间有缝。缝就留在那里,用接口去填,不要用更大的类图去盖。