我使用Java工作,因此基本上我在编码过程中使用OOP范例。我即将开始在Perl中工作,我想知道Perl开发人员遵循的范式是什么。在Wiki中,它提到它支持许多范例,但是由于它是一种脚本语言,因此我不确定我是否理解这一点。
所以我的问题是:是Perl中Java惯用语言中我熟悉的面向对象模式,还是我需要对设计风格进行重大更改才能编写有效的Perl?
注意:这不是批评Perl的问题。我实际上必须在Perl中工作,并且想了解我编程的当前方式将如何改变。
我使用Java工作,因此基本上我在编码过程中使用OOP范例。我即将开始在Perl中工作,我想知道Perl开发人员遵循的范式是什么。在Wiki中,它提到它支持许多范例,但是由于它是一种脚本语言,因此我不确定我是否理解这一点。
所以我的问题是:是Perl中Java惯用语言中我熟悉的面向对象模式,还是我需要对设计风格进行重大更改才能编写有效的Perl?
注意:这不是批评Perl的问题。我实际上必须在Perl中工作,并且想了解我编程的当前方式将如何改变。
Answers:
Perl的哲学倾向是“现在做些实际的事情”。如果您需要使用OOP,请在此处使用。并不是所有的解决方案都需要强迫一个人编写OOP代码,而这只是一个简单的“先做然后先做然后再做”的类型问题,通常会适得其反。
Perl的多范式性质可以从诸如Schwartzian转换之类的东西中看到,它具有非常实用的功能(在Lisp中,它被称为“装饰-排序-未装饰”)。OOP存在,程序性(C式编程)和命令式(bash式如“先执行此操作”)也存在。
设计模式是常见问题的常见解决方案。它们以每种语言存在。有时这些模式称为成语,尽管这也可能指比模式简单得多的事物。
必要时,可以在perl中实现许多经典的GOF设计模式。 Perl设计模式将具有许多熟悉GOF的通用名称。不必全部都是惯用的perl。
在perl中探索设计模式时,也请注意Mark Dominus所著的“ Design Patterns”。
许多人认为设计模式是该语言的缺陷。从这个角度来看,Perl中通常不需要诸如迭代器之类的设计模式。不总是-但经常。
首先,编写惯用的perl。不要尝试用perl编写C或用perl编写lisp或用perl编写Java。Perl是perl。如果存在的问题超出了perl所能解决的范围,并且您开始需要更复杂的类结构,请编写它们。知道设计模式就能识别“这个问题已经发展到需要抽象工厂的地步了”-但是,如果您不需要一个抽象工厂,请不要尝试在perl中创建一个抽象工厂。
一些库以OOP和更传统的形式存在。请参阅我应该使用面向功能的还是面向对象的CGI接口?对于一个古老的SO问题,其中有人问使用该库的方式。
Perl对范式的立场是TMTOWTDI(有多种方法可以做到)。这就是很多人开玩笑地称Perl为只写语言的原因之一。编写它比阅读它要容易得多,因为另一个人的风格可能与您完全不同。
话虽如此,Perl肯定支持OOP。如果您使用大量的第三方代码,则可能是OOP,也可能不是OOP,但是对于您自己的代码,您可以对自己的内容进行OOP。我实际上是首先在Perl学习OOP的。我先尝试了C ++,由于某种原因它没有“单击”。
在Perl中有多种处理代码重用的方法。许多示例并未明确说明方法之间的区别,许多类至少使用两种方法。
我建议尽可能使用OO样式,并且仅在至少三个或更多类需要相对较小的实用程序功能类时才使用EXPORTER。
所以:
package Foo;
use Foo::Util qw(util) ;
use strict ;
sub foo {
}
sub bar {
}
1;
package Foo::Bar ;
use Foo ;
use Foo::Util qw(util) ;
our @ISA = qw(Foo) ;
use strict ;
sub bar {
}
1;
package Foo::Util ;
use Exporter ;
our @ISA = qw(Exporter) ;
our @EXPORT = qw(util) ;
use strict ;
sub util {
}
1;
我更喜欢将OO方法和该EXPORTER
方法可视化为代码可用性的两个不同维度,就像函数从x或y轴进入当前程序包一样。
在上面的示例中:
Foo::Bar
foo()
从类派生方法Foo
Foo::Bar
定义了一个bar()
方法,因此多态方法bar()
不是从类派生的Foo
这两个类Foo
和Foo::Bar
接收EXPORTED
功能(未方法)util()
从包装(未类)Foo::Util
这两个系统看起来很复杂,但是具有非常实用的实用性。跟踪多重继承会很快变得棘手。因此,具有代码可用性的第二个维度,可以使您的继承树保持较小且易于管理。
通常,如果函数是整体的且相对笨拙,请使用EXPORTER,否则请使用继承。但是EXPORTER
,除非您打算做的事可能涉及3个或4个以上的软件包,否则不要打扰使用它。