关于代码行数的一些想法
在做项目的时候和同学就「单文件的最大行数」产生了分歧。同学的说法是,「代码长就看不下去,因为干净架构需要简单、行数短的代码」。
但是在这个项目,或者说专门针对当时的情况,有这么几个理由吧:
- 这段代码是Flutter的,众所周知,Flutter是以嵌套括号和冗长的render函数而闻名的。
- 代码使用了MVVM的模式,因为是试验性的代码,所以就先把各种class和enum写在了同一个文件里,这样的话编码和debug时的思路也不那么容易被干扰。
- 因为时间紧凑,提交新功能和测试新功能的完成度是优先于「代码风格」这种主观的判断的。
我也认同代码应该尽量精简,函数应该尽可能短小,并且更进一步的,良好的软件应该是充分抽象和提取共同方法的。
更进一步说,我是有强迫症的人,比如说如果代码的列没对齐或者缩紧格式错了我就会很难受,但是这不影响同一个代码,在书写良好的前提下和不遵循这个前提下都是同样的抽象语法树,这个事实。
我是不认可拿着尺子量代码长度的。因为我认为,代码的复杂度就在那里,也许它可以被转移或者用某种办法(例如重构和拆文件)来让它看起来没那么复杂,但也只是看起来而已。
一个极端的例子就是在网页前端里嵌入three.js的渲染代码,整个渲染流程需要创建场景和摄像机、进行数据操作、渲染物件的工程量就在那,再怎么重构,这些逻辑都是无法被简化的。更进一步,three.js如果和vue.js的局部变量互相操作,基于性能、架构等考虑,试图把这些局部变量抽离出来也会变成一种反模式或者根本不可能。
实际上,在代码并入主线后我也试着重构了一下,但是重构后的单文件代码也有几百行,唯一的区别就是原本同一个文件里的ViewModel被移出去了。也就是说,复杂度本身就决定了代码不可能太短。
我也同意一个文件不应该放太多class,但是对我来说,我是认为两个功能上分离开来的class,放在一个文件和两个文件里,从programmer的角度讲实际上是一回事。因为在两种情况下,代码的结构和抽象语法树都是一致的。
对我来说,架构的清晰和良好的设计,我觉得更重要的更多是一种intrinsic的,代码结构里的属性,而不是「判断这个代码干净或者不干净」的教条。
长代码对我来说当然也是尽量避免的,但我不会用「干净架构」作为禁止它的教条理由。