代码重构(Code refactoring)有时是很枯燥的,字符串替换之类的操作不仅乏味,而且还容易出错,好在有一些工具可用,以PHP为例,如:Rephactor,Scisr等等,不过现成的工具往往意味着不够灵活,所以今天我要说说Shell在代码重构中的应用。

先来个简单的,假设我们要把PHP文件中的foo_bar全都替换成fooBar,那么可以如下:

方法一,使用Sed:

1shell> find /path -name "*.php" -print0 | xargs -0 sed '

2 s/foo_bar/fooBar/g

3 '

方法二,使用AWK:

1shell> find /path -name "*.php" -print0 | xargs -0 awk '

2 {

3 gsub(/foo_bar/, "fooBar")

4 print

5 }

6 '

注:为了简单,我把结果直接打印到终端屏幕了,至于如何保存,稍后会说明。

接着说个复杂的:假设某个PHP项目,以前使用类之前必须调用一个叫『includeClass』的方法,现在改用类自动加载的方式,所以要删除硬编码的includeClass调用,出于美观的考虑,如果includeClass下面一行是空行的话,也一起删除,同时考虑大小写不敏感的因素。

重构前的代码示例:

101 <?php

202 includeClass('...');

303 echo 'a';

404

505 echo 'b';

606 includeClass('...');

707 includeClass('...');

808

909

1010 echo 'c';

1111

1212 echo 'd';

1313 includeClass('...');

1414

1515

1616 echo 'e';

1717 ?>

重构后的代码示例:

101 <?php

202 echo 'a';

303

404 echo 'b';

505

606 echo 'c';

707

808 echo 'd';

909

1010 echo 'e';

1111 ?>

在动手前,我们需要先摸摸底,了解一下大概的情况:

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

其中,grep命令的参数乍一看不好记,不过只要按照我说的方法记,就永远不会忘:前面的参数看做英文,后面的参数看做拼音 。至于参数的具体含义,请参阅man文档。

方法一,使用Sed编写脚本script.sh:

1#!/bin/bash

2

3for PHP in $@; do

4 /bin/sed -i '

5 /includeClass/I {

6 h

7 d

8 }

9

10 /^$/ {

11 x

12 /includeClass/Id

13 x

14 }

15

16 h

17 ' $PHP

18done

注:篇幅所限,我把正则写的比较简单

Sed的缺点是代码可读性比较差,优点是代码较短。另外内置的『-i』选项可以直接完成保存,这是我喜欢Sed的原因之一。

方法二,使用AWK编写脚本script.sh:

1#!/bin/bash

2

3for PHP in $@; do

4 TMP=$(mktemp)

5

6 /bin/awk '

7 BEGIN {

8 IGNORECASE = 1

9 }

10

11 /includeClass/ {

12 previous = $0

13 next

14 }

15

16 /^$/ {

17 if (previous ~ /includeClass/) {

18 previous = $0

19 next

20 }

21 }

22

23 {

24 previous = $0

25 print

26 }

27 ' $PHP > $TMP

28

29 /bin/cp -f $TMP $PHP

30 /bin/rm -f $TMP

31done

注:篇幅所限,我把正则写的比较简单

AWK的缺点是代码比较长,优点是代码可读性较好。另外程序中是通过生成一个唯一的临时文件来完成保存的。

提醒:直接覆盖原始文件有时候并不合适,毕竟可能有没考虑周详的地方,使用SVN的话就不会有这样的顾虑了,因为即便覆盖了原始文件,也可以在提交前通过“svn diff”命令来检查对错,就算是提交了,也可以恢复到以前的版本。

如何调用script.sh脚本呢?这里给个最一般的例子:

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

简单的任务用Sed写很合适,复杂的任务则最好用AWK写,具体可以参考Sed One Line和AWK One Line等。

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里

php代码重构,Shell在代码重构中的应用了解下相关推荐

  1. 说说Shell在代码重构中的应用

    说说Shell在代码重构中的应用 出处信息 出处:http://blogread.cn/it/article/3426?f=wb 代码重构(Code refactoring)有时是很枯燥的,字符串替换 ...

  2. 如何重构“箭头型”代码

    本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论(微博原文),在微博上大家有各式各样的问题和想法.按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我觉得 ...

  3. 手把手教你重构乱糟糟的代码

    来 源:www.jianshu.com/p/3f04b6aebad2 作者:小村医 重构不止是代码整理,它提供了一种高效且受控的代码整理技术. (一)重构原则 1.何谓重构 对软件内部结构的一种调整, ...

  4. .NET重构—单元测试的代码重构

    阅读目录: 1.开篇介绍 2.单元测试.测试用例代码重复问题(大量使用重复的Mock对象及测试数据) 2.1.单元测试的继承体系(利用超类来减少Mock对象的使用) 2.1.1.公用的MOCK对象: ...

  5. 《重构-改善既有代码设计》读书笔记-重构篇

    2019独角兽企业重金招聘Python工程师标准>>> 重构定义 名词 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本.--<重 ...

  6. 用VS.NET 2005重构你的代码

    引:作为程序员,我们都在编写各种各样的代码,然而有些程序员编写的代码则更为优秀些.差别是显然的.编写好的代码并不是所有的开发者都能够掌握的技巧.但是,这也意味着,这种技巧能够被改进.这种技能之一就包括 ...

  7. 代码重构(二):类重构规则

    在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp ...

  8. python重构函数_Python代码重构

    代码重构是一件非常辛苦却非常有意义的事情,代码重构的原因在于: 1.代码过于冗余.沉余 2.代码过于耦合 3.代码过于复杂 4.接口调用超出三层 这次重构主要在于架构问题,自己没有画出实现整个项目的功 ...

  9. 重构 改善既有代码的设计:代码的坏

    以下内容来自<<重构 改善既有代码的设计>> 一.什么是重构 所谓重构(Refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改以改进程序的内部结构 ...

最新文章

  1. 输入空格hdu - 1010 - Tempter of the Bone
  2. springmvc xml 空模板
  3. Java BIO编程
  4. 编写简单的hql命令_Makefile的简单编写
  5. 系统集成管理师2011下半年软考透解 四
  6. php class variable,PHP中的變量類擴展 - 是否可能?
  7. pycharm中的常用快捷键与常用设置
  8. 人脸识别测试图片_人脸识别或将到达瓶颈,有监督的聚类算法探索新思路
  9. 大物实验计算弹性模量_什么是材料的杨氏模量?它的定义与计算公式是什么?...
  10. 2022年认证杯SPSSPRO杯数学建模B题(第一阶段)唐宋诗的定量分析与比较研究求解全过程文档及程序
  11. NPDP产品经理认证考试培训资料--XISAI
  12. C++输出平行四边形和菱形
  13. MSR5560 路由器映射
  14. 用数学语言说我爱你怎么说_你会说我的语言吗
  15. 苹果iOS11重磅改版App Store,开发者应该了解这些
  16. 显示“Hello World”并转换为语音
  17. U盘装系统启动时按F12没有反应的原因之一
  18. 什么是FTTH光纤到户皮线光缆?
  19. LNMP架构的搭建——源码编译(PHP,nginx,Mysql)
  20. 百度地图Api进阶教程-地图鼠标左右键操作实例和鼠标样式6.html

热门文章

  1. 11个鲜为人知的实用Linux命令 - Part 2
  2. 8月第一周国内搜索网站 排名顺序基本稳定
  3. easyui combobox开启搜索自动完成功能
  4. Spring依赖检查
  5. 程序员的工作,四种情景的处理
  6. 谈谈读书自由与财富自由
  7. 【奇葩面试题】因为太难而被禁用的17道Google面试题
  8. NGINX限流的一些思考
  9. Linux之centos镜像
  10. Git的pull clone fetch