java:Enumによりコード値に意味を持たせ可読性を向上させる

javaのEnum(列挙型)を使用するメリットとしては、一般的に「使用可能な定数を明確化できる」「定数を複数のクラスで使い回せる」といったメリットが挙げられます。
実際に使用していて、コード値に意味を持たせられるというメリットもありそうだったので、記事に残します。

コーディングをしていると、コード値を用いた方が便利な場合が間々あります。
例えば、RPGの道具に対して、「weakSwordにはID0、normalSwordにはID1、strongSwordにはID2を割り振る」といった具合です。
コード値を用いれば、コード値を用いて配列操作することが可能になりますし、DBでマスタ管理する際にも便利です。

しかし、コード値には「人間が理解し辛い」というデメリットがあります。
コンピュータで処理する分には効率が良いのですが、人間から見たら「IDが0ならweakSword、IDが1なら…」といった具合で、コード値が何を意味しているのかを予め知る必要が出てきてしまいます。
コード値とその意味の対応付けを人間が行うことで、読み間違い・書き間違いといったバグに繋がるミスも起こりやすくなります。

そこで、Enumでコード値とその意味の対応付けを行えば、「ソースコード上は意味のある単語、コンピュータ上はコード値」という形にできます。
そうすることで、コード値とその意味の対応付けを人間が行う必要が無くなり、読み間違い・書き間違いを未然に防ぐことができます。

以下、サンプルコードです。

【サンプルコード】

・ItemEnum.java

・ItemManagementMain.java

【実行結果】


いかがでしたでしょうか。

Enumを始めて知った時は何のために使うのか分からなかったのですが、慣れてくると便利だと思うようになりました。
今回は、実際に使って便利だった点を一つ挙げて記事にしてみました。

これからも、役に立つと思ったことがあればどんどん記事にしていきたいと思います!

javaでのAbstract Factoryパターン

Abstract FactoryパターンはFactory Methodパターンを発展させたもので、生成するオブジェクトの組み合わせを間違えないために、1つのFactoryクラスに複数のオブジェクトの生成処理を実装するようにしたものです。

今回は、RPGのキャラクター作成を模したサンプルコードを作成してみました。
キャラクターの職業毎に、職業を示すオブジェクトとスキルを示すオブジェクトを生成します。
両オブジェクトの組み合わせ方を間違えないように、Abstract Factoryパターンにより組み合わせ方を限定しています。

【サンプルコード】

・AbstractJob.java

・WarriorJob.java

・MagicianJob.java

・AbstractSkill.java

・WarriorSkill.java

・MagicianSkill.java

・AbstractJobFactory.java

・WarriorFactory.java

・MagicianFactory.java

・CreateJobMain.java

【実行結果】


いかがでしたでしょうか?

デザインパターンの勉強をしていて、個人的に一番わかりにくいと思ったのは今回紹介したAbstract Factoryパターンです。
このデザインパターンは「複数のオブジェクトを組み合わせる場合に、その組み合わせ方を間違えないようにする」という意図を持ったデザインパターンなのですが、「Abstract Factory(抽象的な工場)」という名前からこの意図を読み取るのは難しいと思いますし、クラス図やサンプルコードを眺めても複雑で意図を理解するのは難しいと思います。
今回の記事で、その意図が伝われば幸いです。

まだ紹介していないデザインパターンもありますので、これからも少しずつ紹介していきたいと思います!

javaでのFactory Methodパターン

Factory MethodパターンはTemplate Methodパターンをオブジェクト生成の場面に適用したもので、オブジェクト生成の処理を共通化することができます。

今回は、RPGのキャラクター作成を模したサンプルコードを作成してみました。
キャラクターの職業毎にクラスを分けており、クラス毎に微妙にオブジェクト生成時の処理が異なっていますが、各々のクラスのオブジェクト生成処理を共通化することができています。

【サンプルコード】

・AbstractJob.java

・Warrior.java

・NormalPerson.java

・AbstractJobFactory.java

・WarriorFactory.java

・NormalPersonFactory.java

・CreateJobMain.java

【実行結果】


いかがでしたでしょうか。

前に紹介したTemplate MethodパターンとFactory Methodパターンは似ているので、合わせて覚えておきたいパターンだと思います。
実務でも、「~Factory」という言葉を良く聞きます。「~Factoryはオブジェクトを生成するクラスだ」という知識があるだけでも、開発者同士のコミュニケーションがスムーズになると思います。

では、よいお年を!

javaでのTemplate Methodパターン

Template Methodパターンは、処理(メソッド)の中で共通している箇所を抽象クラスとして抜き出すことで、重複した記述を排除し、更に処理の流れも規定する手法のことを指します。
手続き型言語でも共通する箇所を子メソッドとして抜き出すことをしますが、子メソッドとして抜き出してしまうとその子メソッドの使い方までは規定できず、子メソッドを誤った使い方をされてしまう可能性が出てきてしまいます。

サンプルコードとして、RPGのダメージ計算を模したプログラムを作成してみました。
「ベースのダメージ量に対してランダム化を行い最終的なダメージ量とする」という処理の流れを規定できていることがポイントです。

【サンプルコード】

・AbstractDamageCalc.java

・PhysicsDamageCalc.java

・MagicDamageCalc.java

・DamageCalcMain.java

【実行結果】

 ※第1引数に-1、第2引数に1を指定した場合


いかがでしたでしょうか。

手続き型言語に対するオブジェクト指向型言語の利点として、特定のルールに従ったコーディングを他の開発者にさせやすくなるというものがあり、バグの混入を未然に防ぐことができます。
共通処理の使い方を指定できるTemplate Methodパターンは、その利点が良く分かるパターンの一つだと思います。
抽象クラスの使い方として、このような使い方は覚えておいて損はないと思います。

では、また次回!

javaでのFacadeパターン

Facadeクラスとは、使い方が複雑になっているクラス群をまとめ、使いやすい形のインターフェースとして外部に提供するクラスのことを指します。
デザインパターンでは、このFacadeクラスを利用するパターンをFacadeパターンと呼びます。
(ちなみに、Facadeは「窓口」を意味する単語です)

サンプルコードとして、RPGのダメージ計算を模したプログラムを作成してみました。
RPGのダメージ計算は複雑で、そのRPGに詳しくない人が正しく計算式を実装するのは困難なのですが、Facadeクラスを用いることにより、Facadeクラスの利用者は詳しい知識を持たずとも正しく計算式を実装することが可能となります。

【サンプルコード】

・PhysicsBaseDamageCalc.java

・MagicBaseDamageCalc.java

・DamageRandomize.java

・DamageCalcFacade.java

・DamageCalcMain.java

【実行結果】

 ※第1引数に-1、第2引数に1を指定した場合


いかがでしたでしょうか。

デザインパターンはオブジェクト指向プログラミングのプログラミング手法をまとめたものなのですが、このFacadeパターンは手続き型言語にも応用が可能です。
複雑な処理を共通クラス・共通関数・共通スクリプト等のような形で切り出して利用者側に意識させないようにする、というのは現場でも良く使う手法なので、覚えておいて損はありません。

では、また次回!