サイレントマジョリティはかく紡ぐ

これはひどいというコードの例*1

If 変数1 = True Then
    変数2 = True
Else
    変数2 = False
End If
変数2 = 変数1

5分の1で済むんですけど。



これはひどいというコードの例*2

If 条件 Then
    ' コードブロックA 10行
    ' コードブロックB 50行
Else
    ' コードブロックC 10行
    ' コードブロックB 50行
End If


自然言語的にするとこう


あなたが男性なら

 10ポイントです
 ご利用ありがとうございました!

そうでなければ

 30ポイントです
 ご利用ありがとうございました!


ヘンじゃね?



っていうか

  • 可読性が低い

 Ifブロックを全部読んで、ThenブロックとElseブロックをなんども見返して(切り取ってdiffするけど)、60行中の50行を同定するのに(というより、同じものだと気づくのに)どれだけ時間がかかるか。

  • 変更容易性が低い

 ThenブロックとElseブロックの同じコンテキストに仕様変更があったとすると、同じ修正をしなければいけないし、テストも倍になるし。


こんなコードで何十万行、何百万行っていうシステムはザラにあります。

数万行程度のシステムならまだしも、保守性が低くて困ったものです。


「条件分岐があったらelseを無くせないか考える」というリファクタリング可要素以外にも、無駄なコードは沢山あります。

  • 全く同じ振る舞いの別名メソッド
  • 例外処理機構を使ってない
  • 繰り返し現れるコンテキスト

ようは繰り返しだらけなわけです。*3


だいたいこんなコメントだらけになってます。*4

' ↓#0010001 仕変対応 HogeクラスのMogeメソッドからコピー
なんたらかんたら
なんたらかんたら
なんたらかんたら
' ↓#0010051 バグ対応 xxxする様修正 HogeクラスのMogeメソッドも要修正
なんたらかんたら
なんたらかんたら
' ↓#0010224 バグ対応 yyy箇所をコメントアウト
なんたらかんたら
' ↑#0010224
なんたらかんたら
' ↑#0010051
なんたらかんたら
なんたらかんたら
なんたらかんたら
なんたらかんたら
' ↑#0010001

なんて親切!



どうしてこうなった?

『コピペ』

これに尽きるでしょう。

自分で書きたくないからです。


バグってた時「元がそうだったから」と言えるからです。


下請けPGerのこの心理状態が仕方ない事は認めざるを得ないでしょう。。*5


冗長コードを無くせる「夢のリファクタリングツール」が必要です。

そんなもの無いですが。


んじゃ、、冗長コードを最初から書いて貰わないようにする事が大事!

TDDでテストコードを最初に書いて貰うようにすれば、テストパスが最小になるように実装するはず!


テストコードもコピペするしwwwww

*1:VBの例だけどdisるつもりは無いですw

*2:VBの例だけどお察しください

*3:トランザクションスクリプトをdisるつもりも無いです;

*4:VBの例だけど(ry

*5:工数100人月〜、工期10ヶ月〜とかのケース