Ani*_*van 5 oop perl coding-style
我和朋友一直在讨论代码风格问题.我们有一系列通过命名子例程返回特定类型值来实现接口的包.例如:
package Foo::Type::Bar;
sub generate_foo {
# about 5-100 lines of code
return stuff here;
}
Run Code Online (Sandbox Code Playgroud)
所以你可以去:
my $bar_foo = Foo::Type::Bar->generate_foo;
my $baz_foo = Foo::Type::Baz->generate_foo;
Run Code Online (Sandbox Code Playgroud)
我们有很多这些,都在同一Foo::Type::*层次结构下.
我认为包应该清楚地表明它们实现了foo_generate接口,例如:
package Foo::Type::Bar;
use base 'Foo::Type';
sub generate_foo {
...
return stuff here;
}
Run Code Online (Sandbox Code Playgroud)
我认为这是一种很好的代码风格,对于其他编写代码的程序员来说更加清晰和干净.它还允许您检查Foo::Type::Bar->isa('Foo::Type')它是否实现了接口(子系统的其他部分完全是OO).
我的朋友不同意.他提出的一些论点是:
Foo::Type::* 包清楚地命名,并且仅在内部项目中使用,因此不存在想知道给定包是否实现接口的问题Foo::Type超类不会添加任何值,因为它实际上是一个空包,仅用于启用->isa查找我们中的一个人是"正确的"吗?你会怎么做?
编辑:在示例中,将Foo :: Generator重命名为Foo :: Type
我认为如果您问这些问题,您应该升级到 Moose。在那里,您将能够通过使用适当的抽象方法创建角色或类来定义接口。
我同意你的观点,这样做可以添加有价值的信息。在Java中,有一个“标记接口”的概念,它是一个空接口,没有任何方法,其存在只是为了将一组类标记为对特定目的有用。最常见的例子是 Serialized 接口。
当然,仅仅因为它有用并不意味着它适合您的特定情况。:)