6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Minecraftサーバ開発・運営Advent Calendar 2021

Day 5

プラグイン開発者のためのオブジェクト指向

Last updated at Posted at 2021-12-04

この記事の対象者

変数や代入、関数はわかるけど、classって何?extends、implementsって?という人が対象です。

オブジェクト指向プログラミング

オブジェクト指向プログラミング(OOP)はシステムを設計するための考え方です。
役割で仕事を分担し連携することでシステムを構築していきます。
この分担した仕事の担当者がオブジェクトです。
そしてOOPで重要なのは、このオブジェクト同士の__コミュニケーション__です。
undraw_Working_re_ddwy_50.png

オブジェクト

オブジェクトは、『状態』と『振る舞い』を持っています。
『状態』とは、オブジェクトが保持しているデータを指します。
『振る舞い』とは、仕事の処理方法や処理すること自体を指します。

これ以外にオブジェクトにはインターフェイスがあります。
人間は言語によってコミュニケーションしていますが、オブジェクトの場合はメッセージパッシングによってコミュニケーションをします。オブジェクトがオブジェクトに対してメッセージを送信し、受け取ったメッセージをオブジェクトは処理します。「これやっておいて」って会社で言われるのと似ていますね。このメッセージの窓口を定義したものがインターフェイスです。送信者はインターフェイスで決められた方法でメッセージを送信します。インターフェイスのおかげで、どうやって処理しているのか知らなくても担当オブジェクトに仕事を頼むことができます。このように中身を外から見えなく(隠蔽)して外部のオブジェクトが考慮するべきあれこれを減らすことをカプセル化と言います。

ここからは純粋なOOPではなく、OOPを活用する上で必ず出てくる概念や言葉を説明します。

オブジェクト化

仕事内容は同じでも異なるデータを複数の人がそれぞれ処理するケースがあります。この場合オブジェクトは複数になります。仕事内容を定義したものがクラスです。クラスを設計図として、実際にデータを保持して仕事をしてくれるオブジェクトを生成することをオブジェクト化と言います。設計図から実体を生成するため、オブジェクトはインスタンスとも呼ばれます。インスタンスと呼ぶ場合、オブジェクト化はインスタンス化と呼ばれます。滅多なことがない限りオブジェクトとインスタンスは同じものなので各自で読み替えてください。また、多くの言語でオブジェクト化はnewキーワードによって記述します。

継承

同じ特徴を持つけど中身が違ったり追加要素があったりするものを実装する際に継承を使います。簡単に言うと、設計図(クラス)を使いまわして拡張することです。例えば犬と猫は鳴き声が異なりますが、生物であることは同じです。よって生命維持を生物クラスで定義し、それを継承することで犬クラスと猫クラスでは鳴き声だけを実装するだけで済みます。生物クラスのように継承されたクラスのことをスーパークラスと言います。犬クラス、猫クラスはサブクラスと言います。犬クラスは生物クラスを継承しているので、犬オブジェクトは犬オブジェクトとしても生物オブジェクトとしても扱えます。猫オブジェクトも同様です。特徴によって異なるクラスのオブジェクトでも同じように扱えるため便利ですね。PHPではclass 犬 extends 生物のようにextendsキーワードによって継承を記述します。

抽象クラス

継承されることを前提と抽象クラスがあります。インターフェイスだけ用意して中身を未定にしてサブクラスに実装してもらうことができます。不完全なため抽象クラスはオブジェクト化できません。しかしインターフェイスは定義されているため、先程の生物クラスのように継承したクラスのオブジェクトを同じものとして扱うことができます。PHPではabstract class 生物のように抽象クラスを定義します。抽象クラスは部分的に処理を実装していますが、完全にインターフェイスだけ定義したものがあります。そういったものはinterface 鳴くのようにclassではなくinterfaceキーワードを用いて定義します。そしてinterfaceで定義した場合、extendsではなくimplementsを使います。

名前空間

ファイルごとに格納するフォルダを分けて整理するのと同じように(ファイルとフォルダの違いわかるよね?)、クラスを定義する場所を分けて整理するときに名前空間を使います。PHPではnamespaceキーワードで記述します。名前空間が異なれば同名のクラスも定義できます。そのため、ソースコード内で記述されているクラスがどの名前空間のものなのか指定するために完全修飾名でクラス名を記述するか、use文を書く必要があります。

アクセス修飾子

クラスの外からアクセスできるもの(public)、外からはアクセスできないけど継承したクラスからはアクセスできるもの(protected)、自分自身しかアクセスできないもの(private)。こういったアクセスできる範囲を制限するものがアクセス修飾子です。クラスを定義する際、メンバ関数やメンバ変数に設定できます。カプセル化の観点から外からアクセスされるべきでないものはprotectedやprivateで隠しましょう。

まとめ

プラグインを書いていてわからないことが出てきたとき、オブジェクト指向がわかれば自分でPMMPのソースコードを読んで問題を解決することができたりします。プラグインのソースコードを整理することもできます。また、役割でクラスにまとまっているので再利用することもできて開発が楽になります。オブジェクト指向を活用してプラグイン開発を効率化していきましょう。

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?