Perlのプログラミングスタイル


9

私はJavaで作業しているため、基本的にはコーディング中にOOPパラダイムを使用しています。私はPerlで仕事を始めようとしていて、Perl開発者が従うパラダイムは何だろうと思っていました。wikiでは、多くのパラダイムをサポートしていると述べていますが、スクリプト言語であるため、これを理解しているとは思いません。

だから私の質問は、Javaで慣れ親しんだオブジェクト指向パターンはPerlの慣用句ですか?それとも効果的なPerlを書くためにデザインスタイルに大幅な変更が必要ですか?

注:これはPerlを批判する問題ではありません。私は実際にはPerlで作業する必要があり、現在のプログラミング方法がどのように変わるかを理解したいと思います。


3
より深刻なノートで、「Perlの哲学」のためのGoogle検索を行うには、こちらをご覧:perldesignpatterns.com
ロバート・ハーヴェイ

PerlはOOPをサポートしています。クラス階層を構築して、仮想関数などを実装できます。最も一般的な使用法ではありませんが、実行できます。
マーティンニューヨーク

「スクリプト言語だから」-それはそのまま使用できますが、perlはJavaと同じくらいVMであることを思い出してください-perlは(その場で)コンパイルされてからバイトコードにコンパイルされます。JITはありませんが、それ以外はコードを実行している仮想マシンです。
Tanktalus

回答:


15

Perlの哲学は、「現在実用的なことをする」という哲学になりがちです。OOPを使用する必要がある場合は、そこにあります。すべてのソリューションで必要なわけではなく、単純に「これを実行すると、これからこれを実行する」タイプの問題である場合にOOPコードを書くように強制することは、多くの場合逆効果です。

perlのマルチパラダイムの性質は、非常に機能的な側面を持つシュワルツ変換(Lispでは「装飾、ソート、非装飾」として知られている)などに見られます。手続き型(プログラミングのようなC)と命令型(「これを実行すると、これを実行する」のようなbash)のように、OOPが存在します。

デザインパターンは、一般的な問題の再発する解決策です。それらはすべての言語で存在します。これらのパターンはイディオムと呼ばれることもありますが、これはパターンよりもはるかに単純なことを指す場合もあります。

必要に応じて、古典的なGOF設計パターンの多くをperlに実装できます。 Perlのデザインパターンには、GOFに精通している多くの一般的な名前が付けられます。それらすべてが慣用的なperlである必要はありません。

perlでデザインパターンを探索するときMark Dominusによる「デザインパターン」ではないことに注意してください。

多くの人は、デザインパターンは言語の欠陥だと考えています。その観点では、Perlではイテレーターなどのデザインパターンは不要です。常にではありませんが、頻繁に。

まず、慣用的なperlを記述します。Cをperlで、lispをperlで、javaをperlで記述しないでください。PerlはPerlです。慣用的なperlが処理できるよりも大きな問題があり、より複雑なクラス構造が必要になり始めたら、それらを記述します。「この問題は現在、抽象ファクトリを必要とするようになっています」と認識できるように設計パターンを知ってください。しかし、必要がない場合は、perlで抽象ファクトリを作成しようとすることから始めないでください。

一部のライブラリは、OOPと従来の形式の両方で存在します。関数指向またはオブジェクト指向のCGIインターフェイスを使用する必要があるかを参照してくださいライブラリを使用する方法を尋ねる古いSOの質問。


4
+1。興味深い情報:これらすべてを考慮に入れると、Perlを古い言語として防御/攻撃しようとしているSOに多くの投稿があるのはなぜですか?
user10326 2013年

2
誰もが自分の好きな言語を持っています。多くの人は、言語が今週の新しいことをサポートできない限り、その言語は古くて時代遅れであり、すべてをそこから移動する必要があると感じています。他の人は特定の言語を学ぶことにかなりの時間を費やしていて、それがどこにあるかでそれを働かせる方法を知っています。これは、The Hot New Languageほど速く動かない言語に簡単に変更できます。Perlは、Perl 6を取得するのにかかった時間(いつの日か、間違いですが、今年は1年です!)これはperlの学習を妨げるものではありません-多くの場所で使用されています。

1
おそらく、perlは、昔からシェルスクリプトの役割の多くを担うLinuxスクリプトの共通語であることがわかります。* nixシステムでスクリプトを作成するときに、bashではなくperlスクリプトを記述した場合、最も頑固なシェルスクリプト作成者だけが文句を言うでしょう。perlで最も重要なことの1つはCPANです。妥当なサイズのライブラリを作成しようとしている場合は、他の誰かがすでにそれを作成していないか確認してください。

1
以前はある程度複雑なシェルスクリプトであったものが、現在はPerlスクリプトであることがよくあります。Perlは、システムまたはアプリケーション間の接着剤/ダクトテープとしても機能します。その文字列処理は、他のいくつかの業界(特に、バイオインフォマティクス-SOのperlタグ内に存在するDNAベースの質問の数を見てください)でも利用されています。

4
Perlは堅牢で完全なプログラミング言語です。スクリプト(シェルを含む他のアプリケーションとの相互作用の自動化)、ユーティリティの構築、さらには大規模なアプリケーションにも使用できます。Perlの憎しみは、その密な構文のようなものに焦点を合わせる傾向があり、ある程度は、Perlがユーザーに特定の設計パターンを強制しようとしないという事実の誤解に焦点を当てています。私は毎日Perlを使用しています。私は他の言語も頻繁に使用しています。Perlの表現力とパワーを楽しんでいます。ぎこちない学習段階を過ぎると、きっと気に入るはずです。
DavidO 2013年

7

Perlのパラダイムに対するスタンスはTMTOWTDIです(それを行う方法は複数あります)。これは、多くの人が冗談でPerlを書き込み専用言語と呼ぶ理由の1つです。他の人のスタイルはあなたのスタイルとは完全に異なるかもしれないので、それを読むより書く方がはるかに簡単です。

そうは言っても、OOPは確かにPerlでサポートされています。サードパーティのコードをたくさん使用している場合は、OOPである場合とそうでない場合がありますが、独自のコードの場合は、思い通りにOOPを実行できます。私は実際に最初にPerlでOOPを学びました。最初にC ++を試しましたが、何らかの理由で「クリック」しませんでした。


1
多くの人々がそれを悪いキャリアオプションだと考えるのはなぜですか?それは強力で、ツールセットの一部として他の言語を補完できるようです。
user10326 2013年

3
他の言語もほとんど同じくらい強力で、より固有の構造を持っているとしましょう。企業は構造が好きです。
カールビーレフェルト

優れたPerl OOPチュートリアルについては、codeproject.com
Articles / 3152

1
これは、Perlの組み込みOOスタイルを説明する優れたOOPチュートリアルです。そのコードが少し冗長であることがわかった場合は、組み込みOOでの反復的なコーディングの多くを自動化するPerlライブラリMooseに興味があるかもしれません。ただし、組み込みのスタイル(IMH0)から始めるのが最善です。
マットフリーク2013年

1
私はPerlが悪いキャリアオプションであるとは決して知りませんでした。地元のPerl Mongersグループを見つけてください。ほとんどすべての会議で、誰かがPerlの求人に言及する可能性があります。
DavidO 2013年

3

私も同じ状況で、長い間Javaを使用しています。

Perlに移行したことは衝撃と安心でしたが、私は「Perl Best Practices」という本を使いました。これは非常に役立ち、プログラミング言語の基本的な概念を理解すれば、簡単に理解することができます。

perlでそれを行うには1つ以上の方法があることを覚えておいてください。特定のコードを調べて変更するために数え切れないほどの時間を費やしていますが、結局、単純な構文エラーで仕事が完了します。


0

Perlでコードの再利用を処理する方法は複数あります。多くの例ではアプローチの違いを明確にしておらず、多くのクラスでは少なくとも2つを使用しています。

OOスタイルをできるだけ使用することをお勧めします。ユーティリティ関数の比較的小さなクラスターを必要とするクラスが少なくとも3つ以上ある場合にのみ、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アプローチをコード可用性の2つの異なる次元として視覚化することを好みます。まるで、関数がxまたはy軸から現在のパッケージに入っているかのようです。

上記の例では:

Foo::Barfoo()クラスからメソッドを派生Foo

Foo::Barbar()メソッドを定義して、ポリモーフィックメソッドbar()がクラスから派生しないようにしますFoo

クラスFooとパッケージから(関数ではなく)関数をFoo::Bar受け取りEXPORTEDます(クラスではありませんutil()Foo::Util

2つのシステムは複雑に見えますが、非常に実用的です。多重継承をトレースすると、トリッキーに速くなる可能性があります。したがって、コードの可用性の2番目の次元を持つことで、継承ツリーを小さく維持し、管理しやすくすることができます。

一般に、関数がモノリシックで比較的ダムである場合は、EXPORTERを使用します。それ以外の場合は、継承を使用します。ただしEXPORTER、3つまたは4つを超えるパッケージが含まれる可能性がある場合を除いて、まったく使用しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.