說說Shell在代碼重構中的應用_PHP教程

來源:互聯網
上載者:User
代碼重構(Code refactoring)有時是很枯燥的,字串替換之類的操作不僅乏味,而且還容易出錯,好在有一些工具可用,以PHP為例,如:Rephactor,Scisr等等,不過現成的工具往往意味著不夠靈活,所以今天我要說說Shell在代碼重構中的應用。

先來個簡單的,假設我們要把PHP檔案中的foo_bar全都替換成fooBar,那麼可以如下:

方法一,使用Sed:

shell> find /path -name "*.php" | xargs sed s/foo_bar/fooBar/g


方法二,使用AWK:

shell> find /path -name "*.php" | xargs awk { gsub(/foo_bar/, "fooBar"); print; }


註:為了簡單,我把結果直接列印到終端螢幕了,至於如何儲存,稍後會說明。

接著說個複雜的:假設某個PHP項目,以前使用類之前必須調用一個名為“includeClass”的方法,現在改用類自動載入的方式,所以要刪除硬式編碼includeClass調用,出於美觀的考慮,如果includeClass下面一行是空行的話,也一起刪除,同時考慮大小寫不敏感的因素。

重構前的程式碼範例:

01 02 includeClass(...);
03 echo a;
04
05 echo b;
06 includeClass(...);
07 includeClass(...);
08
09
10 echo c;
11
12 echo d;
13 includeClass(...);
14
15
16 echo e;
17 ?>


重構後的程式碼範例:

01 02 echo a;
03
04 echo b;
05
06 echo c;
07
08 echo d;
09
10 echo e;
11 ?>


在動手前,我們需要先摸摸底,瞭解一下大概的情況:

shell> grep -I -ri includeClass /path | more


其中,grep命令的參數乍一看不好記,不過只要按照我說的方法記,就永遠不會忘:前面的參數看做英文,後面的參數看做拼音。至於參數的具體含義,請參閱man文檔。

方法一,使用Sed編寫指令碼script.sh:

#!/bin/sh

for PHP in $@; do
/bin/sed -i
/includeClass/I {
h
d
}

/^$/ {
x
/includeClass/Id
x
}

h
$PHP
done


註:篇幅所限,我把正則寫的比較簡單

Sed的缺點是代碼可讀性比較差,優點是代碼較短。另外內建的“-i”選項可以直接完成儲存,這是我喜歡Sed的原因之一。

方法二,使用AWK編寫指令碼script.sh:

#!/bin/sh

for PHP in $@; do
TMP=$(mktemp)

/bin/awk
BEGIN {
IGNORECASE = 1
}

/includeClass/ {
previous = $0
next
}

/^$/ {
if (previous ~ /includeClass/) {
previous = $0
next
}
}

{
previous = $0
print
}
$PHP > $TMP

/bin/cp -f $TMP $PHP
/bin/rm -f $TMP
done


註:篇幅所限,我把正則寫的比較簡單

AWK的缺點是代碼比較長,優點是代碼可讀性較好。另外程式中是通過產生一個唯一的臨時檔案來完成儲存的。

提醒:直接覆蓋原始檔案有時候並不合適,畢竟可能有沒考慮周詳的地方,使用SVN的話就不會有這樣的顧慮了,因為即便覆蓋了原始檔案,也可以在提交前通過“svn diff”命令來檢查對錯,就算是提交了,也可以恢複到以前的版本。

如果調用script.sh指令碼呢?這裡給個最一般的例子:

shell> find /path -name "*.php" | xargs /path/to/script.sh


簡單的任務用Sed寫很合適,複雜的任務則最好用AWK寫,實戰是學習的最好方法,具體可以參考Sed One Line和AWK One Line等資料。

說明:本文用到的Sed和AWK均指GNU版本。

http://www.bkjia.com/PHPjc/478849.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478849.htmlTechArticle代碼重構(Code refactoring)有時是很枯燥的,字串替換之類的操作不僅乏味,而且還容易出錯,好在有一些工具可用,以PHP為例,如:Re...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.