🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 轮子多的原因 现实里程序员世界的代码或者项目轮子特别多。产生这个现象的原因是什么呢? - 非我发明症(Not Invent Here),指不信任、不使用非自己发明的技术 - 新手练习项目 - 技术选型时没有参考类似自己需求的项目,就开始写了 - 没找到合适方案,自主创新 # 为什么我们要重构和移植轮子 > 他山之石可以攻玉 我们需要轮子,但是不能完全依赖于别人的轮子。 软件行业有个现象,复制、拷贝代码,滥用开源项目特别多。 有的人喜欢拿来主义,这个功能别人实现过了,有现成轮子,我要挑选足够多的轮子。 我并不反对借用别人的轮子,有的时候还是有必要的,毕竟可以给大家节省大量宝贵的时间,不是吗? 但是,开源软件的思想是社区运营一个软件,使得一个软件可以获得“永生”。 我们经常会听说某个著名程序员,XXX之父去世的噩耗。然后各种怀念。世界上不会有第二个乔布斯。我们后人能做的,就是传承他们的经典思想。 只是简单的拷贝代码,是初级程序员会做的。 他们并没有领会那个轮子里所要表达,或者用到的令人惊叹的技巧。他们没对这份代码做出任何巨大的贡献,只是提供了一份备份,一个应用。 重要的话说三遍: 程序员是用抽象方法解决实际问题的! 程序员是用抽象方法解决实际问题的! 程序员是用抽象方法解决实际问题的! 虽然程序员经常被有限的时间和产品经理的各种需求所限制,但是好的程序员往往会制造出一个能满足当前需要的轮子,来解决实际问题。 有的时候我们称之为模式、模型。 当然,所有程序员并不是一开始就能产生经典,但是,人都是会进步的,代码也一样。 这就得益于程序员在遇到类似问题时的“不要重复自己(Dont repeat yourself)”原则、和有时间适当的优化,对自己工艺作品的不断打磨、重构。 重构,是你的问题更明确、逻辑更清晰、代码更合理简洁。 至于移植,程序员往往开始解决问题时,局限于当时的语言环境,没有像《Linux/Unix设计思想》里“舍高效率而取可移植性”原则去写代码。也受限于当时的眼光,没有前瞻性。所作出的设计就有局限性。 所以很长一段时间,写.net的只能试用windows,写ios的只能使用mac,写shell脚本的只能做Linux运维。 然后,事情就变的很复杂,大公司为了市场占有率只能 3方人才全招。 当我们想让老设备上的代码,运行在新机器上,就要移植; 当我们想让win下通用程序运行在linux上,给用户一致的体验,就要移植。 想想当一个NES模拟器诞生后,先是pc后来到psp,再到电视盒子、智能手机上。 这都要经过程序员努力的移植。 # 重构的例子 在我到新公司里用lazyphp时,查询都是用原生sql去查询。比如:“get_line("SELECT `uid`,`tel` FROM `jduser` WHERE `email`='".s($email)."' AND `type` = 'recruiter'")” 这样的,然后有时候会用到in 查询,就需要 把 一个数组里的值转换为 逗号分割的字符串, 给IN 关键词来进行查询,于是写了这个build_in 函数。 ~~~ /** * 数组拼in 返回 */ function build_in($arr){ $ret = array(); foreach ($arr as $key => $value) { $ret[] = "'{$value}'"; } if($ret){ return implode(', ', $ret); }else{ return ''; } } ~~~ 后来发现 需要返回 1,2,3 这种给纯数字的IN 而不是 '1','2','3' 所以需要修改 同时支持 返回数字和字符串的拼接。 ~~~ /** * 数组拼in 返回 */ function build_in($arr, $pureNum = false){ $ret = array(); if($pureNum){ $values = array_values($arr); return implode(',', $values); } foreach ($arr as $key => $value) { $ret[] = "'{$value}'"; } if($ret){ return implode(', ', $ret); }else{ return ''; } } ~~~ 加了一个默认为false的 纯数字标识位参数 $pureNum。 后来发现,有的时候数组传过来是空数组,改了让空字数组直接返回空。 ~~~ /** * 数组拼in 返回 */ function build_in($arr, $pureNum = false){ $ret = array(); if($pureNum){ $values = array_values($arr); return empty($values)? '' : implode(',', $values); } foreach ($arr as $key => $value) { $ret[] = "'{$value}'"; } if($ret){ return implode(', ', $ret); }else{ return ''; } } ~~~ 后来发现多此一举,空$arr, if($pureNum) 里面的$values 也是空,就改回去 ~~~ /** * 数组拼in 返回 */ function build_in($arr, $pureNum = false){ $ret = array(); if($pureNum){ $values = array_values($arr); return implode(',', $values); } foreach ($arr as $key => $value) { $ret[] = "'{$value}'"; } if($ret){ return implode(', ', $ret); }else{ return ''; } } ~~~ 最后,为了缩减生成的sql,纯数字的,我强制转换后拼接。 ~~~ /** * 数组拼in 返回 */ function build_in($arr, $pureNum = false){ $ret = array(); foreach ($arr as $key => $value) { if($pureNum) { $ret[] = intval($value); } else { $ret[] = "'".s($value)."'"; } } if($ret){ return implode(', ', $ret); }else{ return ''; } } ~~~ 拼接和字符串值的处理一样了。 # 移植的例子 我第一个用的php框架是symfony,看到它的调试工具, ![2015-08-07/55c4776ab2d0d](http://box.kancloud.cn/2015-08-07_55c4776ab2d0d.png) ![2015-08-07/55c477782e3cc](http://box.kancloud.cn/2015-08-07_55c477782e3cc.png) 我就参照功能,移植了一个简单的版本 [ThinkPHP3.0正式版自定义工具条](http://www.thinkphp.cn/extend/100.html): ![2015-08-07/55c477960b62c](http://box.kancloud.cn/2015-08-07_55c477960b62c.png) 这后来才有了后来3.1版的 ![2015-08-07/55c478c5cb688](http://box.kancloud.cn/2015-08-07_55c478c5cb688.png) ![2015-08-08/55c5a2a0a14c5](http://box.kancloud.cn/2015-08-08_55c5a2a0a14c5.png) ![2015-08-08/55c5a2b1a0d0a](http://box.kancloud.cn/2015-08-08_55c5a2b1a0d0a.png) 别人有的,我们参考了,移植过来。借鉴思想也是可以的嘛。好东西为什么我们不能用。比如以后的composer之类的。