轉后端學習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個的時候我們想辦法去用一種更合理的方式把它重構掉,就不會是現在這種情況了,所以說人人都要有及時重構的意識!好了,現在既然問題出現了,我們總要解決它,如何解決這種參數過多的問題, 我認為可以用設計模式中的委托模式,大概流程如下

代碼大致如下
//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
}
}
微信公眾號
?