2009-04-17

利用 switch 該善程式碼的閱讀性

一個簡單的網頁 Script 架構,不外乎一個進入點及一個輸出點,由上到下一個很單純的流程。

在資料驗證上也是一個接一個,但卻數量多的時候,卻會讓整體流程看起來很複雜,很不直覺。

一個基本 switch 的撰寫方法,用在代替有結構的 IF 時還蠻放便的。

<?php
switch ($_GET['type']) {
// 當 $_GET['type']=="apple" 時進入程式片段
case "apple":
//程式片段...
break;

// 當 $_GET['type']=="bar" 時進入程式片段
case "bar":
//程式片段...
break;

// 當以上都不符合,預設進入程式片段
default :
//程式片段...
break;
}
?>


這個例子,將判斷式移到 case 上,讓原本的 switch 更加彈性,但這不是主要目的,在 switch 裡主要的好處是可以利用 break 跳出流程,這樣的用法跟 function 很像,利用跳出的方式結束剩下的程序,在區塊中檢查到錯誤的數入參數時,直接丟出訊息並讓輸出程序去處理顯示的問題。

<?php
switch (true){
case ($_GET['type']=='view'):
//其他判斷或動作...
break;

case ($_GET['action']=='delete'):
//其他判斷或動作...
break;

case ($_GET['action']=='add'):
//標題檢查
$title=trim($_GET['title']);/*去除頭尾空白*/
$title=htmlspecialchars($title,ENT_QUOTES);/*HTML 跳脫*/
$title=mb_substr($title, 0, 100);/*100字剪裁*/
if(!$title){ //利用 if 判斷,錯誤則跳出 switch
// 列出錯誤訊息
break;
}

//訊息檢查
$msg=trim($_GET['msg']);/*去除頭尾空白*/
$msg=htmlspecialchars($msg,ENT_QUOTES);/*HTML 跳脫*/
$msg=mb_substr($msg, 0, 1000);/*1000字剪裁*/
if(!$msg)){ //利用 if 判斷,錯誤則跳出 switch
// 列出錯誤訊息
break;
}

//其他判斷或動作...
break;

default :
// 列出錯誤訊息
break;
}
?>


再看看如果用 IF 去處理輸入驗證時,必須將所有資料先做處理,後面再一個一個去判斷,在閱讀上很不直覺,如果中間有大量的輸入參數要處理時,會讓人找很久。

<?php
if($_GET['type']=='view'){
//其他判斷或動作...

}elseif($_GET['action']=='delete'){
//其他判斷或動作...

}elseif($_GET['action']=='add'){
//標題檢查
$title=trim($_GET['title']);/*去除頭尾空白*/
$title=htmlspecialchars($title,ENT_QUOTES);/*HTML 跳脫*/
$title = mb_substr($title, 0, 100);/*100字剪裁*/

//訊息檢查
$msg=trim($_GET['msg']);/*去除頭尾空白*/
$msg=htmlspecialchars($msg,ENT_QUOTES);/*HTML 跳脫*/
$msg = mb_substr($msg, 0, 1000);/*1000字剪裁*/

if(!$title){
// 列出錯誤訊息
}elseif(!$msg){
// 列出錯誤訊息
}else{
//其他判斷或動作...
}

break;
}else{
// 列出錯誤訊息
}
?>


參考來源:
PHP: switch - Manual

0 回應: