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