要多健壮的代码才能支撑起千变万化的需求?

2021-08-11 10:09:14 +08:00
 waiaan

最后不会成为屎山

13924 次点击
所在节点    程序员
114 条回复
keepeye
2021-08-11 11:59:40 +08:00
屎山是如何形成的。很多时候不是因为增加需求,而是因为需求不断变化,前后矛盾
vone
2021-08-11 12:00:02 +08:00
@HENQIGUAI nocode 现在的 issues:3,487 Open,514 Closed 。看起来也不是特别健壮了。/doge
gps949
2021-08-11 12:05:00 +08:00
取决于你的“千变万化”会发生在多长时间内。
[几天之内千变万化] 别写代码了,搞个脚本,最好还是靠人工吧。
[几个月之内千变万化] 要注意类函数变量的类型、命名、作用范围等,编码时尽可能的考虑全特殊值、边界问题等。
[几年之内千变万化] 写好注释、文档,系统模块化设计,标准化接口,数据格式精心设计更灵活,方法和模块复用尽可能小心。
[几十年之内千变万化] 系统架构设计灵活、可扩展,代码语言的选择仔细考量,第三方框架、库、插件等尽量少用,一切轮子尽可能自己实现,并除很小内核外,尽可能以松耦合的插件方式实现。
[几百年之内千变万化] 你 /你的程序 /业务活不了那么久,不如思考下人类发展历史走向吧。
iBugOne
2021-08-11 12:17:45 +08:00
乱改需求可以掀翻小菜鸟,但是掀不翻大佬
YUCOAT
2021-08-11 12:21:34 +08:00
我觉得方法只有一种,那就是“看到 shit 的时候及时把屎铲掉,别等堆起来”。

以前所在的团队,我们写代码遵循两条原则:
1 、以前的旧代码,能不动就不动。
2 、添加新代码的时候,尽可能少的对旧代码进行修改。

正是因为这两条原则,使得垃圾代码越堆越高。

纯靠设计来防止垃圾代码越堆越高根本不现实,项目早期的时候,我们会对未来需求的预测来设计代码结构。
刚开始可能设计良好,一两年以后,新的需求与早期的预测差别越来越大,这时老的设计已经无法通过扩展代码的方式来满足新的需求了,这时如果不对部分代码进行翻新,垃圾代码就会慢慢堆积起来。
bloomy8
2021-08-11 12:24:30 +08:00
@yidinghe 请教下这个图是手工画的还是自动生成的,用的什么软件
thtznet
2021-08-11 12:29:39 +08:00
能支撑业务的,从来就不是代码,而是资本。
shyangs
2021-08-11 12:34:02 +08:00
開閉原則( OCP ): 如果系統想要容易被改變,那麼其設計就必須允許只靠增加代碼來改變系統行為,而非只能修改原有代碼

----

以前所在的團隊,我們寫代碼遵循兩條原則:
1 、以前的舊代碼,能不動就不動。
2 、添加新代碼的時候,盡可能少的對舊代碼進行修改。

正是因為這兩條原則,使得垃圾代碼越堆越高。
seakingii
2021-08-11 12:39:19 +08:00
这不叫健壮,叫灵活吧
opentrade
2021-08-11 12:39:28 +08:00
解耦+单元测试
swim2sun
2021-08-11 12:43:11 +08:00
没有银弹
Perry
2021-08-11 12:46:07 +08:00
有各种测试真的是最重要的
ericls
2021-08-11 12:48:20 +08:00
不需要 把该满足的目的满足就行了

平面几何解决不了曲面几何的问题
牛顿力学也解决不了微观的需求
你的代码要那么厉害干什么?
shot
2021-08-11 12:49:27 +08:00
@yidinghe #23

只是类图就错综复杂绕来绕去的……
就算代码写的再优雅,要是移交给别人(或者半年后自己再来看)会很难看懂吧……

针对这种计算规则多样,并且可能频繁修改的需求,一个比较推荐的办法是做个简单的「计算规则引擎」。

比如说:把「计算公式」和「参数」按照标准的格式记录在 Excel 文件里,「计算规则引擎」解读该 Excel 文件生成计算规则,然后应用程序读取数据并调用计算引擎作计算。
当需要更新计算规则时,业务人员只需修订 Excel,然后重新上传到系统。

除了 Excel,Python/Lua/Javascript 之类的脚本语言也能用来定义计算规则,我甚至用过 xml 。
之所以首选 Excel,是因为运营人员(产品经理、系统运维)和用户(学校老师)都熟悉 Excel 操作,而且能直接在 Excel 文件里输入一些样例数据对公式做人工验证。
namelosw
2021-08-11 12:55:13 +08:00
个人人为如果你用的语言支持 ad-hoc polymorphism,才比较建议追求灵活。

如果语言只有继承的话,追求灵活一般都是作死。

下面这篇文章说的是著名的表达式问题,很简单,就是加法乘法这些数据结构作为表达式,分别有打印和计算这些操作,然后希望符合 OCP 原则的情况下可以增加新的表达式和新的操作:

https://koerbitz.me/posts/Solving-the-Expression-Problem-in-Haskell-and-Java.html

如果你对比一下里面 Haskell 和 Java 的解决方案,就会发现 Haskell 在这个问题下实现 OCP 原则,使用了 Type Class 基本不牺牲可读性;而 Java 没有 ad-hoc polymorphism,要实现 OCP 只能用 Object Algebra 的方式来模拟,代码基本看不懂。
3dwelcome
2021-08-11 12:57:17 +08:00
@yidinghe 那么多英文,不写中文注释,完全不懂每个子模块的意思啊。
libook
2021-08-11 13:27:20 +08:00
《没有银弹》
Sequencer
2021-08-11 13:46:19 +08:00
AOP
g0thic
2021-08-11 13:47:26 +08:00
写好文档和注释 就好了
sakasaka
2021-08-11 13:48:35 +08:00
DDD 可以缓解这种问题,不过随着版本的演进,搞不好最终还是一坨屎

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/795005

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX