現在行っている案件は、提案することが多いこともあり、先日も打ち合わせに行ってきました。

案件には、ソースコードの修正も含まれています。ソースコード修正も色々です。そこで今回はソースコードの話をしたいと思います。

 プログラマの仕事と言うとプログラムを最初から作成するイメージを持つ方もいるかも知れません。しかし、殆どの案件は改造です。
例えば、ある機能を追加してくれとか、重いので軽くならないかなどです。昔からもそうですが、最近多くなったと言えば、バージョン関連でしょう。最近の事例を幾つか列挙してみます。

・IE6→IE7・IE8
・Windows XP→Windows Vista・Windows 7
・シングルコア(シングルスレッド)→マルチコア(マルチスレッド)
・IPv4→IPv6
・32bit→64bit

特に、最後の2つは他の中でも大きい出来事でしょう。

 改造なので、当然完成したソースはあります。自社が関わって新規作成したプログラムを改造することもありますが、それは稀でしょう。殆どが、他の会社の人が作成したプログラムです。たださせ、プログラマーの間では、自分が書いたソースも一定期間すると忘れるとか他人のソース同様と言わるぐらいです。それが他人の書いたプログラムはなおさら理解するのに苦労します。特に、スパゲティプログラムやスパゲティコードと呼ばれるプログラムになるとさらに厄介です。

 スパゲティプログラムやスパゲティコードとは反対に、苦労しない場合も多々あります。
例えば、
・ドキュメントがしっかりしている
・ソースコードにコメットが適切に入り、ソースコードと連動している
・ソースコードが見やすい
と言ったところでしょうか。


 以前、私が扱った案件では、オブジェクト指向が出来ていなかったり汎用性がないプログラムもありました。スパゲティプログラムとは行かないまでもとても読みにくいソースコードです。オブジェクト指向を取り入れている場合、比較的複雑な処理にはなりにくいと言われますが、それは設計の話です。設計が出来ていなければ、プログラムはオブジェクト指向とは言えません。

文章で説明するのは大変なのですが、オブジェクト指向の場合、クラスにあるメンバ変数はクラスの中だけで処理を完結するという原則を守るだけでもコードはすっきりします。それはメンバ変数がオブジェクトの場合に、クラスにアクセスした先で処理が行われていることがなくなるからです。

例えば、クラスにアクセスした先で処理が行われる処理の場合は以下のようなコードになっています。

return arrayList;

「arrayList」がメンバ変数でオブジェクトだった場合、取得する方は「arrayList」を自由に値を変えることが出来てしまいます。

そこを「return new ArrayList<Hoge>(arrayList);」にすることにより「arrayList」取得する先を別のオブジェクトとして返せば良いです。そうすれば、取得した先で変更しても呼び出し先のクラスのオブジェクトには影響しません。よって、「arrayList」の値を勝手に変えられることが無くなります。実際に、操作したければ、「arrayList」を宣言したクラスの中で処理を行えばよいです。

 大変な案件ほど、ソースコードも複雑なことが多いです。それは一概には言えませんが、仕様が複雑だったり、仕様変更が多かったりするからです。複雑なソースコードも一つだけ効用があるとすれば、自分は真似しないようにと思う事です(笑)。人の振り見て我が振り直せということです。