@nqounetです。
「Mooで覚えるオブジェクト指向プログラミング」シリーズの第2回です。
前回は、Mooを使った簡単なコードを動かしてみました。まだ読んでいない方は、先にこちらをご覧ください。
今回は、hasとsubを使って、データとロジックをまとめる方法を学びます。
スパゲティコードの問題
プログラミングを始めたばかりの頃、こんなコードを書いたことはありませんか?
掲示板のプログラムを例に考えてみましょう。投稿データを管理するために、$message_content、$message_author、$message_dateのようなグローバル変数をたくさん作ってしまうケースです。
変数がバラバラに散らばっていると、どの変数がどのデータに関連しているのか分かりにくくなります。また、投稿を表示する処理も、別の場所に書かれていることが多いです。
このように、データとロジックがあちこちに散らばっているコードを「スパゲティコード」と呼びます。麺が絡み合っているように、コードが複雑に絡み合っている状態です。
オブジェクト指向プログラミングを使えば、この問題を解決できます。
hasで属性を定義する
まずは、投稿の内容を管理するMessageクラスを作ってみましょう。
| |
hasは、クラスに属性を追加するための仕組みです。上記のコードでは、Messageクラスにcontentという属性を定義しています。
is => 'rw'は、この属性が読み書き可能(read-write)であることを示しています。
これで、投稿の内容はMessageオブジェクトの中にまとめられました。グローバル変数を使う必要はありません。
subでメソッドを定義する
次に、投稿を表示する処理もクラスの中に入れてみましょう。
| |
subはPerlでおなじみのサブルーチン定義です。クラスの中で定義したサブルーチンは「メソッド」と呼ばれます。
メソッドの最初の引数$selfには、そのオブジェクト自身が渡されます。$self->contentで、オブジェクトのcontent属性にアクセスできます。
これで、データ(content属性)とロジック(showメソッド)がMessageクラスの中にまとまりました。
まとめ
hasはクラスに属性を追加する仕組みであるsubはクラスにメソッドを追加する仕組みである- データとロジックを1つのクラスにまとめることで、スパゲティコードを防ぐ
- メソッドの第1引数
$selfはオブジェクト自身を指す
次回予告
次回は、オブジェクトを複数作成して、それぞれが独立したデータを持つことを確認します。オブジェクト指向の本領発揮です。お楽しみに。
