您好,欢迎访问一九零五行业门户网

说说Shell在代码重构中的应用_PHP教程

代码重构(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
重构后的代码示例:
01
在动手前,我们需要先摸摸底,了解一下大概的情况:
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...
其它类似信息

推荐信息