Perl: 静态方法 vs 包方法

3

我需要创建一个包,供其他开发人员使用。 如何实现静态方法最佳?对于静态(类)方法,我必须期望第一个参数为 $class,并且该方法必须被调用为类方法。

My::Package->Sub1();

另一方面,我可以编写一个“常规”包子例程(不需要$class参数),完全可以完成相同的任务,但需要以不同的方式调用。

My::Package::Sub1();

所以,从业务功能角度来看(至少我没有看到不同之处,除了通过第一个参数可用性的包名称),但是有两种不同的实现和调用方式。有点混乱。 我应该在什么情况下使用哪种方法?是否有一些规则? 此外,我应该检查方法是否按照我预期的方式调用(静态 vs 包)?

1个回答

5
首先,从功能角度考虑:如果创建一个继承自My::Package的二级类,则Child::Class::Sub1()将未定义,如果将Sub1编写为非面向对象的子例程,则Child::Class->Sub1()将忽略它被从Child::Class调用的事实。
因此,为了方便使用您模块的程序员,您需要使包/类中的所有子程序响应一致的调用结构/方法。您的模块应该是一个子例程/函数的库或者是一个充满方法的类。如果其中一部分是面向对象的,请将其全部转为面向对象。虽然可以创建既有面向对象模式又有混合模式的子程序,但这样会使代码变得复杂,而且在CPAN上已经不流行了。
现在,如果真的没有理由区分My::Package->Sub1()Child::Class->Sub1(),那么可以随意忽略传递给您的隐式类名参数。这并不意味着您不应该期望该参数或鼓励在面向对象模块中使用非面向对象的调用格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接