十一点半。合上电脑,屏幕一黑,反着张脸,眼底下乌青得能拧出水。白天全耗在代码里,属性、字段、访问修饰符,转得脑仁疼。金旭亮在《.NET2.0面向对象编程揭秘》里聊封装,原话写得挺板正。拆开揉碎了说,不就是把里头一坨乱糟糟的逻辑全锁进类里,外头只留个利索口子让人调么?
电梯数字往上跳。滴、滴、滴。我盯着看,忽然觉得,这套路跟咱们成年后的生存法则简直一模一样。出门前对着镜子抻平衬衫领子,或者随手抹点口红,算啥?设公共属性呗。昨晚熬到凌晨三点,心里攒着一堆没处理的异常,只要按下“发布”键,迈进客户办公室、坐进会议室,或者推开自家那扇防盗门,递出去的必须是个稳当、能预测的实例。你能把满肚子的火气直接甩给客户?显然不能。
书里写得明白,每个公开属性底下,都垫着一个私有后备字段。有时候就干个简单存取,有时候塞满校验逻辑,甚至触发内部状态重算。日子不也这样?咱们总以为自己“稳定运行”,其实后台垃圾回收早就跑冒烟了。没回的消息、咽回去的抱怨、临时推翻的方案,全被默默标成不可达对象。等系统空下来,再清走。CLR在底层替咱们管内存,咱们在生活里,也给自己搭了套运行时。可说实话,这套“运行时”真不高效。情绪压得太死,跟内存泄漏一个德行,悄无声息地就把人拖垮了。
上周六陪家里人吃饭。我妈随口问工作顺不顺。我扯出个笑,回“挺好的,就是节奏快了点”。话一出口我就知道,这接口的返回值早就被修饰过了。二十岁那年,我绝对直接甩出一串堆栈跟踪,把项目卡壳的烦躁、跟人扯皮的无力全摊桌面上。现在呢?学会了用try-catch包圆,最后只吐一句轻飘飘的return true。咱们早就不往外倒腾内部状态了。心里门儿清:有些依赖关系,外人根本接不住。
不过,封装久了,会不会把自己闷死?书里扒拉委托和事件驱动,核心就俩字:解耦。对象不用管调用者长啥样,订阅想听的事就行。可人跟人打交道,偏偏得留点缝隙。要是把每个字段都锁成private,构造函数藏得严严实实,别人拿什么来实例化信任?怎么传依赖?以前我总把“情绪稳定、接口干净”当成熟标准。后来碰了几次壁才咂摸出味儿,那种永远不报错、永远不阻塞的类,往往最难被继承,也最难复用。独立是真独立,孤立也是真孤立。偶尔暴露点内部状态,未必是代码异味,反而可能是个友好的握手信号。有人觉得这不职业。但硬撑着“零缺陷”,最后累垮的只有你自己。
说真的,我以前特抵触“暴露短板”。总觉得那是代码异味,是设计没做好。直到有回项目上线前夜,服务器频繁超时。我硬着头皮在群里敲了句“我搞不定,谁能帮我看下日志”。那股子慌张劲儿刚冒头,三个同事立马拉了临时会议。问题最后没彻底扳平,但那种单线程死磕的紧绷感,总算松动了。原来让系统抛出异常,根本不是要完蛋,而是系统在喊:资源不够了,该重新分配了。这事儿未必适合天天用,但关键时刻,比死扛强得多。
电梯门“叮”一声开了。走廊声控灯亮了下,又暗下去。明早八点半,闹钟照样炸响,浏览器照样弹出,那些私有字段还在后台悄悄攒着。人这一辈子,本来就没必要把每个内部状态都调试得严丝合缝。能允许自己偶尔抛个异常,能接受线程偶尔卡一下,大概比死守一个永不崩溃的接口,更贴近活着的逻辑。至于那些还没理顺的依赖,就扔给明天的太阳去重新编译吧。