頭の整理のために吐き出す。

あと眠気覚まし。

■ソースコードを整理するの気持ちいい。
引き継いだプログラムのうち、最も重要な機能のプログラムがもうコード追っかけるのがあまりにも苦痛なためいろいろと整理をしている。C#でのWindowsフォームプログラムなんだが、メインのフォームにすべてが記述されていて、フォームのコードが17000行に登っていた。客先に言われてあとからあとから追加機能を実装していったのはわかるが、せめてコードの分離をして欲しかった。

フォーム変数で扱われる各種値。
何千行に渡るF10_Clickイベント
その中で幾度と無く繰り返される「同じような」コード。
何階層目かもわからないネスト。
何重にも囲われている。#region。

実際に処理を追っかけるとすげーイライラしてくる。いまのコードの位置が何をしているかわからない。だいたい、F10_Ckickか、txtCode_Validationのどこか。保存処理をしているんだろうけど、追加(Insert)なのか更新(Update)なのかで処理が分かれるが、単純にIf分岐してるだけで、どっちも同じ関数内。しかもそれぞれ処理が長大なので、結局いまなんの処理をしているかわからない。その上、同じような処理が繰り返し(微妙に違っているけど)書かれているため、更にどの処理をしてるか把握できない。

んー…自分の状況把握能力が良くないのかな?

一応、それぞれの処理ブロックを#regionで囲んでるけど、それを関数にしろよ。region展開しても、いまのコードの位置はF10_Clickなんだよ。ラベルは一番上にスクロールしないと見えないのに1000行近いコードがregionされてんだよ。わかんねーよ。

▼よくわかったこと。関数名って超重要。いや「名前」ってホント重要。

■ユニットテストを使うようになって。
テストし易いように設計するようになる。機能がいい具合に分割できるように考えられる。関数FにAを入力したら、Bが返されるって動きを基本に考えるようなった。副作用とかマジで邪魔と感じるようになってきた。やっと、関数型プログラミングが魅力的に見えるようになった気がする。あとは、動作確認が簡単。デバッグ開始→フォーム起動→(事前に必要なデータ登録)→ボタン押す→結果確認とかマウス触るのめんどくさい、メニューたどるのすら嫌じゃんとか思ってたけど、Ctrl+R , Ctrl+T→結果確認に。

しかし、え?今更?恥ずかしいッて言われても仕方ないこと書いてるな。
恥ずかしいね。ちゃんと手法を勉強しなかった自分が。

■C#のイベントをひたすらまとめる。
既存コードに多いのがこれ。同じような処理やチェックが入るけど、コントロールごとに処理を書いている。数量チェックを行う場所が5こあったらその分、Validationイベント関数とチェック関数をかいてるし。C#のイベントには同じイベント関数を使えること知らない人が書いてたのか、そういう社内規約か知らんが。実際に10個のチェック関数が一つに、Validationも10個が一つに。20個の関数が一つにまとまったわけで。登録前の全体チェックもforeach使ってさっくりかけるわけで。コントロールを特別視しないようになった気がする。あるプログラムなんか20個の同じオブジェクトにそれぞれイベント割り振ってたからな。今なら

foreach(var ctl in TargetCtrools){
ctl += new EbentHandler(EventFunction);
}

でいい訳で。

■社内規則vs言語機能
既存コードみると結構あー規約でこう書けってなってんだなーというところが見受けられて。完全に言語機能を活用出来てないよねって思った。それなりに歴史ある会社っぽいから、いままで積み上げられた経験と技術の結晶なんだろうなと思うけど。もっと楽になる方法はあるよねーと思うわけで。今回の仕事で本格的にC#の言語仕様を勉強したけど、こいつは本当に「コードの量を少しでも減らすために」「コードが少ない=バグの入る余地がヘる」というああ、当然のことだよねってことがいかに重要でそのために如何なる工夫をしてきたか思い知ったわけでございます。前回のプロジェクトでLinqってほんとに有用なの?とか思ってたけどごめんなさい。今となってはLinqサイコーです。なんでおまえらIEnumerable実装してないの?Collectionなの?って気分です。
(そりゃその頃なかったからよ。)
とはいえ、今のところ一人プロジェクト(でも規模は最大級w)でコードも実装も設計も好き勝手し放題にやってるからこそ、そうやって気楽に言えるわけで、実際に他のメンバーに依頼したところなんかもう気持ち悪くて仕方ないから書き換えちゃってるからねー。またお願いって言ったら嫌がるだろうなー。

■とはいえ
こうやってガリガリとコード修正してますが、もちろんその新しいコードが正しいかはわかりません。
綺麗なコードになっているかもわかりません。あ、自分にはわかりやすい。
とはいえ、既に1年前のコードと今書くコードを比べるともう1年前が汚くってww

でもまぁ規模とやりたいこととやってることがわかってるからこそ、こうしたら、ああしたら、こうあるべきってのがわかるんですよね。
幾つか本を読んでると、「最初は捨てるつもりで作れ」って言うのがよく分かる。
2回作れるくらいの余裕を持つべきなんでしょうなー。宇宙兄弟でも月面ムーバー作るときにムッタがそんなこと言ってたね。
スポンサーサイト

trackback

comment


<<Super Crazy Zooしばらく使ってみた HOME TOP トナプラ。続ける。>>