Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 重构20K行库的提示_Php_Oop_Open Source_Refactoring - Fatal编程技术网

Php 重构20K行库的提示

Php 重构20K行库的提示,php,oop,open-source,refactoring,Php,Oop,Open Source,Refactoring,我已经为马里奥的答案奖励了100分,但如果我看到新的好答案出现,我可能会开始第二次奖励100分。这就是为什么我一直悬而未决的原因,尽管已将奖金授予马里奥,但我不会选择最终答案。 这似乎是一个简单的问题(研究代码和重构),但我希望那些有更多经验的人能给我一些可靠的建议 该库是一个开放源码的20000行库,全部位于一个文件中,我还没有自己编写。代码看起来写得很糟糕,单个文件甚至是一个更大的问题,因为每次我想进行更改时,它都会将eclipse冻结半分钟,这也是我认为值得将这个库重构为更小的类的原因之一

我已经为马里奥的答案奖励了100分,但如果我看到新的好答案出现,我可能会开始第二次奖励100分。这就是为什么我一直悬而未决的原因,尽管已将奖金授予马里奥,但我不会选择最终答案。

这似乎是一个简单的问题(研究代码和重构),但我希望那些有更多经验的人能给我一些可靠的建议

该库是一个开放源码的20000行库,全部位于一个文件中,我还没有自己编写。代码看起来写得很糟糕,单个文件甚至是一个更大的问题,因为每次我想进行更改时,它都会将eclipse冻结半分钟,这也是我认为值得将这个库重构为更小的类的原因之一

因此,除了阅读代码并试图理解它之外,在重构这样的库时,有没有常见(或不常见)的技巧?你有什么建议让我的生活轻松一点

感谢大家的评论。

  • 我假设您计划将库分解为与主题相关的类。一定要考虑使用。这是自切片面包以来最好的东西,并且使相互依赖性易于处理

  • 从一开始就使用phpDoc兼容注释记录代码


  • 首先,考虑使用不同的IDE——Eclipse在性能方面是非常糟糕的。科莫多要快得多。PhpStorm也是如此


    为了使重构更容易,我首先尝试确定高级图片-有哪些函数?有课吗?你能把这些类放到单独的文件中吗

    一些通用原则适用于:

  • 分而治之。将文件拆分为更小的逻辑库和函数组。通过这种方式,您将了解有关该库的更多信息,并使其更易于理解和增量测试

  • 消除重复。寻找重复的函数和概念,并用标准库函数或库中的集中函数替换它们

  • 增加一致性。平滑参数和命名

  • 添加单元测试。这是重构库最重要的部分。使用jUnit(或类似工具),并添加测试,您可以使用这些测试来验证函数是否正确,以及它们是否没有更改

  • 添加文档。在编写测试时,记录您对一致、改进的库的理解


  • 如果代码写得不好,很可能是因为它有大量的克隆。找到并清除克隆可能会使其更易于维护,同时也会减小其大小

    您可以找到各种克隆检测器,这些检测器专门用于PHP:

    • 伯格曼氏
    • SourceForge
    • 我们的
    在检测有趣克隆的能力方面,排名从最低到最高(IMHO与我对克隆的强烈个人兴趣有关)


    如果代码写得不好,很多代码可能已经死了。找出哪一部分在实践中执行,哪一部分不执行是值得的。测试覆盖率工具可以让您很好地洞察这个问题的答案,即使在没有测试的情况下(您只需手工练习您的程序)。测试覆盖工具所说的执行,显然不是死的。什么不执行。。。可能值得进一步调查,看看是否可以删除它。测试覆盖率工具还可以告诉您单元测试执行了多少代码,如另一个答案所示。最后,测试覆盖率工具可以帮助您找到某些功能的位置:从外部练习功能,测试覆盖率工具所说的执行的任何代码都可能是相关的


    我们可以收集测试覆盖率数据。

    一本用大量示例和细节回答您问题的好书是:有效地使用遗留代码,作者:Michael Feathers

    呼叫方方法

    如果您知道库的使用仅限于一个特定的类、模块或项目,那么从调用端处理问题就更容易了。然后,您可以执行以下操作来清理代码并重构它。从调用方接近的目的是因为对库的调用很少。调用越少,库中实际使用的代码(可能)就越少

    编写调用端测试

    编写一个模拟对库执行的调用的测试

    埋葬死亡密码

    如果有很多死代码,这将是一个巨大的胜利。将实际调用跟踪到库中,并删除所有其他调用。运行测试并验证

    重构剩下的


    因为您有测试,所以重构(甚至替换)库中的代码应该容易得多。然后,您可以应用标准的重构规则,即(重复数据消除、简化、合并等)。

    除了已经说明的内容之外,我建议您根据这些规则进行查看。该页面还包含大量有用的信息,有助于理解如何进行重构。有关更详细的目录列表,请访问。请注意,并非所有这些技术和模式都可以应用于PHP代码

    还有很多有用的工具可以帮助您进行重构(一般来说)。使用这些工具来分析您的代码,以发现诸如死代码或重复代码、高圈复杂度、经常执行的代码等等。这不仅可以让您更好地了解代码,还可以告诉您代码的哪些部分是关键的(最好在开始时保持不变),哪些部分可能是重构的候选者

    无论您做什么,都要编写单元测试。您必须确保在重构时没有破坏代码
     class library0 {
         var $var1,$var2,$var3,$var4;
         function method1();
         function method2();
         function method3();
         function method4();
         function method5();
    
     class library1 extends library0 {
         function method6();
         function method7();
         function method8();
         ...
    
    $code = file_get_contents('path/yo/your/library.php');
    
     $code = str_replace('<?php' ,'' ,$code);
      $code = str_replace('?>' ,'' ,$code);
    
    $code_array = explode('function',$code);
    
    foreach($code_array as $function)
    {
       $funcTemp = explode('(',$function); // getting function name
       $function_name  = trim($funcTemp[0]);
    
      $function_text = '<?php function '.$function;
       file_put_contents('functions/'.$function_name.'.php',$function_text)
    
    }
    
    function __call($name,$params)
    {
      include_once('functions/'.$name.'.php');
      $name($params); // this may be wrong ...
    }