テストを書いてからリファクタリングするというけれど、
コードの内容によっては、それが現実的に不可能な場合がある。
汚いコードであればあるほど、リファクタリングの前に
テストを書くのは難しくなる。
テストが書けるのは、単機能の関数になっているものだけ。
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
ヘッダファイル準備しろよ。そしたら実コード書いてやる。
ヘッダファイル準備しろよ。そしたら実コード書いてやる。
20デフォルトの名無しさん
2012/10/15(月) 15:34:36.31 >>16
このコードが意味不明なのだから
先にヘッダファイルが用意できるわけがない。
リファクタリングしなければ、ヘッダファイル
(何を関数にするか)判断できないだろ。
今お前はテストの前にリファクタリングを要求したんだよ。
このコードが意味不明なのだから
先にヘッダファイルが用意できるわけがない。
リファクタリングしなければ、ヘッダファイル
(何を関数にするか)判断できないだろ。
今お前はテストの前にリファクタリングを要求したんだよ。
2012/10/15(月) 15:35:18.81
2012/10/15(月) 15:38:07.18
>>20
> このコードが意味不明なのだから
> 先にヘッダファイルが用意できるわけがない。
ちょっと何言ってるかわからないよ。
リファクタリングの定義知ってる?
動作するものを、その振る舞いを変えずに構造を変えることだよ。
つまり、ビルドできるものが前提。
ヘッダファイルが用意できないのなら、リファクタリングはおろか、ビルドもできないよ。
> リファクタリングしなければ、ヘッダファイル
> (何を関数にするか)判断できないだろ。
ヘッダファイルがなんなのかも知らないの?
関数宣言が入ってたり、構造体の定義が入ってたりする奴だよ?
> このコードが意味不明なのだから
> 先にヘッダファイルが用意できるわけがない。
ちょっと何言ってるかわからないよ。
リファクタリングの定義知ってる?
動作するものを、その振る舞いを変えずに構造を変えることだよ。
つまり、ビルドできるものが前提。
ヘッダファイルが用意できないのなら、リファクタリングはおろか、ビルドもできないよ。
> リファクタリングしなければ、ヘッダファイル
> (何を関数にするか)判断できないだろ。
ヘッダファイルがなんなのかも知らないの?
関数宣言が入ってたり、構造体の定義が入ってたりする奴だよ?
レスを投稿する
ニュース
- 拳銃24丁を中国から日本国内に輸入した疑い 中国人の46歳の男逮捕 1丁約3000円で販売 [七波羅探題★]
- 水深2mのホテルプールで大学生溺死、監視員なし 8千万円賠償命令 [蚤の市★]
- サッカーW杯、日本代表戦は地上波で放送へ DAZNは全試合配信 [鉄チーズ烏★]
- 渡邊渚『日本は男性の性欲に甘い国』「女性をどうやって騙して呼び出すか力説するおじさん」日本で多発する性的搾取について思うこと ★3 [Ailuropoda melanoleuca★]
- 有名な買い取り店にCD5000枚を持ち込んで売却した谷原章介、買い取り価格に後悔し30分後に戻るも…「ショックだった」 [muffin★]
- 首都高、料金値上げ検討 維持費確保へ、1割増も [どどん★]
- 【速報】高市早苗、流行語大賞受賞👩‍🦰 [626681504]
- 【実況】博衣こよりのえちえちゆったり歌う枠🧪 ★2
- 【んな🏡】姫森ルーナ(・o・🍬)グラディウス配信中やぞ❗【ホロライブ▶】
- 【悲報】日本人、ガチでコメ離れしてしまいJAと農家さんが焦りまくるwww「お米券で高い米を買ってもらえるようにしてほしい」 [793117252]
- 【画像】懲役64年で出所した爺さん(91)ガチでヤバすぎる [977261419]
- 【悲報】人気VTuberの天音かなたさん、ホロライブ卒業★3 [485689427]
