一日中リファクタリング。あまり深く考えることが無いので非常に楽。
ホスト側のソースを出来るところから書き換えている。
まずはテストコードを書いたり、プログラミングスタイルとか変数名とかを直したり、自前の文字列処理をライブラリ関数に置き換えたり、重複している処理をまとめたりといった整理整頓から。ロジックの修正は、こうやってテスト方法を用意し、ソースを見通しの良い状態に整理してから始める。
そもそもこのプログラムの大部分は外部装置との通信に関係しているのだが、こういった部分の修正はファームウェアのソースも合わせて行う必要がある。ちょうど今はファームウェアの開発機が壊れていてファームウェアをいじれない。なのでどのみちホスト側のコードの整形からしか手を入れられないという理由もある。

いまとりかかっているコードの問題点は
横着

  • インデントが乱れている
  • 使われていない変数がたくさんある
  • メンバ変数・グローバル変数・一時変数(関数の引数)に同じ名前のものがある
  • newで確保した配列がdelete[]でなくdeleteで破棄されている

スタイル

  • 定数と変数がひと目で区別できない
  • 関数の戻り値の意味が不明

設計

  • クラスの間の役割分担が不適切(MVCのMが画面描画までしてる)
  • ファームウェアと通信する際のコマンド仕様が変
  • ファームウェアからの文字列がヌルターミネートされてない
  • そのせいで標準の文字列処理関数が使えずに独自で実装している

知識不足

  • 標準ライブラリの関数を使わずにわざわざ独自で実装している
  • 文字列の整形にsprintfを使わずにString.Insertを多用している

などなど。
問題の原因はプログラマの「初心者+横着」と言えるだろう。
設計とか標準関数の知識とかはある程度経験がものを言うので初心者ならうまく出来なくても仕方がない。でも、インデントを揃えるとか未使用の変数を消すとかは、初心者かどうかとはあまり関係がないように思う。(こういう細かい手抜きがバグの元になることが分かってくれば改まるのかもしれないけど。)


退社後にパソコン工房へ。先日壊れたハードディスク(HDD)の交換用に、いつもの電子部品の業者でHDDを見積もってもらったら、160GBのシリアルHDDが1万円近くもする上に納期が1週間もかかるという。価格はともかく1週間も待ってられないので自分で買いに行くことにした。160GBのものは品切れだったので250GBを約5千円で購入した。この店では1TBのものも1万3千円程度だった。パソコンパーツの最近の価格動向はさっぱり知らなかったのだが、シリアルHDDはずいぶん値下がりしているようだ。