テストを書いてからリファクタリングするというけれど、
コードの内容によっては、それが現実的に不可能な場合がある。
汚いコードであればあるほど、リファクタリングの前に
テストを書くのは難しくなる。
テストが書けるのは、単機能の関数になっているものだけ。
1000行以上からなる複数の処理を行う関数などテストを先に書くなんてまず不可能。
テストを書くためには、コードの再配置を先にやらなくてはいけない。
コードの順番を変えたりモジュールに分離するなどして、小さな処理にまとめて関数化する。
そこまでやってやっとテストが書ける。
現実的な修正の順番としては
コード再配置 → テストコード記述 → リファクタリング
にならざるをえない。
コード再配置はテストがない状態で行うから非常に神経を使う。
ミスを起こさないような再配置しかやってはいけない。
探検
テストを書いてからリファクタリングなんてのは幻想
2012/10/03(水) 00:24:26.88
2012/10/03(水) 00:29:16.55
See: Working Effectively with Legacy Code
2012/10/03(水) 03:59:19.12
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
2012/10/03(水) 14:23:07.28
>>1
> 1000行以上からなる複数の処理を行う関数などテストを先に書くなんてまず不可能。
そうでもないよ。
================================== 終了 ===============================
> 1000行以上からなる複数の処理を行う関数などテストを先に書くなんてまず不可能。
そうでもないよ。
================================== 終了 ===============================
5デフォルトの名無しさん
2012/10/14(日) 16:37:35.20 関数をリファクタリングするのは簡単だが、
明らかに関数になってない処理、
つまりいろんな手続きのあつまりを修正するのは難しい。
なぜなら、その処理の集まりを実行すると
何十もある状態(データベースなどの値)が一気に変化するから。
関数に値を数個入れて、一個の値を返すのではなく
何十個も値を入れて、何十個も値を返すという状態になってる。
そんなものにどうやってテストコードを書くのか。
こういうのはテストコードを書く前に、処理の集まりの中から
関数になる部分を抜き取るという作業になる。
抜き出した部分にテスト書くことはできるが、
処理の集まりの方に、テストを書くのはまず不可能。
明らかに関数になってない処理、
つまりいろんな手続きのあつまりを修正するのは難しい。
なぜなら、その処理の集まりを実行すると
何十もある状態(データベースなどの値)が一気に変化するから。
関数に値を数個入れて、一個の値を返すのではなく
何十個も値を入れて、何十個も値を返すという状態になってる。
そんなものにどうやってテストコードを書くのか。
こういうのはテストコードを書く前に、処理の集まりの中から
関数になる部分を抜き取るという作業になる。
抜き出した部分にテスト書くことはできるが、
処理の集まりの方に、テストを書くのはまず不可能。
6デフォルトの名無しさん
2012/10/14(日) 17:42:49.53 関数 {
ここからAの処理
:
:
ここからBの処理
:
:
ここからCの処理
:
:
}
こういうのはリファクタリングしやすい。
ここからAの処理
:
:
ここからBの処理
:
:
ここからCの処理
:
:
}
こういうのはリファクタリングしやすい。
7デフォルトの名無しさん
2012/10/14(日) 17:44:07.73 でも実際には、こうなっている。
関数 {
Aの処理その1
Bの処理その1
Cの処理その1
Cの処理その2
Aの処理その2
Bの処理その2
Bの処理その3
Aの処理その3
Cの処理その3
}
関数 {
Aの処理その1
Bの処理その1
Cの処理その1
Cの処理その2
Aの処理その2
Bの処理その2
Bの処理その3
Aの処理その3
Cの処理その3
}
8デフォルトの名無しさん
2012/10/14(日) 17:49:11.03 もちろん、どの行がどの処理かってのはわからないから
見た目にはこう見える。
関数 {
処理そのa
処理そのb
処理そのc
処理そのd
処理そのe
処理そのf
処理そのg
処理そのh
処理そのi
}
見た目にはこう見える。
関数 {
処理そのa
処理そのb
処理そのc
処理そのd
処理そのe
処理そのf
処理そのg
処理そのh
処理そのi
}
9デフォルトの名無しさん
2012/10/14(日) 17:49:52.9910デフォルトの名無しさん
2012/10/14(日) 17:53:01.93 >>8の「関数」のテストを書けばいいだけと思うかもれないが、
「関数」がどんな処理を行なっているかは明確に書かれていない。
データベースの何かの値を読んで、なんかの値を返す。
そしてその他のサーバーとも通信している。
ファイルにも保存する。
徐々に機能が追加されてしまっており仕様がない。
入力となる組み合わせもデータベースのいろんな状態を考慮するために
こんなので全体が何をしているかのテストを書くのは不可能。
「関数」がどんな処理を行なっているかは明確に書かれていない。
データベースの何かの値を読んで、なんかの値を返す。
そしてその他のサーバーとも通信している。
ファイルにも保存する。
徐々に機能が追加されてしまっており仕様がない。
入力となる組み合わせもデータベースのいろんな状態を考慮するために
こんなので全体が何をしているかのテストを書くのは不可能。
2012/10/15(月) 11:19:25.44
>>10
> こんなので全体が何をしているかのテストを書くのは不可能。
そうでもないよ。
================================== 終了 ===============================
> こんなので全体が何をしているかのテストを書くのは不可能。
そうでもないよ。
================================== 終了 ===============================
12デフォルトの名無しさん
2012/10/15(月) 11:24:01.39 反論できないのを見るとすっきりするなw
2012/10/15(月) 13:05:35.58
14デフォルトの名無しさん
2012/10/15(月) 15:10:45.672012/10/15(月) 15:22:46.82
>>14
マジで、この関数のテストどう書けばいいかわかんないの?
超簡単じゃん、これ。書き方が下手なだけで、記述が冗長になってるだけ。
・システムコール以外の関数のスタブを準備する
・扱うファイルのフォーマットがわかるなら、そのファイルを準備する
・フォーマットがわからないなら、システムコールと同名のスタブを準備する
・コンパイルして実行できるmainあるいはxUnitのコードを書く
・全部の(をめざして)return文を実行するようなテストを書く
・全部の(をめざして)if-elseを分岐するようなテストを書く
マジで、この関数のテストどう書けばいいかわかんないの?
超簡単じゃん、これ。書き方が下手なだけで、記述が冗長になってるだけ。
・システムコール以外の関数のスタブを準備する
・扱うファイルのフォーマットがわかるなら、そのファイルを準備する
・フォーマットがわからないなら、システムコールと同名のスタブを準備する
・コンパイルして実行できるmainあるいはxUnitのコードを書く
・全部の(をめざして)return文を実行するようなテストを書く
・全部の(をめざして)if-elseを分岐するようなテストを書く
16デフォルトの名無しさん
2012/10/15(月) 15:23:43.3217デフォルトの名無しさん
2012/10/15(月) 15:25:16.96 言っとくが修正が終わったものを持ってくるだけじゃだめだぞ。
ちゃんと先にテストを書いたことがわかるように、
修正前のコード+テストの状態のものを持ってくること。
ちゃんと先にテストを書いたことがわかるように、
修正前のコード+テストの状態のものを持ってくること。
2012/10/15(月) 15:26:01.91
つか、まさかとは思うけど、『レガシーコード改善ガイド』読んでないとか?
読めよw
読めよw
2012/10/15(月) 15:27:04.34
>>16
ヘッダファイル準備しろよ。そしたら実コード書いてやる。
ヘッダファイル準備しろよ。そしたら実コード書いてやる。
レスを投稿する
ニュース
- 【令和の高校生】ハタチ過ぎても「タバコ吸わない」9割超! 圧倒的多数を占めた “5つの理由” とは [七波羅探題★]
- 【大学】全国の女子大7校がトランスジェンダー女性の入学認める 16校が検討 [七波羅探題★]
- 令和ロマン・高比良くるま 不倫訴訟起こされていた 「不倫関係ない」と否定も元夫から「婚姻期間中に…」 [征夷大将軍★]
- 【フジテレビ】『サン!シャイン』3月で終了 放送わずか1年… 谷原章介MC起用も 視聴率低迷、3%台の壁を越えれず 後継番組はなし [冬月記者★]
- 【愛知】探偵の男を逮捕 豊田市の元職員 市職員の立場利用して得た個人情報を探偵業に使用か [七波羅探題★]
- カルボナーラ論争勃発…イタリアの農相がイタリア風の商品に“怒りの投稿” [夜のけいちゃん★]
