| Game Coding Complete 053 |
|---|
|
3.1スマートな設計を心がけよう
3.1 3. スマートな設計を心がけよう アイザック・アシモフのSFシリーズであるファウンデーションシリーズには「心理歴史学」と呼ばれる架空の学問分野が登場する。これは社会傾向とマクロなイベントを高い確率で予測するという学問だ。物語の中では、各歴史家は新しい法則を提供して科学の発展に貢献することが求められた。プログラマとしての仕事もこれに似ている。あなたが新たに作るどのモジュールもクラスも、コードベースの可能性と有益性を伸ばす機会をあなたに与えてくれるということである。しかし これを効率的に行うには、さまざまなプロジェクトで何年にもわたって使えるようなコードを目指した設計方法を学ばなければならない。 優れたコードをオブジェクト指向言語で設計することは、CやPASCALC のような手続き型言語で設計するよりも難しい。なぜなら、C++のようなオブジェクト指向言語は極めて強力な言語で柔軟性を持つため、一見シンプルに見えながら非常に複雑なシステムが作れてしまうからだ。これはよくもあり悪くもある。気づかないうちにトラブルに巻き込まれることもある。このよい例がC+のコンストラクタだ。プログラマの中には、間違ったコンストラクタを使ってコードを書くことがある。例えば、初期化ファイルからデータを読み取ろうとするがそのファイルが存在しない、といったケースがこれに当たる。しかしコンストラクタに間違いがあっても、エラーは表示されない。その結果、間違ったオブジェクトが残り、再び使われることもある。例外処理を使えば間違ったコンストラクタを見つけることもできるが、間違いのないコンストラクタを書くことを習慣づけたほうがはるかによい。仮想関数の間違った使い方もトラブルに繋がる。例えば、経験の浅いプログラマは将来的に拡張するときに便利だと思ってクラスの中ではすべてのメソッドを「virtual 」に指定することがあるが、これは間違いだ。プラットフォームによっては、仮想関数はとても高いものにつくことがあるからだ。オブジェクト指向プログラミングの概念を盲目的に適用するよりも、しっかりと考えたうえで設計することのほうが重要なのである。 ソフトウェアの設計方法を改善することで仕事の効率性は向上する。何回かキーをたたくだけでシステムを改造できれば非常に楽だろう。プログラミングには、こうしたコマンドコントロール方式を使うに限る。そういった意味では、プログラマにとってはプログラミングテクニックよりもむしろアーティストとしてのセンスのほうが重要なのかもしれない。 あなたにしてみれば大傑作のつもりで書いたコードが、他のプログラマにはまったく違って見えることもある。例えば、クラスを階層化したときのクラス間の複雑な関係は、あなたの説明なしでは理解が難しかったり、理解できなかったりする。プログラムドキュメンテーションは急いで書かれることが多いため、ほとんどが内容的に不十分で、しかも誤解を生むようなものさえある。 設計でプログラマが陥りやすい落とし穴がいくつかある。プログラミングのノウハウの前に本章ではこういった過ちを犯さないようにするためにはどうすればよいかについて見ておくことにしよう。 |