:lang: ja
:doctype: article

## 2020/11/10 Alpha版の経緯と意義──コード変更の軌跡

[%hardbreaks] 
(文責：掘江弘己)
OSDN表示名でいうところのHourierです (システムの都合上英字表記にしているものなので、本来の名義を文責と致します)
本記事では、変愚蛮怒の設計とコードについて様々な課題を解決してきた経緯をお話します
どうしても開発の技術的な部分に触れますので専門的な内容もありますが、予めご了承下さい

[%hardbreaks] 
ことの発端は2018年、面白半分でIRCにお邪魔したことに始まります
そこでDeskull氏はじめ様々な方と交流があり、当時は些細な消耗品の効果をソースコードを見て確認するようなことをしていました
この間、どこかでリポジトリやコード差分を見ながらいくつかコメントを出したりしていました
それらの一部は、筆者が本格的にコードへ触れる前に結実しています

[%hardbreaks] 
その後氏の 「グローバル変数を関数への引数に繰り込む」というリファクタリング作業を横目で見ている内、真似っ子で自分でも行けるんじゃないかと思い始めました
具体的にはlink:https://osdn.net/projects/hengband/scm/git/hengband/commits/84d7814bd5590b87bfcb50fe25884f22edbf8e0d[こんな作業]です
かなり機械的に実行できそうだと判断したので、2020年1月、OSDNでアカウントを取得し、氏と共にリファクタリング (コード整理)作業を開始しました
問題のグローバル変数は、筆者が参画した時点で約3300箇所ありましたが、約70箇所まで削減しました
これ以上は「C言語そのものの仕様で繰り込み不可能」と判明したり、「影響範囲が膨大過ぎる」と判断したりで、この作業は終了としました
この作業に2週間＋αかかりました

[%hardbreaks] 
続けて、使われていないプリプロセッサの削除に着手しました
Deskull氏の記事にもあるように、変愚蛮怒におけるプリプロセッサは主に環境の違い (OSまたは言語)を吸収するための特別な処理をメインとしています
ところがそれらは増やすばかりで、どんなことがあっても削られることはありませんでした
1997年のZangband v2.2.1時点でモンスターの大量追加がなされ、メモリ容量的に「昔のOS」では動作しなくなりました
しかしプリプロセッサは残され、2020年になるまで延々と放置され続けていました
v3.0.0 (この頃はv2.2.2と呼んでいました)では、「不要と判断した環境依存の処理」を全て削除しています
この作業と、その他の細々とした旧式コードの削除に10日ほど要しました

[%hardbreaks] 
その後は開発チーム内で相談し、「リアルエルドリッチホラー」といえる超巨大ファイル＆関数群の解体を主目的にして作業を進めました
作業内容は多岐に渡りますが、絞ってもなお以下の観点があります：

 * 長すぎる関数 (最大で2400行！)を、5～50行程度の関数群に分割する
 * 分割後の関数名を、処理内容に即した具体的な名前にする
 * 長すぎるファイル (最大で7000行！ v2.2.1リリース時点の最悪期で9700行！！)を、最小5行～平均250行～最大600行程度のファイル群に分割する
 * 分割後のファイル名、場合によっては分割前のファイル名も、処理内容のまとまりに即したファイル名に命名/改名する
 * ある程度大きな概念 (例：魔法)でまとめられるファイル群をフォルダに分割する
 * 基幹レベルの循環インクルードを解消してファイルを追加してもコンパイルエラーが発生しない状況を作る
 * コード読解の役に立たないコメントを削除し、代りに関数の役割をDoxygenで記述する
 * 番号系の定数定義を列挙子 (enum)に分割する
 * 変数スコープを可能な限り小さくする
 * 複数ファイル合同のヘッダを、1ファイル１ヘッダに分割する
 * 多数のファイルから参照される構造体定義は、それ単体を1つのヘッダに分離定義する

[%hardbreaks] 
以上の作業を1500行以上のファイルほぼ全てについて行い、約半年かけてほぼ解体が完了しました
結果、v2.2.1時点で77個だったファイルは、筆者の参画時点で127個を経て738個 (9.6倍)に、同ヘッダは21個から115個を経て850個 (40.5倍)に増殖しました
まだ残務もありますが、現状のコードは「数こそ多いが独力でも何とか読める」というレベルではないかと自負しています

[%hardbreaks] 
2020年8月下旬、作業の終了宣言をIRCで出した頃には、元のコードとはあまりにも乖離が広がりすぎました
Angbandからのパッチはもちろんのこと、変愚蛮怒からの各種バリアントからすらも何らかの機能をバックポートすることが (丁寧に手動マージしない限りは)不可能になりました
開発チーム内で相談した結果、従来つけていたv2.2.2ではなく、v2.4.0ですらなく、より大幅なバージョンアップであるv3.0.0へ切り替えることになりました

[%hardbreaks] 
以上が、このゲームをv3.0.0としてリリースする運びとなった事情です
コードの内部まで踏み込んだ専門的な詳細は、拙著ブログの方でも紹介していきます
これからも変愚蛮怒の変わらぬご愛顧をよろしくお願いします
