終わりにはじめまして!東京スタジオでエンジニアをしている、吉田と申します。リリース後も、アップデートを繰り返していくオンラインゲーム。安定したサービスを提供しつつ、常に新しい遊びを創造していくというのは、なかなか難儀なものです。安全のために、動作実績のある既存のプログラムはできるだけ変更したくない。コードの保守性や可読性のために、共通機能を関数化/クラス化するなどのリファクタもしたい。エンジニアのあなたも、身に覚えがありませんか?それとも、「動いているコードは触ってはいけない」というルールを頑なに守って、リファクタを避けてはいないでしょうか?でもそれだと、既存の仕組みに縛られて、新しい機能の実装が難しくなるし、アップデートと共に少しずつ大きくなって、今やなんの機能なのかわからないクラスなどがあると、バグの対応にも一苦労ですよね。その上担当者も変わったりして、もう誰も中身を把握していない・・・、なんて状態になる前に、上手にリファクタしつつ、安全性も保ちながら、コードを保守していきたいものです。先日4周年を迎えた「幻塔戦記グリフォン」(以下グリフォン)では、C++で書かれた、リアルタイム通信機能を担うサーバーがあります。4年もたつと、古いソースも多々あり、上記のような問題に常に直面しています。今回は、新しい機能を実装するにあたって、私が行った取り組みについて紹介します。現状のソースグリフォンでは、いろんなタイプのクエストやバトルがあり、それぞれがクラスで表現されています。CRoomBaseには、共通機能(主にゲーム内のオブジェクトの管理)が入っています。それぞれの子クラスには、大まかに入室までの処理ゲーム開始までの処理ゲームのルール処理ゲーム戦績の保存ゲーム終了後の処理こんな機能が実装されています。現状のソースコードを眺めてみると、こんな状態になっていました。CPvPRoomとCMockBattleRoomは、入室してゲーム開始するまでの流れが違うが、ゲームルールは一緒CBattleRoyalRoomは、CMockBattleRoomをコピペし、一部機能を修正して作ったっぽいその後、CMockBattleRoomにも独自の機能が追加されてるっぽいその他、同じ様でちょっと違う処理が随所にみられるだんだんつらくなってきた・・・もう既存のソースは見たくない・・ってなりました。新しいゲームを提供するため、新たにルームクラスを作ることになりました。加えて、今回初めて実装する機能さてどうしたものか・・・まず簡単に思いつく方法は、CBattleRoyalRoomをコピーして、CNewBattleRoomを作る。できたCNewBattleRoomのうち、いるものだけ残していらない物は削除する(もしくは使わないなら放置)CQuestRoomの一部機能をコピーしてCNewBattleRoomに入れるあと、足りない機能を入れるこんな感じでしょうか。共通化できそうな機能も、それぞれのルームで微妙に違ってたりするし(どうしてこうなったのか、もう分からないし)これもつらいのです。—-そして悩んだ結果、よし、今回だけは、コピペを許そう。今後はコピペしないで済むようにする。そのために、各機能をモジュール化して、そのモジュールたちを付け替える事で、ルームを表現できるようにします。-共通モジュール今回だけは、既存ソースからコピペして、各モジュールを作ります。Modules...{...};こんな風に定義します。CNewBattleRoom;こんな感じです。CHogeBattleRoom;とすればいい訳ですね。作って、機能を分離すれば良いのです。CHogeBattleRoom;こうなります。いろんなモジュールを多重継承してるけど、ひし型継承問題が起こるんじゃ?と思いましたか?そんな時のために、C++には仮想継承という機能があります。指定で継承すれば、ひし形問題は起こらずに済むんですね。ジレンマに対する弊社での取り組みについて紹介させて頂きました。エンジニアの腕のみせどころです。インフラエンジニアの趙です。業務では、主にゲーム公式サイトのインフラまわりを担当しています。2017.12.13こんにちは、エンジニアの佐藤です。みなさんは分割キーボードをご存知でしょうか。2015.10.22こんにちは、エンジニアの相良です。1年に1回くらいの頻度で「クソゲー開発コンテスト」というイベントを行っています。WordPress.。