any型を排除せよ:リファクタリングの記録
年末の大掃除として、一括採点のコードを整理しました。 今回のテーマは「any型の排除」。 プログラミングの話ですが、できるだけわかりやすく紹介します。
「型」とは何か
プログラミングにおける「型」とは、データの種類のことです。
たとえば、Excelで考えてみてください。 セルに「42」と入力すると、Excelはこれを数値として扱います。 「田中」と入力すると、文字列として扱います。 数値には計算ができますが、文字列に計算はできません。
プログラムでも同じです。 「この変数には数値が入る」「この変数には生徒の名前が入る」と決めておくと、 間違った使い方をしたときにコンピュータが教えてくれます。
- 数値型:点数、人数、ページ番号など
- 文字列型:生徒の名前、クラス名など
- 真偽値型:採点済みかどうか(はい/いいえ)
- 配列型:生徒の一覧、設問の一覧など
一括採点では、TypeScriptというプログラミング言語を使っています。 TypeScriptは、この「型」を厳密にチェックしてくれる言語です。 「点数を入れるべきところに名前を入れてしまった」といったミスを、 プログラムを動かす前に発見できます。
any型という「なんでもあり」
ところが、TypeScriptにはanyという特殊な型があります。 これは「なんでもあり」という意味で、型のチェックをスキップします。
テストで言えば、「この欄は何を書いてもOK」という状態です。 楽ではありますが、採点する側は困りますよね。
プログラムでも同じで、any型を使うと、 間違いがあっても気づかないまま動いてしまいます。 そして、実際に使ったときに突然エラーが起きる。 これがバグの原因になります。
開発を急いでいるときや、複雑な処理を書くときに、 とりあえずany型で逃げてしまうことがあります。 「あとで直そう」と思っていても、そのまま残りがち。 これが「技術的負債」と呼ばれるものです。
今回やったこと
一括採点は、Electronというフレームワークで作られています。 Electronでは、「メインプロセス」と「レンダラープロセス」という 2つの部分がデータをやり取りしながら動いています。
このデータのやり取り(IPC通信)の部分に、any型が多く残っていました。 「生徒のデータを送る」「採点結果を返す」といった処理で、 送る側と受け取る側で型が一致していないと、バグの原因になります。
今回のリファクタリングでは、データベース(Prisma)が提供する型を活用しました。 データベースの設計から自動生成される型を、プロセス間の通信でも共通して使うことで、 「送る側が想定しているデータの形」と「受け取る側が期待しているデータの形」が 必ず一致するようになりました。
- IPC通信まわりのany型を排除
- Prismaの型をメイン・レンダラー間で共通利用
- 未使用の古い型定義を削除(45%削減)
なぜこんなことをするのか
こうした作業を「リファクタリング」と呼びます。 ユーザーから見た動作は変わりませんが、内部のコードが整理されます。
教室の掃除に似ているかもしれません。 授業はできるけど、どこに何があるかわからない教室と、 整理整頓されていてすぐに必要なものが取り出せる教室。 長期的に見れば、整理されている方が効率的です。
ソフトウェアも同じで、定期的にコードを整理することで、 新しい機能を追加しやすくなり、バグも減ります。 年末の大掃除として、良いタイミングでした。
ユーザーには見えない作業ですが、ソフトウェアの品質を保つために大切なプロセスです。 これからも定期的に整理を続けていきます。