重構那些事(一)

轉后端學習PHP一個多月了,發現我們的后端代碼問題很多,可維護性很差,對于新手入門和開發很不友好,所以想提一下改進這些問題的思路,與大家一起探討一下,好,那就一起看看有哪些問題及改進方法吧:)

1.請使用語法糖(即中括號形式)來創建數組

PHP 5.4之后已經可以使用中括號的形式來創建數組了,我們的線上環境剛好是5.4的,所以完全可以大大方方的使用中括號即如下形式來創建數組

$arr = [1, 2, 3];

不建議使用array(1, 2, 3)的形式來創建數組,原因嘛,更簡潔!用array()的形式有點啰嗦,就像OC中原來創建數組是如下形式


NSArray *arr = [[NSArray alloc] initWithObjects:@"1", @"2", nil];

變成語法糖之后改用了如下方式


NSArray *arr = @[@"1", @"2", @"3"];

是不是清爽了很多,既然在新版本中引入了這種中括號的形式來創建數組,說明PHP是更建議使用這種格式來初始化數組的,何不與時俱進,一起改造成用中括號的形式來初始化數組呢?

那么問題來了,現有的成千上萬個array()這種形式創建數組的方式怎么辦,兩種辦法

  • 用正則表達式全局替換

這種方式最簡單,一勞永逸

  • 只在新業務或重構中使用語法糖的形式

可能你會擔心這種批量替換會出什么問題(實際上當初我在用正則做iOS中語法糖批量替換時也出了一些問題),那我們可以在新業務或重構代碼時把它給替換掉,這是最安全的方式

2.if else 套嵌過深

有很多以下形式的if else


if (condition) {

if (condition) {

} else {

if (condition) {

}

}

}

嵌套過深,不僅造成代碼難以維護,更讓新人難以理解其中的邏輯,絕對是大忌,那么,怎么改進呢,黃金道路法則,如下


if (condition1) return;

if (condition2) return;

//logic

讓一些不合理的或不想要if邏輯提前終止!

怎么樣,是不是清楚了很多

3.if else 太多,應該用switch!

我們的代碼中經常出現以下代碼片斷


$test = 1;

if ($test == 1) {

} else if ($test == 2) {

} else if ($test == 3 || $test == 4) {

}

類似這種方式用switch不是非常簡潔明了嗎,和一些同學聊過這個話題,其他他們也意識到這個問題了

但覺得將if else改成switch可能會不小心忘了break之類的關鍵字,擔心改出bug出來,或者是業務太忙,沒時間重構,對此我是這么看的,一個優秀的程序員應該要有一些代碼潔癖,要有在寫業務時順便或者說之后重構代碼的意識,這樣不僅會給其他小伙伴留下非常良好的專業的印象,而且也方便之后的維護,套用iOS大拿喵神的話來說:"一個有節操的程序員會在乎自己的代碼的不合理性,就像在乎飯碗邊上有只死蟑螂那樣",能用是不夠的,可維護,可拓展才是最重要的

4.變量應該定義在離他最近被使用的位置

這個問題其實我自己也犯過這樣的錯誤,比如將它定義在第10行,但實際使用這個變量卻是在第50行,這樣造成的后果就是要熟悉邏輯的同學不得不帶著這個變量從第10行追蹤到50行,累不累啊!

5.方法的參數過多

先來看一段我們商詳的一段比較惡心的代碼

private function get_detail($detail, $is_oversea = FALSE, $ship_city = '', $origin_price = 0, $price = 0, $presell = NULL, $is_talent_mall = FALSE, $iid = 0, $mart_mall_presell_info = FALSE, $cid = 0, $need_warrant = TRUE, $last_img_url = '') 

參數多到令人發指!并且沒有注釋!而且調用此方法的方法有接近1900行!如果現在去重構,還是有點麻煩,如果當初在方法的參數多于3,4個的時候我們想辦法去用一種更合理的方式把它重構掉,就不會是現在這種情況了,所以說人人都要有及時重構的意識!好了,現在既然問題出現了,我們總要解決它,如何解決這種參數過多的問題, 我認為可以用設計模式中的委托模式,大概流程如下

dispatcher
dispatcher

代碼大致如下


//get_detail所在類

private get_detail($businessDelegate) {

    namespace DesignPatterns\More\Dispatcher;

    // 初始化 dispacher 并委托具體的業務邏輯調用方

    $dispatcher = new Dispatcher($businessDelegate);

  // dispatcher 將編寫代碼的任務委托給 businessDelegate

    echo $dispatcher->dealWithBusiness();

}

//Dispatcher.php

class Dispatcher

{

    protected $businessDelegate;

    public function __construct(?$businessDelegate) {

      $this->businessDelegate = ?$businessDelegate;

    }

    private function dealWithBusiness() {

      $this->businessDelegate->dealWithBusiness();

  }

}

//BusinessDelegate

class BusinessDelegate

{
    private function dealWithBusiness() {
      //do something
    }

}

微信公眾號

?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,723評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,492評論 0 17
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,825評論 18 139
  • 2016.12.10 今天有點懶 結束了一周的工作,今天周六宅在家的我,就出去送了一...
    以愚辭歌閱讀 302評論 0 0
  • 對于我這種不喜歡在人前說話的來說,在虛擬的世界里也許說得會多一點,但是同學群我總是很少發言,其實也不是怕說錯什么,...
    逸媽媽閱讀 380評論 0 0