【问题标题】:Naming convention for passing a hash reference to a subroutine将哈希引用传递给子例程的命名约定
【发布时间】:2014-01-02 11:26:26
【问题描述】:

当我将哈希引用传递给子例程时,分配哈希引用参数的变量的良好命名约定是什么?

在下面的示例中,更好的选择是什么:

  1. 使用与原始变量相同的变量名(并让 Perl 将原始变量隐藏在块中)。
  2. 为子例程中的哈希引用想出一个新名称?

我倾向于使用选项 1,因为相同哈希引用的新名称感觉多余。

如果选项 2 更好,那么子例程中的变量的良好命名约定是什么?

## example:

use strict;
use warnings;

my $href_phone_book = generate_phone_book();
my $phone_number = get_phone_number($href_phone_book, "john");

print $phone_number."\n";

sub generate_phone_book {

    my %phone_book = (

        john => "5554321",
        alice => "5551234"
    );

    return \%phone_book;
}

sub get_phone_number{

    # Is it OK to hide the original variable
    my $href_phone_book = shift;
    # Or should I use a new variable name? What would then be a good naming convention?

    my $person = shift;
    my $phone_number = $href_phone_book->{$person};

    return $phone_number;
}

【问题讨论】:

    标签: perl naming-conventions


    【解决方案1】:

    您应该为变量引用的数据命名。理想情况下,您应该使用一个简短的、明确的名称,并在可能的情况下删除上下文。例如,如果您的函数所做的事情通常适用于任何哈希引用,则名称 $hash_ref 在 IMO 中比 $phone_book 更可取

    1.使用与原始变量相同的变量名(并让 Perl 将原始变量隐藏在块中)。

    虽然不是一个一般安全的假设,但它我会在你的例子中做的。我会使用 $phone_book 作为单个参数。

    请注意,如果您重复使用相同的引用数据结构作为函数的参数,那么它指向编写一些 OO Perl。您可能应该创建一个类,将对象的数据结构和函数更改为实例方法。

    警告:由于范围可变,您的示例脚本将生成警告。所以我的建议需要修改。我不会更改子例程的变量,而是将全局变量命名为 $main_phone_book 之类的名称。 . .但这只是由于您的示例脚本的结构所必需的。理想情况下,您应该避免使用全局数据结构,并使用模块化(PhoneBook.pm 文件包含处理电话号码的所有逻辑,无论是导出函数还是新类,都不会因为包命名空间而在变量名上发生冲突)。或者,如果变量对于手头的问题确实是全局的,那么您可能根本不会将它们作为参数传递。

    2。为子例程中的哈希引用想出一个新名称?

    在这种情况下,仅由于示例脚本的文件结构而需要它。至少在单个脚本和模块级别的一致性比找到一些可以满足您所有需求的特殊命名约定更重要。


    我建议你阅读Perl Best Practices 的变量命名约定章节。这是非常明确和有用的建议。

    【讨论】:

    • 我试图避免使用 .pm 文件来简化脚本的分发。虽然变量不是真正的全局变量,但我从您的回答中得到,最好使用两个变量名(全局范围内的 $main_phone_book 和子例程块内的 $phone_book)。
    • 顺便说一下,在我的例子中,这个例子没有给出变量范围警告。将 perl 5.10.1 与 use strict 和警告一起使用
    • @edv:是的,我会使用两个变量,第一个是全局变量,名称更复杂。即使 Perl 对重新分配的名称感到满意,我还是建议您使用不同的名称,因为在开发或维护期间您可能会混淆自己的名称。顺便说一句,你在问题中的$href_phone_book 是可以的——如果我在代码审查中看到它,我不会抱怨(当然我更喜欢我自己的风格:-)。您也可以在单个 .pl 文件中使用包,尽管您需要担心的不仅仅是代码执行的顺序。
    • 你可以把全局代码放在所有子程序之后;如果您不打算关闭,那无论如何可能更安全。
    猜你喜欢
    • 2011-06-21
    • 2016-12-04
    • 2011-02-01
    • 1970-01-01
    • 2020-06-14
    • 2011-01-17
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多