我需要创建一个可供其他开发人员使用的包。 实现静态方法的最佳方式是什么? 对于静态(类)方法,我必须期待第一个参数 $class,并且方法必须作为类方法调用:
My::Package->Sub1();
另一方面,我可以编写一个“常规”包子例程(不需要 $class 参数),它将完全执行相同的操作,但需要以不同的方式调用
My::Package::Sub1();
所以,从业务功能的角度来看基本上没有什么区别(至少我没有看到它,除了通过第一个参数提供包名称可用性),但是有两种不同的实现和调用方式。有点令人困惑。 我应该使用哪种方式以及何时使用?有什么规则吗? 另外,我应该检查方法是否按我的预期调用(静态与包)?
最佳答案
首先,一个功能点:如果创建一个继承自My::Package
的第二类,Child::Class::Sub1()
将是未定义的,如果 Sub1
被编写为非 OO 子例程,则 Child::Class->Sub1()
将忽略它是从 Child::调用的事实类
。
因此,为了使用您的模块的程序员,您需要使包/类中的所有子例程响应一致的调用结构/方法。您的模块应该是一个子例程/函数的库,或者是一个充满方法的类。如果其中一部分是面向对象的,那么就全部面向对象。可以创建子例程以混合模式运行,但这会使代码不必要地复杂化,并且在 CPAN 上似乎已经过时了。
现在,如果确实没有理由区分 My::Package->Sub1()
和 Child::Class->Sub1()
,那么您可以请随意忽略您将传递的隐式类名参数。这并不意味着您不应该期望该参数,也不意味着您应该鼓励在 OO 模块中使用非 OO 调用格式。
关于Perl:静态方法与包方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923277/