2016-09-23 25 views
2

我是一名Web開發人員,我在PHP/Laravel框架中編寫代碼。我一直在遵循編寫代碼的最佳實踐,並且我知道在函數中編寫15-20行代碼並在類中編寫最多200行代碼是一種很好的做法。但是每次我最終都會在函數中寫出最少40-50行。例如在這裏我寫的代碼片段來獲取客戶端和指定用戶的詳細信息。如何減少PHP中的代碼行數?

public function preMessageSend($client, $assigned) 
{ 
    $ticket_number = $client->ticket_number; 
    $title = $client->title; 
    $department = $client->department; 
    $priority = $client->priority; 
    if ($client->first_name !== null || $client->first_name !== '') { 
     $client_name = $client->first_name." ".$client->last_name; 
    } else { 
     $client_name = $client->username; 
    } 
    if ($client->email !== '' || $client->email !== null) { 
     $client_email = $client->email; 
    } else { 
     $client->email = 'Not available'; 
    } 
    if($client->mobile !== null || $client->mobile !== '') { 
     $client_mobile = $client->code."".$client->mobile; 
    } else { 
     $client_mobile = 'Not available'; 
    } 
    if($assigned != null) { 
     if ($assigned->first_name !== null || $assigned->first_name !== '') { 
      $assigned_name = $assigned->first_name." ".$assigned->last_name; 
     } else { 
      $assigned_name = $assigned->username; 
     } 
     if ($assigned->email !== '' || $assigned->email !== null) { 
      $assigned_email = $assigned->email; 
     } else { 
      $assigned->email = 'Not available'; 
     } 
     if($assigned->mobile !== null || $assigned->mobile !== '') { 
      $assigned_mobile = $assigned->code."".$assigned->mobile; 
     } else { 
      $assigned_mobile = 'Not available'; 
     } 
     if ($assigned->address !== null || $assigned->address !== '') { 
      $assigned_address = $assigned->address; 
     } else { 
      $assigned_address = 'Not available'; 
     } 
     $this->sendMessageWithAssigned($ticket_number, $title, $department, $priority, $client_name, $client_email, $client_mobile, $assigned_name, $assigned_email, $assigned_mobile, $assigned_address); 
    } else { 
     $this->sendMessageWithoutAssigned($ticket_number, $title, $department, $priority, $client_name, $client_email, $client_mobile); 
    } 

請告訴我如何減少我的類和函數中的loc,以及避免編寫如此長的函數的最佳做法是什麼。 TIA

+1

第一個問題:爲什麼您需要將所有這些客戶端對象屬性分配給本地作用域變量? –

+0

我認爲你可以做一個空的檢查,而不是所有那些'不爲空的字符串' – danopz

+0

你可以將你的大部分條件改寫成三元運算符一行'$ client_mobile =($ client-> mobile!== null || $ client-> mobile!=='')? $ client-> code。「」。$ client-> mobile:'Not available';' –

回答

0

而不是

if ($client->first_name !== null || $client->first_name !== '') { 
    $client_name = $client->first_name." ".$client->last_name; 
} else { 
    $client_name = $client->username; 
} 

你可以這樣做:

$client_name = ($client->first_name !== null || $client->first_name !== '') ? $client->first_name." ".$client->last_name : $client->username; 
0

首先,null''trueempty(),所以你可以這樣做:

if (!empty($client->first_name)) { // if not empty 
    $client_name = $client->first_name." ".$client->last_name; 
} else { 
    $client_name = $client->username; 
} 

然後你也可以用t他三元運算符:

$client_name = !empty($client->first_name) ? $client->first_name." ".$client->last_name : $client->username; 

那麼對於一些語句裏面還有or聲明可供選擇:

$client_email  = $client->email or 'Not available'; 
$client_mobile = $client->code . $client->mobile or 'Not available'; 
$assigned_address = $assigned->address or 'Not available'; 

這些or聲明等於:

if(!empty($assigned->address)){ 
    $assigned_address = $assigned->address; 
} else { 
    $assigned_address = 'Not available'; 
} 

// Or the equivalent ternary 
$assigned_address = !empty($assigned->address) ? $assigned->address : 'Not available'; 

而且我的意思是「一些」是:

$client->first_name = null; 
$client->last_name = null; 
echo empty($client->first_name." ".$client->last_name); // false 
echo isset($client->first_name." ".$client->last_name); // true 

不是空的,即使兩個變量爲空,由於" "空間這將使其isset()

現在要小心那些或語句,因爲!empty()並不總是給出相反的結果isset()哪裏isset([])是正確的,而empty([])也是如此。

0

正如其他人已經建議,您可以使用empty()而不是!= null!= ''檢查。此外,您可以通過默認忽略了大多數報表else部分,例如:

$assigned_name = $assigned->username; 
if (!empty($assigned->first_name)) { 
    $assigned_name = $assigned->first_name." ".$assigned->last_name; 
} 

這臺$assigned_name到你以前else值,如果條件滿足$assigned_name被覆蓋。我不推薦使用三元運算符,因爲它不是可讀的IMO。

只要代碼可讀且高效,我不會過多地關心代碼行。