# 轮子多的原因
现实里程序员世界的代码或者项目轮子特别多。产生这个现象的原因是什么呢?
- 非我发明症(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之类的。
- 序
- 前言
- 内容简介
- 目录
- 基础知识
- 起步
- 控制器
- 模型
- 模板
- 命名空间
- 进阶知识
- 路由
- 配置
- 缓存
- 权限
- 扩展
- 国际化
- 安全
- 单元测试
- 拿来主义
- 调试方法
- 调试的步骤
- 调试工具
- 显示trace信息
- 开启调试和关闭调试的区别
- netbeans+xdebug
- Socketlog
- PHP常见错误
- 小黄鸭调试法,每个程序员都要知道的
- 应用场景
- 第三方登录
- 图片处理
- 博客
- SAE
- REST实践
- Cli
- ajax分页
- barcode条形码
- excel
- 发邮件
- 汉字转全拼和首字母,支持带声调
- 中文分词
- 浏览器useragent解析
- freelog项目实战
- 需求分析
- 数据库设计
- 编码实践
- 前端实现
- rest接口
- 文章发布
- 文件上传
- 视频播放
- 音乐播放
- 图片幻灯片展示
- 注册和登录
- 个人资料更新
- 第三方登录的使用
- 后台
- 微信的开发
- 首页及个人主页
- 列表
- 归档
- 搜索
- 分页
- 总结经验
- 自我提升
- 进行小项目的锻炼
- 对现有轮子的重构和移植
- 写技术博客
- 制作视频教程
- 学习PHP的知识和新特性
- 和同行直接沟通、交流
- 学好英语,走向国际
- 如何参与
- 浏览官网和极思维还有看云
- 回答ThinkPHP新手的问题
- 尝试发现ThinkPHP的bug,告诉官方人员或者push request
- 开发能提高效率的ThinkPHP工具
- 尝试翻译官方文档
- 帮新手入门
- 创造基于ThinkPHP的产品,进行连带推广
- 展望未来
- OneThink
- ThinkPHP4
- 附录