2016-09-23 58 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。

只要代码可读且高效,我不会过多地关心代码行。