anyway?オブジェクト指向プログラミングは、昨今の、ビッグセラーです。マネージャーには、薄切りパン(訳註:良い発明のこと)よりもむしろオブジェクトを持ちたがる人もいます。複雑なふるまいを遠くへやってしまう方法以外のなにものでもありません(専門家は、このことを抽象化と呼びます)。普通の人でも使える、これらの素敵なオブジェクトを作ります(専門家は、このことをソフトウェアの再利用と呼びます)。that.オブジェクトを使う人(たぶん、プログラマ)は、自分が欲しい小さな包みをいじることができます。その包みを開けようとはしないし、その中を散らかそうともしないでしょう。ハードウェアの高価な部分のように、契約は次のようになっています。カバーをいじくれば、保証は無効になります、と。そんなことをしてはいけません。package.オブジェクトの核心は、クラスです。データと関数に満ちています。いくつかの問題領域を扱います。クラスをユーザ定義の型と考えることもできます。パッケージの仕組は、より伝統的なモジュールと同じように、クラスモジュールにも使われます。"住んで(生きて)"います。このことは、オブジェクトがいくつかのパッケージに属していることを意味します。method.たいてい、クラスは、それを使う人にいくつかの小さな包みを提供します。それらの包みがオブジェクトです。どのように振る舞うかも知っています。オブジェクトの1つに何かをするように頼むことができます。クラスに何かをするように頼むことは、クラスメソッドを呼ぶことです。オブジェクトに何かをするように頼むことは、オブジェクトメソッドを呼ぶことです。コンストラクタを呼ぶことです。コンストラクタは、メソッドの一種です。最初の質問に答えるのは、簡単です。オブジェクトは、一つの、たった一つのやり方において、Perlの他のデータ型とは違っています。単なる文字列や数字の添字ではなく、名前の付けられたサブルーチンの呼出しを使います。一言でいえば、メソッドでデリファレンスします。reference.二番目の答えは、次のようになります。オブジェクトはリファレンスですが、ただのリファレンスではありません。特別なクラス(パッケージ)に祝福(bless)されているリファレントを持っているものです。その質問の答えは、あまり具体的にはなりません。クラス設計者の好きなように使うことが出来るからです。リファレンスなら、スカラーでも、配列でも、ハッシュでもかまいません。コードのリファレンスすらありえます。持ち前の柔軟性により、普通、オブジェクトはハッシュリファレンスです。distance.クラスを作る前に、クラスに何という名前を付けるかを決めなければなりません。クラス(パッケージ)の名前は、普通のモジュールと同じように、クラスを納めるファイル名を左右します。それから、そのクラス(パッケージ)は、一つか、それ以上の方法で、オブジェクトを生成する方法を提供すべきです。離れたところから間接的にオブジェクトを操作することのできるメカニズムを提供すべきです。Personクラスモジュールを作ってみましょう。ファイルに保存されます。ディレクトリのセパレータは違っているでしょうが、原則は同じです)。ディレクトリ名のベースとなるモジュールとの間にどのような公式な関係も想定してはいけません。その他諸々に、何の効果も与えません。it.このモジュールにExporterは使わないでおきましょう。行儀が良いクラスモジュールはまったく何もexportしないからです(訳註:文法が?)。オブジェクトを作るためには、クラスに、コンストラクタメソッドが必要です。コンストラクタは、普通のデータ型ではなく、おろしたてのクラスのオブジェクトを返します。関数によって、扱われます。リファレンスをオブジェクトとして使えるようにすることです。呼ばれるということ以上に何も意味しません。呼ぶのを好むようです。コンストラクタとして、クラスと同じ名前の関数を使うプログラマにがいることも知られています。Perlで使われている、もっとも一般的なメカニズムは、無名ハッシュです。それぞれにアクセスしやすいからです。"Rhys"と"Phineas"を得ることができます。braces.これと同じモデルは、複数のクラスでよく使われてます。プログラミングの礼儀正しさの頂点をよく考えたものではありません。オブジェクトは、オブジェクトメソッドを使ってアクセスする、不可解なクッキーと考えるべきです。関数名を使って、リファレンスをデリファレンスしているように見えます。使う人がそれぞれのクラスのドキュメントを読むのを当てにしています。プログラムは、実行している間に、例外をおこすでしょう。コンパイラがそのことをとらえてくれることは期待できません。(たぶん、あなたは、コンパイラにあなたの好むすべてを期待するでしょうが、そんなことは起こりません。所定のインターフェースを説明するドキュメントを読んでいる人だと想定しましょう。後のために、オブジェクトを配列にいれます。他の実装があるかを知りません(すくなくとも、その事実に注意を払うかは無関係です)。クラスとそのオブジェクトへのインターフェースは、専らメソッド経由です。クラスを使う人はみんな、メソッドをいじるべきです。hash.まだ、誰かは、オブジェクトに何があるかを知る必要があります。その誰かとは、クラスです。クラスはプログラマが、オブジェクトにアクセスするのに使うメソッドを実装します。ここに示すのは、標準的なオブジェクトのようにハッシュリファレンスを使うイディオムを使い、Personクラスに実装する方法です。コンストラクタとして働くnew()というクラスメソッドを作りましょう。オブジェクトごとに、無名ハッシュにデータを隠すようにします。引数があれば、値をセットする。key.オブジェクトのデータにアクセスする3つのメソッド、name()、age()、peers()を、作りました。これらは、実質は、すべて似たようなものです。そのフィールドに保持されている値を返します。ハッシュのキーの値を意味します。inheritable.たとえ、この時点でその意味することを知らなくてよくても、いつの日か継承に悩むことになるでしょう。(お望みなら、今のところ継承を安全に無視し、後で、継承に悩むこともできます)。2つの引数を渡さなければいけません。2番目の引数はクラスですが、リファレントを祝福(bless)するクラスです。デフォルトでは、(訳註:2番目の引数を省略すると)2番目の引数として自分自身のクラスを想定します。そのかわりに、(訳註:コンストラクタの第一引数に)渡されるクラスを使います。することで、コンストラクタは継承できるようになります。say:さらに進めて、コンストラクタをもうちょっとフレキシブルにしましょう。オブジェクトメソッドとしても、呼べるようにしましょう。referent.これをするには、渡されたものが、リファレンスであるかどうかをチェックすることだけです。関数を使って、パッケージ(クラス)を抜き出さなければなりません。リファレントを祝福(bless)するだけです。calls.これが、コンストラクタの全てです。した、小さくて、不可解な束をユーザに返し、次のメソッドの呼出しに使われます。DESTROY.全ての話には、始まりがあり、終わりがあります。コンストラクタがあり、オブジェクトが存在しはじめる時には、明示的にコンストラクタが呼ばれます。オブジェクトがその命を無くすときに暗黙のうちに呼ばれます。(Perlでは)DESTROYと呼ばれなければいけません。その理由は、コンストラクタは、明示的に呼ばれますが、デストラクタはそうではないからです。デストラクタの呼出しは、Perlのガベージコレクションシステム経由で、自動的に起こります。素早いですが、幾分、怠惰なリファレンスに基づいた、ガベージコレクションシステムです。デストラクタが、DESTROYと名付けられることを、主張します。Perlはデストラクタを呼ぶ適切な時期を考えますが、現在のところいつ呼ばれるかははっきり定義されていません。このために、デストラクタは、それがいつ呼ばれるかを当てにすべきではありません。Perlは、ときどき、慣例で全て大文字の関数名を使います。この関数は、なんらかの方法でPerlによって自動的に呼ばれるかもしれないことを示します。perltieに書かれている、tieされたオブジェクトに使われる全てのメソッドなどが含まれます。deallocation.本当によいオブジェクト指向プログラム言語では、ユーザは、デストラクタが呼ばれるときを気にしません。起こるであろうときに、ただ、起きるのです。適切な時期にデストラクタが呼び出されることをまったく当てに出来ません。そのため、プログラマは、明示的にデストラクタを呼び、メモリや状態の後かたづけをする必要があります。違って、オブジェクトのデストラクタは、ほとんど、Perlでは必要とされていません。デストラクタがあるときでさえ、明示的呼び出しは、ありません。Personクラスの場合は、デストラクタを必要としません。いうのは、メモリの割り当て解除のような単純な問題は、Perlが面倒をみるからです。データ構造に循環性があるときです。down.)プログラムがメモリリークをしないことを期待するなら、この場合、自己参照を手動で削除しなければなりません。明らかに、エラーを起こしやすい状態で、これは、ただ今できるベストなことです。そのため、次のことが保証されます。オブジェクトが、最終的に適切に、破壊されます。オブジェクトに蓄えられているデータへのインターフェースです。これらのデータは、C++での、オブジェクトのデータメンバに少し似ています。見知らぬ人がデータとして、オブジェクトのデータメンバにアクセスできないことを期待します。その代わりに、オブジェクトのデータメンバにデータメソッド経由で、間接的にアクセスすべきです。このことはPerlで、重要なルールです。メソッドを通してのみなされるべきです。behave.Perlは、誰がどのメソッドを使えるかの制限を押しつけません。違いは慣例によるもので、構文にはよりません。(たぶん、変数としてのデータメンバに、下の方で記述するAliasモジュールを使わない場合は)。このマークは、慣例的に次のことを示します。密接なその知合い、つまりサブクラスのプライベートなものであることを示します。この区別はPerl自身によって、強制されてはいません。振る舞うことは、プログラマしだいです。field.メソッドを単純なデータにアクセスするものだけに限定する理由はありません。メソッドは、まったく、なんでもできます。メソッドは、オブジェクトかクラスを背景に呼び出されるということです。オブジェクトメソッドを示しましょう。representation.ですが、これらのメソッドはクラス自身ですべて実行できるので、このことは重要ではないかもしれないません。トレードオフがあります。文字列に手を加えたい時には、より便利です。内部的に、クラスを使う人だけでなく、クラスの作者自身が、データ表現に変更を加えることの盾にもなります。クラスでは、生きている人々の総数を追っておきたいでしょう。呼ばれるグローバル変数でそういうことができます。そのようにする唯一の理由は、人々が直接にクラスデータを得られるようにしたい場合です。言うだけで、それをいじることが出来ます。あなたの考えでは、そういったことは構わないのかもしれません。すると、変数が持ち出されることさえ、望んでいるかもしれません。持ち出されるのであれば、(パッケージの)グローバル変数でなければなりません。これがオブジェクト指向的なモジュールでなく、伝統的なモジュールであれば、そうすればいいでしょう。data.クラス変数をパッケージのグローバル変数にするやり方は、ほとんどの伝統的なモジュールで、期待されています。このやり方は、一般的に、ほとんどのオブジェクト指向のモジュールでは、むしろ下手なものと考えられています。クラスデータにアクセスするクラスメソッドを提供します。他人がモジュールの契約を支持し、そのために、その実装をいじくり回さないと信頼することができます。tieされたオブジェクトにすることもできます。file:ですが、たいていは、クラスデータをファイルスコープのレキシカル変数にしたいと思います。そのスコープ内で宣言された関数にアクセスできる間は、変数が割り当て解除されないことを保証します。一時的な値を与えられたグローバル変数では、働きません。コンストラクタに、次のような変更をするべきです。デストラクタが必要になります。そのことは、Perl自身が面倒をみます。モジュールを使うことも出来ます。inheritance.クラスデータを絶えず取り扱うやり方は、本当によくないことがわかります。十分に拡張的なルールは、オブジェクトメソッドから、直接にクラスデータを参照しないことです。なければ、拡張的な、継承できるクラスは作らないことです。ランデブーポイントにいなければなりません。オブジェクトメソッドからは。グローバル変数(クラスデータ)は、ある意味で、派生クラスの中で、"間違った"パッケージにあります。メソッドが動かされたオブジェクトのコンテキストではありません。