Perl 中 TMTOWTDI 的统一性

作为一名 Perl 开发者,我有很多自由。TMTOWTDI(There’s More Than One Way To Do It)让我可以按照自己的方式编写代码。我可以使用我认为最有效的方法来解决一个问题,无论对我而言什么方法最有效。这很酷,但同时,在一段时间内处理别人的代码并对其感到厌烦后,我可以更好地理解 TMTOWTDIBSCINABTE(There’s More Than One Way To Do It, But Sometimes Consistency Is Not A Bad Thing Either)作为一个原则。

我大约已经用 Perl 编写了9年的代码。我见过了几次风浪,在 Evozon 我们处理了一些遗留项目,所以我看到了很多让我成为总是为维护者编写代码的倡导者的代码。

互联网上流传着一些名言,很好地总结了这些问题。

始终假设最终维护你的代码的人是一个知道你住哪儿的暴力狂人。

不骗你,我遇到过一些情况,如果知道编写我必须处理的怪物代码的人,我可能做出一些非常糟糕的决定。

自由是伟大的,统一性更好。当你一年后回到自己的代码时,这对你的团队和未来将参与该项目的任何人都更好。

当你参与一个有多名开发者的项目时,你会有不同的想法和不同的编写代码的方式。我在一个由20多人组成的跨职能团队中工作,为了保持代码的统一性,我们使用了一些小技巧,让代码易于维护——并且让我们感到快乐。统一的代码提高了代码质量,消除了某些潜在的错误。

我的建议是使用一个运行 Perl::Criticperltidy 的 git 预提交钩子。后者可能更多地是美学的,但我发现它很有帮助。我知道还有其他可能的工具,但我认为这三个工具的组合是使用以实现实用的编码标准和统一外观代码的好方法。

设置 Perl::Critic 和 Perl::Tidy

您可以从 CPAN 安装 Perl::CriticPerl::Tidy,或者它们可能已经包含在你的包管理器中。安装完成后,您需要配置它们。

对于 .perlcriticrc,我的建议是从以下配置开始

severity = 5
verbose = %f: [%p] %m at line %l, column %c (Severity %s).\n%d\n

这些选项在 Perl::Critic 文档 中有描述。

这是一个基本的配置,您可以根据您项目和团队的需求在此基础上进行扩展。增加严重性可能会阻止简单的更改被提交,但从长远来看,会使您的代码库更易于阅读和使用。

对于 .perltidyrc,我建议进行一次团队讨论,以确定以下项目

  • 括号样式
  • 行长度(我的建议至少为120个字符,但我知道还有很多人喜欢80个字符),
  • 每缩进的空间或制表符数
  • 您认为您的团队需要的其他任何内容

以下是我的文件示例

-i=4
-ci=4
-bar
-ce
-nsbl
-cti=0
-sct
-sot
-pt=0
-sbt=1
-bt=1
-bbt=0
-nsfs
-nolq
-l=120

这些在 Perl::Tidy 文档 中有描述。

.perlcriticrc.perltidyrc 都提交到您的仓库。

设置 Git 预提交钩子

对于现有项目,你需要在创建此预提交钩子之前,对所有现有文件运行perlcritic和perltidy,修复任何无法通过perlcritic或中断perltidy的文件。这样,每个后续提交将只对提交中包含的更改进行评论和整理。

要设置预提交钩子,在根项目目录中创建文件.git/hooks/pre-commit。每次你输入git commit命令并运行包含在提交中的文件时,都会执行此文件。

该文件是一个shell脚本

#!/usr/bin/sh
files_commit=$(git diff --cached --name-only)

for file in $files_commit; do
    if [[ $file =~ pm|pl$ ]]
    then
        #run perlcritic first so that we avoid unnecessary tidying
        if ! [[ "$(perlcritic $file)" =~ 'source OK'  ]]; then
            echo >&2 "There was some error when running perlcritic on $file: $(perlcritic $file)"
            exit 1
        fi

        if [[ "$(perltidy -b -bext='/bk' $file)" -gt 0 ]]; then
         echo >&2 "There was an error when running perltidy on $file; please see the error file for more info"
           exit 1
       fi
    fi
done

git add $files_commit

对于要提交的每个文件,此代码首先运行perlcritic - 如果它报告问题,则脚本退出,取消提交。如果perlcritic通过,则在该文件上运行perltidy,如果perltidy以错误退出,则也会中止提交。在此示例中,我仅检查.pm和.pl文件,你也可以添加其他类型的文件,如测试文件、pod文件等。

我知道这不会解决所有问题,但我觉得结合Perl::Critic和Perl::Tidy并自动运行它们是朝着拥有一致且可读的代码库迈出的好步骤。

标签

Alexandru Strajeriu

Alex是罗马尼亚软件公司Evozon的Perl开发者。Evozon。他从事Perl开发已有9年。

浏览他们的文章

反馈

这篇文章有什么问题吗?请在GitHub上打开一个问题或拉取请求来帮助我们。