じゃんぬねっと日誌

ネタと雑記と時々プログラミング

目次

Blog 利用状況

ニュース

不況すぎる件。

スポンサードリンク

運営サイト

  • C# と VB.NET の入門サイト

書庫

VSS で管理しているのにソースの修正部分の差分をコメントとして残す

VSS で管理しているのにソースの修正部分の差分をコメントとして残す。というのが未だに多いのですが、VSS で差分管理できるということを知らないとかいうオチですか? その会社の伝統や風習みたいなものでしょうか。皆さんの周りではどうでしょうか?

手動でソースコードをマージする時 (いくつかの外注に発注する時) に指示することはあっても良いと思いますが、いつまでもずっと残っているのですよね。10 年物の修正履歴になると、コメントアウトされている量が異常に多くなるので可読性が著しく低下します。

何より「差分」で残すため、に腐った制御構造を壊せずどんどん処理や条件が増えていきます。そうなると平然と 10 インデント以上もの行が存在しうる (実際に 13 インデントを発見した) ので弊害が大きいです。たとえば、条件に「ガード句」を使っているソースであればさほど問題になりませんが、「関数の最後のみで必ず return する」なんていう規約が存在していると大変です。

たとえば、条件に「ガード句」を使っているソースであればさほど問題になりませんが、「関数の最後のみで必ず return する」なんていう規約が存在していると大変です。実際そういった規約のあるソースの修正や仕様追加が進むと平然と 10 ネスト、10 インデント以上もの行が存在しうる状況になりかねないです。実際、私は最近「魔の 13 ネスト」という洗礼を受けました。(もう受けたくも請けたくもない...)

「ガード句を使って return する場合」と「関数の最後のみで必ず return する規約がある場合」を比べてみましょう。

ガード句を使って return する場合

    if (! 条件1()) {
        return FALSE;
    }

    if (! 条件2()) {
        return FALSE;
    }

    if (! 条件3()) {
        return FALSE;
    }

    if (! 条件4()) {
        return FALSE;
    }

    if (! 条件5()) {
        return FALSE;
    }

    条件を満たせばできる処理();

上記であれば条件が増えても修正は容易ですね。制御構造が単純化されているので修正によるミスも少ないです。

関数の最後のみで必ず return する規約がある場合

    BOOL bRet = FALSE;

    if (条件1()) {
        if (条件2()) {
            if (条件3()) {
                if (条件4()) {
                    if (条件5()) {
                        条件を満たせばできる処理();
                        bRet = TRUE;
                    }
                }
            }
        }
    }

    return bRet;

上記のように仕様が追加されればされるほどネストが深くなります。

上記は簡単な例を示すためこうなりましたが、実際にはこの間にはとんでもない行の処理が含まれていたり else の分岐もあったりします。そうなると、対応している if と else の区別がつきにくい (if に対応する終了ブラケット } が数千行も差があるので追えるわけがない) です。そうなると修正が容易ではなくなります。対応するブラケットを確認するだけでも大変な目に遭うことさえあります。

関数でまとめれば解決すると思うのは甘いです。これらを関数で表現していくと関数の呼び出しが連鎖的になって構造がわかりにくくなります。いずれにしても修正は容易ではなくなるということです。


2008/06/05 9:34 ・・・ 追記しておきます。

これらの問題 (というか、規約をすり抜けるために) 空の while や for を使って break でガード句に対応する方がいますが、制御構造の基本を無視している (つまり、トリッキーな実装になる) のでやめた方が良いです。何人が見ても理解しやすいコードにするために存在するルールが本末転倒になっています。それなら素直にウォータフォールな goto を使って頂いた方が良いです。(特に VB7.1 以前は Continue がないので案外見かけます)

goto が使えない、ガード句を使ってはいけないのであれば... もう、しょうがないんだよねw これはさw フフッハwww するしかないです。


2008/06/05 10:01 ・・・ さらに追記しておきます。

この記事の本題ですが「ソースの修正履歴を残さないといけないがために制御構造を壊す変更ができない」のを問題視しています。『制御構造を壊すような変更なんて怖いのでしてはいけないのでは?』という意見もありますが、上記に書かれたような場合でもそう言えますでしょうか。「制御構造を壊せないがために修正が容易でなくなり、かえって間違いが多くなる」という可能性を考える必要があります。

ということです。

投稿日時 : 2008年6月4日 13:05

コメントを追加

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 13:35 手探り

私の所(派遣先ですが、、、)でも一緒ですね。
SubVersionを使って管理しているにも関わらず、
修正前をコメントアウトにしてどんどん残していく、、、
残しても余り意味はないですよと何度も言っているのですが、
将来誰かが見て役に立つだとかいっている始末です。。。
まあ、じゃんぬさんが言っている通り「伝統や風習」なんだと
言い聞かせて作業はしていますw

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 13:40 はつね

無理やり書いてみた。無駄はある。

Dim bRet As Boolean = True

if (bRet AndAlso Not 条件1()) Then
bRet = False
End If
if (bRet AndAlso Not 条件2()) Then
bRet = False
End If
if (bRet AndAlso Not 条件3()) Then
bRet = False
End If
if (bRet AndAlso Not 条件4()) Then
bRet = False
End If
if (bRet AndAlso Not 条件5()) Then
bRet = False
End If
if (bRet) Then
条件を満たせばできる処理()
Else
Return bRet
End If

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 13:40 K5

これ、切実に思います。
今回の仕事のソースがifのネストは8ぐらいだったんです。
尚且つ関数の頭から常にifで括られてて10k行とかもはやギャグレベルなものががが
(新たな関数作成禁止とかも付属していたからなんですが、読んでられません)

#11年物で、そろそろ12年物になるものでした

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 13:51 774RR

MISRA-C ルール 82 っすね
絶対却下、評価するまでもなく逸脱決定でした

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 14:25 ネタ好き未記入

待ってました。この系のネタ大好きです。
企業でのプログラミング作業は能力が低い人に合わす傾向があるから、こんな無駄無駄無駄無駄ーーもどうにも出来ないんですよねw
しかも上司が知らない場合直訴しても「で?何か不都合があるか?」といわれるのがオチです(笑)
とにかく、リファクタリングしようよ~

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 14:34 さかもと画伯

ネストは置いておいて、コメントアウトしたソースは残しています。

単に「文化」で。

恐らくCOBOLメインでしかも汎用機だからVSSみたいなのがなくて、それがVBとかC#とかそっに移ったから、なんとなくーみたいな。

尚、ソースの先頭に修正した内容を記述するのは有りだと思っています。(ソース自体のコメントアウトとかは残したくないけど)だってVSSとかでいちいち見なくてもどこをどう変えたかとかすぐにわかるし。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 14:43 ネタ好き未記入

この件面白いから私のブログで取り上げたよ。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 14:57 NameLess

わかります、その気持ち。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 15:02 NAL-6295

確かに、能力が低い人のためにもガード句を使いたいですね。

>尚、ソースの先頭に修正した内容を記述するのは有りだと思っています。(ソース自体のコメントアウトとかは残したくないけど)だってVSSとかでいちいち見なくてもどこをどう変えたかとかすぐにわかるし。

私の場合は、修正内容のコメントも残したくないなぁ。
そんなに修正内容のコメントを参照する機会も多く無いし、余程のことが無い限り、今の実装こそが全てだと思っているので。
でも環境によりますよね。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 15:45 ネタ好き未記入

自分のブログでも書いたけど、こういった悪習がコードの品質を下げ続ける事はかなり問題だと思う。
先輩プログラマが下手な後輩プログラマに従うとか、優秀な新人プログラマが下手な先輩プログラマに従う現状はコードの品質を下げ続ける事になってしまいます。どこかでボーダーラインを引かないと・・・

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 19:33 PoohKid

私の元請けの事例でもそうでした。
そこはVSS管理でしたが
・「ソースコメントの方が可読性がよい」
・「お客さん(さらなる発注元)はVSSのログなんか見れない」
とか言う理由でコメント強制されました。

これでも聞き分けのいい方の元請けだったんですよ(笑

結論:古い文化は理論を凌駕する … orz

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 20:57 BI

本題とは関係なくてすみません。
ガード句について、C言語で書くときはリソースの解放の抜けを組み込みそうで怖いからあまり使っていませんでした。
その習慣でC#等でもあまり使いません。
少数派のようですね。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 21:24 裏口

>恐らくCOBOLメインでしかも汎用機だから

なめてもらっちゃ困るなあ。
メインフレームだってソースコードの履歴管理は可能。

# いや、機能確認しただけで使ってなかったけどwww

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 22:53 こくぼ

こういうのがあるから、フラグを持つような変数はバッドノウハウにつながるんですよね~。

あと、オブジェクト指向をわかってない人は、コンテキストそのものを切り替えるようなif文(やswitch文)と、フツーの処理の流れを分けるif文を乱発するからとんでもなくわかりにくいソースコードになったりしてます。

なんとかして欲しい…。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/04 23:33 石野 光仁

ガード句ってそんな言い方があるんだぁ 不勉強だなぁ>俺

if (! 条件1() || ! 条件2() || ! 条件3() || ! 条件4() || ! 条件5())
return false;
else
return true;

ネストとか、ガード句とか言っているけど
これでいんじゃない? そのままreturnに書いてもいいだろうけど・・・ (まぁ これがガード句なんだろうけど(

でもね、これ自体も分かりにくい・・・

こんな風に処理を書く場所って保存前の必須項目チェック
だったりしますよね。
そんな時は、バインド情報を別の場所で管理してそれを
利用して、コントロールまとめてチェックしちゃえば
いいんですよね。

処理1、処理2、処理3なんて続く時にはたいてい
関連があったりしますからね。

まぁ 目の前に貯金箱でもだして、if や switchを
使ったら、100円でも入れるようにすれば少しは
不必要な分岐が減ると思いますけどね。

なんて、わかっている風なことを書いてみたのですが、
私のプログラムはへたくそです。(笑)

#あと、VSSを使っているので ソースのコメントアウトは
#基本的にないですね。
#あるのは、恨みな文章付きな部分だけ、一生懸命書いたやつ
#だったり、納得できないけど処理をつぶした場合ですね

# ネストって嫌い 2008/06/04 23:52 ダメエンジニアのBlog

ネストって嫌い

# カラwhileって使いますか? 2008/06/05 1:36 ma2のblog - わんくま版(仮)

カラwhileって使いますか?

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 2:12 Yam

ネスト大好き!
returnは常に1つ!

これが、これが、これが正義だー!

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 7:46 さかもと画伯

>裏口さん

えー!
うちのにもあるんかなー、F系なんですけど・・・。もう部隊からは足洗ったからいいんですけどww

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 8:45 エンブー

いきなりreturnで抜けちゃうと困ることもあるので
私はこんな書き方もします。
returnも1つにって流れも酌めます。

for(int i=0; i<1 ; i++)
{

if (! 条件1()) {
break;
}

if (! 条件2()) {
break;
}

if (! 条件3()) {
break;
}

if (! 条件4()) {
break;
}

if (! 条件5()) {
break;
}
なんか処理
}

さらに何か処理

return;

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 9:31 じゃんぬねっと

> いきなりreturnで抜けちゃうと困ることもあるので
> 私はこんな書き方もします。

ブロックを作るためだけの for と while に違和感があるので私はまだ GoTo でも使った方が良いと思っています。
今は finally もありますし、困ることは少ないような気がしますね。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 9:42 ぐっちょん

私は、何の為に修正したのか・誰が修正したのか(責任者を明確にする為)コメントを付けた方がいいと言われています。
強制ではないですけどね

他人が作成したコードには、コメントをつけるようにしています。
自分が作成したコードには、コメントつけません。
だって汚くなるのやだもん・x・

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 9:43 じゃんぬねっと

> if (! 条件1() || ! 条件2() || ! 条件3() || ! 条件4() || ! 条件5())
> return false;
> else
> return true;
>
> ネストとか、ガード句とか言っているけど
> これでいんじゃない?

実際にはこの間や else 側に処理が入っていたりするんですよね。
あまり複雑な条件分岐自体を失くす実装が望ましいのですが...

この記事は「修正方法」を主に書いていたつもりだったのですが、単純すぎるソースのせいで本題がわかりにくかったかもしれません。
簡単にいえば、ソース上に修正跡を残さないといけないので、制御構造をバッサリ切り替える修正ができない、そして誰もやらない。
こういったことが「無茶なインデントを助長している」のでは、というお話です。

経験則ですが、修正跡があるソースを見るとこの傾向が強いのです。
グループ開発ばかりなので多少のことは目を潰れているつもりなのですが...

ただ 13 ネストとか行くと目を瞑る必要がないです。
ソースが右に寄りすぎて見れませんからw

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 9:44 じゃんぬねっと

> 私は、何の為に修正したのか・誰が修正したのか(責任者を明確にする為)コメントを付けた方がいいと言われています。
> 強制ではないですけどね

VSS でも誰が修正したのか明確にできますよね。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 10:55 ネタ好き未記入

そういえば、「VSS で管理しているのにソースの修正部分の差分をコメントとして残す」ケースを1つだけ思い出しました。
それは、「試行錯誤したいからひとまず残したい時」です。どう言う事かと言うと、パフォーマンス向上とかリファクタリングしたい。だけど途中で消えるおそれがあるので違うHDDに保存しているVSSにひとまず途中経過を残したいのです。これは普通ばっさり消せばいいとおもうのでが、バックアップ的な意味合いとか、リファクタリングで何を削っているのか知りたくて(いちいちVSSの履歴を見たくない)あえて残しているという特殊なケースです。
でも、もちろんチーム開発には使用しませんw
やっぱりどう好意的に考えてもVSSがあるのだからバッサリするの一番ですよね。
それが嫌な人は個人用VSSとチーム用VSSを使い分けるとか(笑)して欲しいですね。

# 汎用機にもソースコード管理は存在します 2008/06/05 12:09 DHJJ [Hatsune's Journal Japan] blog

汎用機にもソースコード管理は存在します

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 12:35 diosan

私のところはソースレビューのためにコメントを残すようにしています。
レビュー時は全員がネットワークにアクセスできるわけではないので、VSSでの比較ができません。

で、レビューが終わったら消すようにしています。
どうしても残したいやつはコメントにフラグつけておきます。

# [.NET]おっさんホイホイとしての Code Complete と,近くにあっても気付かない guard 句の話 2008/06/05 13:50 NyaRuRuの日記

VSS で管理しているのにソースの修正部分の差分をコメントとして残す - じゃんぬねっと日誌 カラwhileって使いますか? - ma2のblog - わんくま版(仮) 正常系が先か異常系が先かという問題 - Hirotow’s Craftive Blogs ガード句かぁ,じゃんぬねっとさんは『Code Complete

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/05 14:18 じゃんぬねっと

あら? NyaRuRu さん、購読終了すると仰っていたのになぜ? 他の記事から経由してきたのかな?

確かに CodeComplete は、好きな方ですけど全部は読んでいません。
全部読んでいないのに好きなんてのは変ですけども、それでも読めた方です。
本を読むのってどうも苦手なんですよね。

CodeComplete には「ガード句」についても書かれておりましたか。
駆け出しの頃はこのガード句を使っていなかったのは確かですが、いつの間にか気付いた時に使っておりました。
「ガード句」という文言自体は渋木さんから教えて頂きました。

C#3.0 における LINQ でのガードについてですが、LINQ はかじってすらいないので「近くにすらない」状態で知りませんでした。
今でも C/C++、VB6 の案件が近すぎるくらい多いので困ったものです。orz

今回サンプルとしてあげたソースが C なのもそのせいです。
昔と違って新しいものにかじれるヒマがなくて皆さんが羨ましいです。

# ガード句 2008/06/06 0:41 Chiharu

この手の話題を見ると、古い本ですがCプログラミング診断室という書籍を思い出します。
とっくに収束した議論だと思っていましたが、まだ現役なんですね。
正常系の処理がif文で異常にネストしていくのって、ダサいコードなんだとばかり思ってました。
そういうコードに限って『}』に必ず対応するif文の内容がコメントとして残してあったりして。

でもガード句って言葉は知りませんでした。
CodeCompleteは読んでみようと思います。積読状態なので。

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/06 13:32 ネタ好き未記入

私もCodeCompleteは買えないから読んでいませんでした。
でも凄く気になります・・・
ああ、元々読書が趣味だったから、どうしても読みたくなってきた。
よーし、気合を入れて立ち読みにしいこう(笑)

# re: VSS で管理しているのにソースの修正部分の差分をコメントとして残す 2008/06/06 13:33 ネタ好き未記入

誤:私もCodeCompleteは買えないから読んでいませんでした。
正:私はCodeCompleteは買えないから読んでいませんでした。

です。失礼しました。

タイトル  
名前  
URL
コメント