ホームページ  >  記事  >  バックエンド開発  >  コードリファクタリング_PHPチュートリアルでのシェルのアプリケーションについて話す

コードリファクタリング_PHPチュートリアルでのシェルのアプリケーションについて話す

WBOY
WBOYオリジナル
2016-07-13 17:43:211092ブラウズ

代码重构(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> /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.comtru​​ehttp://www.bkjia.com/PHPjc/478849.html技術記事コードのリファクタリングは、文字列の置換などの操作が面倒であるだけでなく、エラーが発生しやすいものです。幸いなことに、PHP を例に挙げると、次のようなツールがいくつかあります。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。