さて、今日はワテのプログラミングスタイルについて紹介したい。
まあ、そんなものに興味を持っている人は滅多にいないかも知れないが。
まあブログなので勝手に書いている。
例えばC#を使ってコンソールプログラムを作成する場合には、最初にMain関数が実行される。
そのMainからコールされる関数を沢山作ってプログラムを完成させるわけだが、ワテの場合には、新しく作成する関数はファイルの先頭にドンドン追加して行く。
こんな感じだ。
class Program { static void myfunc2() { Console.WriteLine("myfunc2を実行"); } static void myfunc1() { Console.WriteLine("myfunc1を実行"); } static void Main(string[] args) { myfunc1(); myfunc2(); } }
コード1. 新しく作成する関数はファイルの先頭に追加する(ワテ流)
まあ世の中にはこの逆で、新しく作成する関数をファイルの末尾に追加して行く人もいるかも知れない。
class Program2 { static void Main2(string[] args) { myfunc1(); myfunc2(); } static void myfunc1() { Console.WriteLine("myfunc1を実行"); } static void myfunc2() { Console.WriteLine("myfunc2を実行"); } }
コード2. 新しく作成する関数はファイルの末尾に追加する
まあ、好き好きなのでどっちでも良いと思う。
ワテも昔はファイルの末尾に追加する書き方をしていた時もある。
新しい関数がファイル先頭にあると、すぐに編集に取り掛かれるのが好きなのだ。
末尾までスクロールしたり、ジャンプしたりするのも面倒だし。
直前のカーソル位置を記憶してくれる場合もあるが、先頭に新しい関数を置くという規則を作っておくと余計な事を考えなくても良いし。
ファイルの行数
ワテの場合、最近ではソースコードのファイルを細かく分割する事が多い。
- 機能ごとに分ける。
- GUIのメニュー項目に対応して分割する。
- データ保持用のクラスを定義するごとにファイルに分ける。
など、細かく分ける。
Visual Studioの統合開発環境の場合、ソリューションエクスプローラーというWindowsのファイル・フォルダ一覧表示のような機能があり、そこにフォルダを作って階層構造でソースコードを保存出来る。
そういう階層構造を利用して、かつ、ファイルも分割して細かく分けている。
その結果、一つのファイルの中身のソースコードの行数は多くても、1000行以内。平均すると300行くらいかな。
一つのファイルに何万行もあるソースコードを viエディタで編集するなんていう経験もあるが、目的の場所を探すだけでも大変だからあまり作業効率は良くない。
と言う事で、最近のワテは細かく分割派だ。
フォルダ名、ファイル名は何度も変更する
ワテの場合、フォルダ名、ファイル名は何度も変更する事が多い。
最初は適当に名付けた名前であっても、開発を続けているとその名前ではやっている処理がすぐに連想出来ない場合も出て来る。
そう言う場合には、より良い名前に変更して、一目見ただけでどんな処理を記述しているファイルなのかを思い出せる名前に変更する。
途中でファイル名を変更すると逆に混乱するのではないかと言う人もいるかも知れないが、ワテの場合には、思い立ったが吉日ですぐに変える。
ファイル名、フォルダ名に限らず変数、関数名のネーミングは重要だ。
ヘンテコな思い付きの名前を付けると、何を保持する変数なのか、何の処理をする関数なのか思い出せない場合がある。
そう思ったらすぐに名前を変更する。
置換機能を使えば簡単に出来るし、一旦変更してしまえば直ぐにその名前に慣れる。
関数を改造する時のワテ流のやり方
例えばプログラムを作成中に、既存の myfunc() と言う関数を改良する必要になった。
そういう場合に、いきなりその関数を改造し始めて上手く完成すれば問題は無い。
でも往々にして、途中で訳分からなくなり元に戻したい場合もある。
ワテの場合にはそう言う事が良くあるので、最近では以下のようにする。
他愛も無い手法だが、編集前の関数 myfunc() をそのまま全部コピペして myfunc_1() と名付けて残しておくのだ。
こんな感じ。
static void myfunc_1() // 変更前の関数はそのまま残しておく { 改良前の処理がここからズラスラと書いてある ... ... } static void myfunc() // こちらの関数を編集する { ここに新しいコードを記述する ... } static void Main(string[] args) { myfunc1(); myfunc2(); }
コード3. 心配性なワテ流の変更前の関数をそのままコピペして残しておく作戦
まあ、いつでもそうする訳ではないのだが、大掛かりな関数があり、慎重に作業をしても途中で混乱して支離滅裂になる危険性がある場合にこのようにする。
もし支離滅裂なって、やっぱり元に戻してから頭を冷やしてやり直したい場合に便利だからだ。
こんな事をしなくてもエディタのUNDO機能を使えば過去に戻れると言う人もいるかも知れないが、そのやり方ではファイルを上書き保存して閉じて、再度ファイルを開くと元に戻れない場合もある。
なので、オリジナル関数をソックリそのままコピペして複製を作っておくワテの作戦だ。
もしこの myfunc() を編集作業中に、myfunc()で使っているクラスや構造体などの定義を変更して、メンバ変数の名前や数が変わった場合には、myfunc_1() ではクラスのメンバが無いなどのエラーが出る場合もある。
そういう時にはC言語系で有れば、my_func_1() 全体を
#if(false) void my_func_1() { ... } #endif
で囲うなどして無効化しておけば良い。
あくまでワテの場合であるが、この手法を使うようになってからは、途中で泥沼にはまって訳分からなくなっても、簡単に元に戻せるので助かっている。
世の中には、もっと高度なソースコード管理システムもあるし、Visual Studioでも利用出来るのも知っている。
でもまあワテの場合には、こんなローテクな手法でやっている。
その結果、
myfunc_1() myfunc_2() myfunc()
のように二世代、あるいは三世代も古いバージョンを残している場合もあるが、そうなると逆にややこしいので、改良版 myfunc() の動作に問題が無い場合には古いバージョンは削除してソースコードをスッキリさせている。
そしてもう一つ言うと、プロジェクト全体のフォルダのコピーを定期的に全保管しておく作戦も使う。
プロジェクト全体のフォルダのコピーを定期的に全保管しておく
例えば一ケ月掛けてプログラムを作成する場合などには、ワテの場合には定期的にプロジェクトのフォルダごとコピペを作成しておく事が多い。
大きなプロジェクトだとファイルサイズの合計が100MBなどと言う場合もあるが、クリーンビルドしてバイナリを削除すれば通常は数メガバイト程度に収まる。
なので、沢山の世代のバックアップを保管しておいても数テラバイトもの容量があるハードディスクの残り容量が気になる事は無い。
万一100MBなどの大きなプロジェクトの場合にはそのフォルダをZIPファイルに圧縮すれば50MBくらいにはなるし。
まあ、ソースコードのバージョン管理システムを使えばそんな事をする必要は無いかも知れないが、丸ごとバックアップを取ってあるとフォルダを入れ替えるだけで完全に元の状態に復元出来るので安心だ。
まとめ
今日は、ワテ流の関数改造テクニックを紹介した。
まあテクニックと言うほどでもないが。
こんな事をしなくても、驚くようなプログラムをスイスイと作成するプログラミングの達人もいる。
ワテの場合にはプログラミングの凡人あるいは変人なので、こういう自己流の泥臭い手法を使っている。
なので、あまり皆さんの参考にはならないかも知れない。
まあ、ブログなので勝手に書いている訳だ。
こう言う本を読んだら完全なプログラミングをマスター出来るのか!?
あるいは、
世界最高のコンピュータ教科書と書いてある。
ほんまかいな!?
分からん。
チャレンジャー精神のある人に是非お勧めしたい有名な本だ。
コメント