# 輪子多的原因
現實里程序員世界的代碼或者項目輪子特別多。產生這個現象的原因是什么呢?
- 非我發明癥(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,看到它的調試工具,


我就參照功能,移植了一個簡單的版本 [ThinkPHP3.0正式版自定義工具條](http://www.thinkphp.cn/extend/100.html):

這后來才有了后來3.1版的



別人有的,我們參考了,移植過來。借鑒思想也是可以的嘛。好東西為什么我們不能用。比如以后的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
- 附錄