時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

ゲームで使える SOLID原則 まとめ

f:id:tkymx83:20190126012030j:plain:w1000

こんにちは、これまで五回の記事を通じてSOLID原則を紹介してきました。

tkymx83.hatenablog.com
tkymx83.hatenablog.com
tkymx83.hatenablog.com
tkymx83.hatenablog.com
tkymx83.hatenablog.com

ここで、僕が思うSOLID原則について語ってみようかなと思います。

責務ってなんだ?

SOLID原則では責務の分離がたかだかに語られています。「単一責任の原則」や「インターフェース分離の原則」などがその例だと思います。責任を分離して一つ一つをシンプルにしようというものでした。

しかし、そもそもの責任ってなんでしょうか?

責任というくらいだから、なにか物事を行うときの面倒を見てくれるものでしょうか?なにか問題があったときに謝ってくれる存在でしょうか?

現実世界で責任といえば、領域の分担だと思います。ゲームづくりでも、ゲームの面白さは企画に責任があり、ゲームの品質はエンジニアに責任がある。ゲームの世界観はデザイナの責任。といろいろな責任領域で別れていると思います。このようにゲーム業界では責任を分断することで、分業を行ってきました。それでは、なんで責任を分ける必要があるのでしょうか?

ゲームの文脈でいうとそれは、面白さと品質をどちらも担保しようと思うと、中途半端な結果になってしまうからだとおもいます。面白いゲームを作ろうとして、面白いアイデアが浮かんだとします。しかし、それと同時に現実的ではないと思ってしまうと面白いアイデアを発展させる前に考えることをやめてしまいます。

このように、2つの責任を負っているとそれぞれが足かせになって物事を決められないことが多々あると思います。

責任を分離するということはそういうことだと思います。プログラムの設計でも同じです。クラスの中に2つやりたいことがあった場合に、片方の変更があったときにもう片方の釣り合いを取らないといけません。いちいち釣り合いを取るのははっきり言ってめんどくさいですし、釣り合いを取ることができないまま進んで行くとどこかで破綻します。

ものごとを抽象的に見れる人は強い

他にSOLID原則の中ではインタフェースを使った抽象化の話がよく出てきます。「OCRの原則」や「リスコフの置換原則」や「依存性逆転の原則」がそれに当たります。どれも、インタフェースをまとめることで抽象的なレイヤーで物事を考えようとしています。

なぜ物事を抽象的に見ることが大切なのでしょうか?

一旦小説家になってみるとわかりやすいかもしれません。小説家が小説を書くときにいきなり書き始めることはないと思います。どんな小説家も全体像を思い描いて、自分の伝えたい物語をイメージして、それに対して肉付けをするように細かい仕様や物語を考えていきます。全体像を始めに考える理由は自分の伝えたいことをブレさせないためです。

第一章から順々に書いていってしまうと、途中で面白そうな書き方を見つけてどんどんと横道にそれていきます。最終的には何を言いたかったのかわからないような小説になってしまうでしょう。

それは、ひとえに物語の一貫性がなくなっているからです。

プログラムも同じだと思います。抽象的に物事を本質を捉えて設計する。その後に具体的な機能を肉付けしていくことで、自分の作りたいものをブレることなく素直に表現することができます。はじめから具体的に作っていくと、途中でもっと良い表現方法を見つけてしまい、一貫性の無いプログラムが出来上がってしまいます。そうなってしまうと、後々変更するときに仕様の違いで例外が生まれ、それによってどんどんと変更しにくいものへと変わっていくのです。

いろいろ話したが

今回話した内容はSOLID原則の考えの中でも一部だと思います。他にも、どんなものを抽象化するのか?責任の具体的な単位は?などいろいろな疑問が浮かんでくると思います。

このブログでもそれに一つ一つ答えていきたいですが、今日はこれくらいにしたいと思います。付き合っていただきありがとうございました。

PS : 文章がブレブレになってしまうのは僕の抽象力がまだまだ足りないのかなと思います。