我应该如何重构一个大的Perl脚本?

时间:2010-08-26 15:52:25

标签: perl refactoring abstraction

我有一个或多或少的大约1000行的Perl脚本。该脚本接受一些参数,它直接运行。没有模块,没有功能。该脚本可以分为三个部分,初始化部分,参数解析部分和工作部分,但我不知道该怎么做。一切都必须保存在一个文件中。请问,任何人都可以给我指示/建议如何构建我的Perl脚本吗?

感谢。

7 个答案:

答案 0 :(得分:8)

您要求如何重构您的脚本的建议,但您似乎并不理解为什么重构它。如果没有为什么如何对您没有多大帮助。使用为什么如何可能很自然地出现。

如果你的脚本工作得很完美而且不需要修改就可以运行它,那么你可能没有理由重构它 - 我从鄙视长期例程的角度说这个。但...

如果出现问题

如果你想在你的1000行计划中找到一个错误,你就会有一些艰苦的工作。问题可能在任何地方。将其分解为更小的部分,以便您可以在不同阶段验证输入和输出 - 理想情况下,为较小的部分编写测试。细粒度单元测试将告诉您哪些不起作用,错误的性质以及 错误存在。

如果您需要修改

如果您需要将脚本更改为 - 例如 - 适应新的图形格式,或利用多个处理器,或将其活动记录到日志中 - 如果需要修改的程序元素或更新,则会更容易扩展扩展更好地隔离。

如果您正试图向其他人解释,或将其展示

如果将这些想法分解为不同的方法,您会发现将脚本中的想法传达给其他开发人员要容易得多。

所以,有一些原因为什么你可能会选择重构。如果其中任何一个适用,则相应地重构; 如何会自然退出。 Extract Method可能是你最好的朋友。

答案 1 :(得分:3)

1000行没有功能?为什么不?这是一个模糊的问题。

答案 2 :(得分:3)

您可以将每个部分分解为单独的函数,然后使用一个函数以正确的顺序(称为“run()”或类似函数)遍历每个函数。这将允许您将程序分解为更多可管理的块。

P.S。我认为在这个答案中我使用过多次单词功能!

答案 3 :(得分:3)

你有没有重构过?在1000行,我怀疑看到一些代码可以分解为脚本内部的函数。

好吧,如果你有三个独立的部分,这是合乎逻辑的选择。

你可以将每一个变成一个函数,然后在顶部有一个简单的线性控制:

 my $var1, $var2, $var3;

   $var1 = init();
   $var2 = parseInput();
   $doWork();

   sub init() {
      some code here
   }

   sub parseInput() {
      some code here
   }

   sub doWork() {
      some code here
   }

最大的问题是你将会使用全局变量。我将它们构建成一两个结构。我也希望看到三巨头分解为功能本身。回到80年代,当我学习的大事是结构化编程(我认为这里是最好的设计)时,经验法则是一个功能应该适合大约一个或更少的屏幕。

答案 4 :(得分:3)

如果您可以看到脚本的逻辑部分,那么您应该将它们抽象为函数。拥有超过1000行的单个脚本,而不是将其分解为您的语言提供的任何抽象单元(函数,类等)是一个非常糟糕的主意。维护你的脚本,i。即添加功能和修复错误将是一场噩梦。

我强烈建议你阅读Robert C. Martin的书Clean Code。它使用Java作为示例,但这些想法适用于任何语言。这里最相关的是“让你的功能变小。然后让它们变小。”

答案 5 :(得分:3)

大多数人通常会回答诸如“子程序应该做一件事”和“子程序应该只占用编辑器中的一页”之类的东西。重构代码时,可以尝试记住这些事项。

尝试识别可以拆分为逻辑部分的代码部分。您已经通过发现'初始化','参数解析'和'工作'开始了这个过程。看看其中是否有一些可以修剪成其他子程序的子部分。

另外,为什么不使用任何模块?我想到的是Getopt::Long,这是一个核心模块,因此您不必手动安装它。它将处理您的所有参数解析,并且通过使用它您可能会避免错误并可能缩短您的代码以使其更易于维护。通过使用这样的标准模块,您不仅(希望!)减少代码中的错误数量,还可以让其他Perl程序员更容易理解。

答案 6 :(得分:0)

您可以查看search.cpan.org,也许一些Perl模块可以满足您的需求。例如,有一个CGI::Application