好像不自觉就写了难以维护的代码 ...

2014-11-29 21:08:16 +08:00
 Sunyanzi
今天遇到这么个事儿 ... 我自己也拿不定主意 ... 想来想去还是发帖子了 ...

起因是这样 ... 我因为不能忍线上的支付宝相关代码是官方的示例 SDK ... 所以整个重构 ...

重构完毕的代码里有这么一段 ... 用以一站式判断 PC 和 WAP 的返回值 ...




我自己觉得写的还蛮顺的 ... 延着思路就写下来了 ...

但今天在讲我重构之后的代码时 ... 大家的反应是「看不懂」「不敢改」「维护不了」 ...

我就有点心虚 ... 虽然可以强权镇压但我终归还是想知道更多人的看法 ...

诚然我可以把这段代码拆成分散在三四个文件里的五六个类 ... 然后用非常华丽的技法加载 ...

但我个人觉得那样才是没必要 ... 更加占用资源而且更加难以维护 ...

最近 V2 上也在讨论什么样的代码简单易懂 ... 赶着这阵子正好问问 ...

反正我个人就是觉得谁如果觉得我这段代码晦涩只能说明他自己 php 水平不过关 ...

是我错了吗 ...
9402 次点击
所在节点    PHP
79 条回复
freefcw
2014-11-29 22:00:09 +08:00
p.s.

我不知道为什么你要把两个功能放一起。。notify和return,应该分开才清晰

总而言之,你这个函数里面做了太多的事情,直接意义上会认为你是在验证回调,但是还分了两种回调,还去请求了?反正$this->$method[$type]('sign')这种代码。。请问怎么读懂这行代码?还不如一个if else来得清晰易懂
获取notify_id这种低层级的代码。。。
还有一个ssl_request的调用,加上一大堆的字符串拼接。。。这些和verfiy_callback有什么直接关系么??


最后在说一下

"谁如果觉得我这段代码晦涩只能说明他自己 php 水平不过关 ..."

楼主是在玩代码混乱大赛么。。代码除了运行外,更重要也是读的,据说统计结果是90%的时间是在读代码,不知道楼主写这段代码的时候反复读了多少次,想了多少道,纠结了多久代码要怎么改,不过我想既然发出来问,就意味着知道里面肯定有问题
jedihy
2014-11-29 22:01:29 +08:00
@evlos 效率会有变化?
xuwenmang
2014-11-29 22:04:22 +08:00
没看懂。。。
aveline
2014-11-29 22:28:05 +08:00
大脑内置三元操作符的鸭子你好 ...
kankana
2014-11-29 22:28:32 +08:00
@Sunyanzi 哈哈,还真是各有各的怪癖

你"不能接受一个方法在全局中只被另外的一个地方调用"

我是不能接受太长的一行和方法 :)
xing393939
2014-11-29 22:32:16 +08:00
个人觉得现在的开发可以轻性能,重维护和关注业务层。有想提升性能的想法不如多考虑大体方案上的改进以及分布式和可扩展性。
miniwade514
2014-11-29 22:33:03 +08:00
看来也是觉得三目运算符用多了的人比较多。。

我个人写代码的时候也喜欢(习惯)把“当时”感觉简单的逻辑用三目运算符写,但是需要回头改的时候还是得打散、理顺,从维护角度来看没有省事儿。在团队里写代码的时候基本上不用三目运算符了,用的话也会避免较复杂的操作,只做一些简单的数值处理。

而且我觉得即使 if 后面只有一个 return 的操作,也应该写 {},换行。因为谁知道什么时候又不止 return 一个操作了呢?多写一对 {} 占不了多少时间,所以还是看个人习惯的~

一点个人想法 :)
shiny
2014-11-29 22:36:41 +08:00
写 php 的时间越是久,越是觉得大智若愚,大巧若拙。
nine
2014-11-29 22:50:44 +08:00
三元不要嵌套啊!
其实嵌套也可以啊!但你里面的拼接那么长的字符串是要闹哪样啊!
放到外面声明一个变量啊!字符串拼接一定要用 "{$foo} foo bar {#bar}"的方式啊!不然怎么读啊!
三元的层次要分好啊!怎么能允许2个“:”在同一行啊!
其实三元嵌套放在一行也可以的啊,你要把那一坨字符串声明成变量啊,其实就是你拼接字符串的问题啊,你这么拼怎么读啊!,剩下的三元嵌套即使放到一行里面也没人说你啊!

为什么看起来像一坨?其实完全就是你拼接字符串搞得鬼啊!
受不鸟了啊!啊!啊!啊!啊!
十万个冷笑话吐槽星人放元槽弹了啊!

最后一行改成这样舒服多了
nine
2014-11-29 22:53:03 +08:00
不好意思,拼接字符串符号习惯写成 + 了
kmvan
2014-11-29 22:58:27 +08:00
@GTim 如果不上缓存,多一个文件就要多一次io.
加个缓存就完事的事情。


@Sunyanzi 在没有额外缓存的情况下 ... 文件加载吃 io ... 类声明吃内存 ...
为了省内存而把逻辑弄得一团糟,除了自己,团队其他人都看不懂,那有啥意义。
RemRain
2014-11-29 23:00:46 +08:00
```在没有额外缓存的情况下 ... 文件加载吃 io ... 类声明吃内存 ...```
线上都得开 APC 或者 opcache 跑吧,我以前也担心过这个问题,后来发现随意加一个 Guzzle、monolog 之类的 lib 进来,立马多上百个文件,就再也不操作 class 多的问题了。

大多数人的阅读习惯都是从上而下的,如果既要从上而下,又要从左到右的读,就很累了。三目运算是个好东西,问题是广大人民往往会在其中塞入很多很多东西,导致不堪入目,还是少用的好。

另外
```
$param = http_build_query($parameter);
$param = urldecode($param);
$paramMd5 = md5($param);
```
才是断行,往一行代码中插入换行真的不能算断行~

话说,每行代码,包括定义变量、ksort 数组都加上注释,真的有必要么
xylophone21
2014-11-29 23:03:11 +08:00
没有人觉得函数前的注释全是废话吗?
看起来貌似有文档,可提供的信息基本上为0.
PP
2014-11-29 23:08:48 +08:00
如何编写无法维护的代码 http://blog.jobbole.com/80241/
mcfog
2014-11-29 23:09:18 +08:00
开发何苦为难开发……
Cofyc
2014-11-29 23:14:28 +08:00
pubby
2014-11-29 23:24:38 +08:00
读起来好费脑细胞


@xing393939 赞同,这个场景没必要死磕性能,不是天猫双十一 而且跑PHP的谁不用些opcache呢
jianghu52
2014-11-29 23:26:40 +08:00
第一个三元我读了两遍终于能确定楼主的意思。
第二个三元我读了4遍,才敢说能猜到楼主的意思。
php代码写了500行左右的菜鸟的感觉。
123123
2014-11-29 23:29:10 +08:00
除了最后的 return,感觉还好
nooper
2014-11-29 23:30:37 +08:00
php 代码还写了一坨。。。。

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

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

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

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

© 2021 V2EX