Featured image of post 第2回-データとロジックをまとめよう - Mooで覚えるオブジェクト指向プログラミング

第2回-データとロジックをまとめよう - Mooで覚えるオブジェクト指向プログラミング

グローバル変数だらけのスパゲティコードを卒業しませんか?Mooのhasで属性を、subでメソッドを定義して、データとロジックを1つのクラスにまとめる方法を初心者向けにやさしく解説します。

@nqounetです。

「Mooで覚えるオブジェクト指向プログラミング」シリーズの第2回です。

前回は、Mooを使った簡単なコードを動かしてみました。まだ読んでいない方は、先にこちらをご覧ください。

今回は、hassubを使って、データとロジックをまとめる方法を学びます。

スパゲティコードの問題

プログラミングを始めたばかりの頃、こんなコードを書いたことはありませんか?

掲示板のプログラムを例に考えてみましょう。投稿データを管理するために、$message_content$message_author$message_dateのようなグローバル変数をたくさん作ってしまうケースです。

変数がバラバラに散らばっていると、どの変数がどのデータに関連しているのか分かりにくくなります。また、投稿を表示する処理も、別の場所に書かれていることが多いです。

このように、データとロジックがあちこちに散らばっているコードを「スパゲティコード」と呼びます。麺が絡み合っているように、コードが複雑に絡み合っている状態です。

オブジェクト指向プログラミングを使えば、この問題を解決できます。

hasで属性を定義する

まずは、投稿の内容を管理するMessageクラスを作ってみましょう。

1
2
3
4
5
6
7
package Message {
    use Moo;
    has content => (is => 'rw');
};

my $msg = Message->new(content => 'こんにちは');
print $msg->content;  # こんにちは

hasは、クラスに属性を追加するための仕組みです。上記のコードでは、Messageクラスにcontentという属性を定義しています。

is => 'rw'は、この属性が読み書き可能(read-write)であることを示しています。

これで、投稿の内容はMessageオブジェクトの中にまとめられました。グローバル変数を使う必要はありません。

subでメソッドを定義する

次に、投稿を表示する処理もクラスの中に入れてみましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package Message {
    use Moo;
    has content => (is => 'rw');

    sub show {
        my $self = shift;
        print "投稿: " . $self->content . "\n";
    }
};

my $msg = Message->new(content => 'こんにちは');
$msg->show;  # 投稿: こんにちは

subはPerlでおなじみのサブルーチン定義です。クラスの中で定義したサブルーチンは「メソッド」と呼ばれます。

メソッドの最初の引数$selfには、そのオブジェクト自身が渡されます。$self->contentで、オブジェクトのcontent属性にアクセスできます。

これで、データ(content属性)とロジック(showメソッド)がMessageクラスの中にまとまりました。

まとめ

  • hasはクラスに属性を追加する仕組みである
  • subはクラスにメソッドを追加する仕組みである
  • データとロジックを1つのクラスにまとめることで、スパゲティコードを防ぐ
  • メソッドの第1引数$selfはオブジェクト自身を指す

次回予告

次回は、オブジェクトを複数作成して、それぞれが独立したデータを持つことを確認します。オブジェクト指向の本領発揮です。お楽しみに。

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。