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

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

Jul 13, 2016 pm 05:43 PM
code shell コード 存在する キャラクター 応用 はい それについて話します リファクタリング

代码重构(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 <?php
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 <?php
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 までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP における矢印記号の役割と実際の応用 PHP における矢印記号の役割と実際の応用 Mar 22, 2024 am 11:30 AM

PHP における矢印記号の役割と実際の応用

iPhoneのホーム画面から削除を元に戻す方法 iPhoneのホーム画面から削除を元に戻す方法 Apr 17, 2024 pm 07:37 PM

iPhoneのホーム画面から削除を元に戻す方法

初心者から熟練者まで: Linux tee コマンドのさまざまなアプリケーション シナリオを探索する 初心者から熟練者まで: Linux tee コマンドのさまざまなアプリケーション シナリオを探索する Mar 20, 2024 am 10:00 AM

初心者から熟練者まで: Linux tee コマンドのさまざまなアプリケーション シナリオを探索する

清華大学と Zhipu AI オープンソース GLM-4: 自然言語処理に新たな革命を起こす 清華大学と Zhipu AI オープンソース GLM-4: 自然言語処理に新たな革命を起こす Jun 12, 2024 pm 08:38 PM

清華大学と Zhipu AI オープンソース GLM-4: 自然言語処理に新たな革命を起こす

Linux の「.a」ファイルを作成して実行する Linux の「.a」ファイルを作成して実行する Mar 20, 2024 pm 04:46 PM

Linux の「.a」ファイルを作成して実行する

エージェントを一文で作成!ロビン・リー: 誰もが開発者になる時代が来る エージェントを一文で作成!ロビン・リー: 誰もが開発者になる時代が来る Apr 17, 2024 pm 02:28 PM

エージェントを一文で作成!ロビン・リー: 誰もが開発者になる時代が来る

Go 言語の利点と応用シナリオを探る Go 言語の利点と応用シナリオを探る Mar 27, 2024 pm 03:48 PM

Go 言語の利点と応用シナリオを探る

クラウドコンピューティング分野におけるLinuxの幅広い応用 クラウドコンピューティング分野におけるLinuxの幅広い応用 Mar 20, 2024 pm 04:51 PM

クラウドコンピューティング分野におけるLinuxの幅広い応用

See all articles