1. 云栖社区>
  2. PHP教程>
  3. 正文

聊聊代码的割裂感

作者:用户 来源:互联网 时间:2017-12-01 10:29:32

代码

聊聊代码的割裂感 - 摘要: 本文讲的是聊聊代码的割裂感, 早些年,我特别喜欢下围棋,每天都会下几盘。那时候日本围棋不仅高手林立,而且风格迥异,比如:小林光一的地铁流,武宫正树的宇宙流等等,不过我最喜欢的棋手当属大竹英雄,他下棋时追求美感,如果棋形不漂亮,那么他宁可认输也绝不玷污棋盘。后来,我成为

早些年,我特别喜欢下围棋,每天都会下几盘。那时候日本围棋不仅高手林立,而且风格迥异,比如:小林光一的地铁流,武宫正树的宇宙流等等,不过我最喜欢的棋手当属大竹英雄,他下棋时追求美感,如果棋形不漂亮,那么他宁可认输也绝不玷污棋盘。后来,我成为了一名程序员,每天都要写不少代码,可惜写了不少丑陋的代码,本文筛选了几个例子,希望大家看过之后都能写出更漂亮的代码来。

在聊之前,我们不妨想想割裂到底是什么意思。其实所谓割裂,说白了就是指把原本应该在一起的东西分开了,比如两地分居的夫妻,亦或者留守儿童和父母。

普通的语言描述总是苍白无力的,让我们看看有割裂感的代码到底长啥样:

<?php$i = 0;while ($i <= 10) { echo $i; $i++;}?>

代码似乎很常见,如果你没有意识到割裂感的存在,请看看下面的改进版:

<?phpfor ($i = 0; $i <= 10; $i++) { echo $i;}?>

怎么样。理解了吧。在我们的努力下,变量「i」的三口之家终于团聚了。当然,这只是命令式语言的写法,如果你想更酷一点,还可以用函数式语言的写法:

<?phparray_map(function($i) { echo $i; }, range(0, 10));?>

接着看另一个例子,如果想统计程序的运行时间,那么最简单的方法无疑是开头记录一下起始时间,最后记录一下结束时间,然后相减,就好像下面这样:

<?php// head$begin = microtime(true);// mocksleep(1);// foot$end = microtime(true);echo $end - $begin;?>

可惜如此一来前后时间相关代码无疑就两地分居了,想想看如何让它们团聚:

<?php$begin = microtime(true);register_shutdown_function(function() use($begin) {$end = microtime(true);echo $end - $begin;});sleep(1);?>

最后再看一个例子,很多项目都会搞一个类统一存放错误码,如果业务出错了就返回相应的错误码,然后抛出相应的异常信息,大致代码如下所示:

<?phpclass Result{const ERROR_USERNAME = 1;const ERROR_PASSWORD = 2;public static $msg = array(1 => '用户名错误',2 => '密码错误',);}?>

可惜,错误码和错误信息割裂了。如此说来,改成数组怎么样:

<?phpclass Result{public static $msg = array('ERROR_USERNAME' => '用户名错误','ERROR_PASSWORD' => '密码错误',);}?>

看上去错误码和错误信息团聚了,不过放弃了 const,就意味着享受不到 const 带来的好处,比如工具提示,错误检查。其实 const 可以赋值数组:

<?phpclass Result{ const ERROR_USERNAME = array(1, '用户名错误'); const ERROR_PASSWORD = array(2, '密码错误');}?>

两地分居的代码终于又团聚了。至于如何处理抛出异常之类的代码逻辑我省略了。

结尾顺便说一句,搞一个类单独存放错误码是否可取存争议,通常我们认为这样的类是哑巴类,相对应的,错误码应该分散到它原本所属的业务对象之中去。不过这个问题和本文的主题关系不大,说起来就没完没了了,索性以后有空再聊。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索代码 ,以便于您获取更多的相关知识。