2009-04-17 20:10

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

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

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

一個基本 switch 的撰寫方法,用在代替有結構的 IF 時還蠻放便的。
  1. <?php 
  2. switch ($_GET['type']) { 
  3.  // 當 $_GET['type']=="apple" 時進入程式片段  
  4.  case "apple":  
  5.    //程式片段... 
  6.    break; 
  7.  
  8.  // 當 $_GET['type']=="bar" 時進入程式片段  
  9.  case "bar": 
  10.    //程式片段... 
  11.    break; 
  12.  
  13.  // 當以上都不符合,預設進入程式片段  
  14.  default : 
  15.    //程式片段... 
  16.    break; 
  17. } 
  18. ?> 


這個例子,將判斷式移到 case 上,讓原本的 switch 更加彈性,但這不是主要目的,在 switch 裡主要的好處是可以利用 break 跳出流程,這樣的用法跟 function 很像,利用跳出的方式結束剩下的程序,在區塊中檢查到錯誤的數入參數時,直接丟出訊息並讓輸出程序去處理顯示的問題。
  1. <?php 
  2. switch (true){ 
  3.  case ($_GET['type']=='view'): 
  4.    //其他判斷或動作... 
  5.    break; 
  6.  
  7.  case ($_GET['action']=='delete'): 
  8.    //其他判斷或動作... 
  9.    break; 
  10.  
  11.  case ($_GET['action']=='add'): 
  12.    //標題檢查 
  13.    $title=trim($_GET['title']);/*去除頭尾空白*/ 
  14.    $title=htmlspecialchars($title,ENT_QUOTES);/*HTML 跳脫*/ 
  15.    $title=mb_substr($title, 0, 100);/*100字剪裁*/ 
  16.    if(!$title){ //利用 if 判斷,錯誤則跳出 switch 
  17.        // 列出錯誤訊息 
  18.        break; 
  19.    } 
  20.  
  21.    //訊息檢查 
  22.    $msg=trim($_GET['msg']);/*去除頭尾空白*/ 
  23.    $msg=htmlspecialchars($msg,ENT_QUOTES);/*HTML 跳脫*/ 
  24.    $msg=mb_substr($msg, 0, 1000);/*1000字剪裁*/ 
  25.    if(!$msg)){ //利用 if 判斷,錯誤則跳出 switch 
  26.        // 列出錯誤訊息 
  27.        break; 
  28.    } 
  29.  
  30.    //其他判斷或動作... 
  31.    break; 
  32.  
  33.  default : 
  34.    // 列出錯誤訊息 
  35.    break; 
  36. }  
  37. ?> 


再看看如果用 IF 去處理輸入驗證時,必須將所有資料先做處理,後面再一個一個去判斷,在閱讀上很不直覺,如果中間有大量的輸入參數要處理時,會讓人找很久。
  1. <?php 
  2. if($_GET['type']=='view'){ 
  3.    //其他判斷或動作... 
  4.  
  5. }elseif($_GET['action']=='delete'){ 
  6.    //其他判斷或動作... 
  7.  
  8. }elseif($_GET['action']=='add'){ 
  9.    //標題檢查 
  10.    $title=trim($_GET['title']);/*去除頭尾空白*/ 
  11.    $title=htmlspecialchars($title,ENT_QUOTES);/*HTML 跳脫*/ 
  12.    $title = mb_substr($title, 0, 100);/*100字剪裁*/ 
  13.  
  14.    //訊息檢查 
  15.    $msg=trim($_GET['msg']);/*去除頭尾空白*/ 
  16.    $msg=htmlspecialchars($msg,ENT_QUOTES);/*HTML 跳脫*/ 
  17.    $msg = mb_substr($msg, 0, 1000);/*1000字剪裁*/ 
  18.  
  19.    if(!$title){ 
  20.        // 列出錯誤訊息 
  21.    }elseif(!$msg){ 
  22.        // 列出錯誤訊息 
  23.    }else{ 
  24.        //其他判斷或動作... 
  25.    } 
  26.  
  27.    break; 
  28. }else{ 
  29.    // 列出錯誤訊息 
  30. } 
  31. ?> 


參考來源:
PHP: switch - Manual

0 回應: