ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

リファクタリング

まとめというか感想

本で紹介されているリファクタリングを一通り試してみた。 まず先にデザインパターンを勉強しておいて良かった。勉強していなかったらたぶん半分も理解できていなかっただろう。 よりオブジェクト指向が理解できた気がする。 プログラムを書く段階からリファ…

継承を分割する

コードを書いていきどんどん機能を追加していくと、ひとつのクラス階層がいろんな仕事をすることになってしまうことがある。このようなときは継承を分割し、委譲を使って整理する。 手順 ・元のクラス階層での仕事を列挙 ・移動する仕事を決定 ・移動する仕…

委譲を隠す

あるクラスが別のクラスを利用しているときに、その利用しているクラス内にある委譲クラスも利用しているような場合がある。 public class Server { Delegate delegate; ... Delegate getDelegate() { return delegate; } ... } public class Delegate { voi…

継承を委譲に

C++やJavaを使っているとついついクラスを継承してしまいがちになってしまう。継承は親クラスの機能をすべて使うことのできる強力な機能である。でも本当に必要なのかちゃんと考えなければならない。 まず、IS-A関係になっているか。また「リスコフの置換原…

モデルとビューに分ける

データを保持する部分と表示する部分がいっしょになっていると、表示方法を変えるときに変更するのが大変。あるいは見た目は変えずにデータの処理部分を変えるのも難しい。そこで、データを保持する部分と表示する部分を分ける。つまりModel View Controller…

Factory Methodでコンストラクタを置き換える

インスタンスを作成するときはnew演算子でクラス名を指定する。つまり呼び出す側はそのクラス名を知っていなければならない。それを隠蔽するのがFactory Method。 たとえば、プレイヤーが魔法を使うような場合。魔法には低レベルと高レベルの2種類があり、プ…

エラーコードを例外で置き換える

エラーが起きたことをエラーコードで表現していると、エラーコードの伝播処理が大変になることがある。ある関数でエラーが起きたとき、エラーコードをreturnし、上位でエラー処理を行う。そこでエラー処理しない場合はさらに上へエラーコードをreturnしなく…

タイプコードをState/Strategyパターンで置き換える

タイプコードをサブクラスで置き換える方法(id:toburau:20070911)の場合、タイプコードが実行中に切り替わるような場合に対応できない。また、Javaでは多重継承できないので、すでにサブクラスになっていたときはタイプコードをサブクラスで置き換えられない…

自己カプセル化

カプセル化とはオブジェクトの内部の仕様を外部からは隠蔽すること。外部からは公開されている部分しかアクセスできないため、独立性が高まる。 例えばクラスのフィールドへのアクセスはgetterメソッドやsetterメソッドといったアクセサ経由でのみ可能にする…

タイプコードをenumで

この前のタイプコードをクラスで置き換えるという日記(id:toburau:20070910)を書いていて、C++ならenumでいけるんじゃない?と思って確かめてみた。 class Item { public: typedef enum { WEAPON, ARMOR, SHIELD, } Type; private: Type itemtype; public: I…

タイプコードをサブクラスで置き換える

前回はタイプコードをクラスで置き換えたが、今回はサブクラスで置き換える方法。タイプコード別に動作が異なるようならサブクラスで置き換える。 // アイテムクラス public class Item { public static final int ITEMTYPE_WEAPON = 0; public static final…

タイプコードをクラスで置き換える

オブジェクトの種類を表すタイプコードにintのような基本型で表現することはよく行う。しかしそれでは型チェックがうまく効かないことがある。 public class Item { public static final int ITEMTYPE_WEAPON = 0; public static final int ITEMTYPE_ARMOR =…

クラスの抽出

コーディングしていくと、あれもこれもとクラスにいろいろ機能をつけてしまいがち。するとそのクラスが持つ責任が多くなってしまう。こんなときはその責任がクラスとして抽出できないか考えてみる。責任とは責務ともいい、英語でresponsibilityのこと。 クラ…

コードが長すぎたら、メソッドを抽出しよう

プログラムを書いていくと、どんどんとメソッドの中身が長くなっていきがち。長くなりすぎてコードが読みにくくなってしまったら、処理がまとまっている部分を新たなメソッドとして抽出する。 メソッドを抽出する手順 ・新しいメソッドに名前をつける 何をす…

ヌルオブジェクトを導入する

あるオブジェクトがnullがどうかのチェックが頻繁に出てくるようなら、ヌルオブジェクトを導入することを考える。 たとえば、次のようなnullチェックをしているコードがあった場合。 public class Player { private final Magic magic; public Player() { ma…

アサーションを使おう

プログラム中で「この変数はこうなっているはず」とか「ここにはこないはず」というような場所があったらアサーションを使う。本にはアサーションと書かれているが、私はアサートと言っていた。 たとえば、変数valueの値が正のはずというときは、Javaで次の…

制御フラグをなくす

制御フラグってのは処理の流れを制御するフラグのこと。たとえば、次のようなコード。 int data[MAX]; int target; bool found = false; for(int i=0; i

マジックナンバーは使うな

マジックナンバーとは定数の数値そのもののこと。100,255とか。直接プログラムコード中に数値が書かれていると、それが何を意味するか分かりにくい。また、その数値がコード中にいろんな箇所に散らばっていると修正するとき大変。 ということで、マジックナ…

まずは基本

リファクタリングとは、 外部から見たプログラムの振る舞いを変えずに、プログラム内部の構造を改善すること。 自分にとってリファクタリングが必要だと思われるコード。 重複している ある処理をコピペで書いてしまうことがあり、似たようなコードがあちら…

リファクタリング入門

結城さんの本とJava言語つながりで、次はリファクタリングについての勉強をすることに決定。 勉強に使う本は、「Java言語で学ぶリファクタリング入門」 さて、問題はどうやってこの日記を更新するかということ。前回はデザインパターンだったので1日1つのパ…