テストを書いてからリファクタリングするというけれど、
コードの内容によっては、それが現実的に不可能な場合がある。
汚いコードであればあるほど、リファクタリングの前に
テストを書くのは難しくなる。
テストが書けるのは、単機能の関数になっているものだけ。
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.32レスを投稿する
ニュース
- 空自機レーダー照射、音声データ公開 中国 ★3 [蚤の市★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★] [蚤の市★]
- 高市早苗首相、消費税減税に後ろ向き 足かせはレジシステム? 「責任ある積極財政」期待高いが [蚤の市★]
- 【YouTuber】バイク事故で入院のゆたぼん、振込で「お見舞金」募る [muffin★]
- 低所得層のマクドナルド離れが深刻に 広がる「ファストフード格差」の真相 米国 [少考さん★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 中国がここまで過敏になるのは日本に前科があるから。盧溝橋、満州事変。ジャップの先制攻撃は挙げればキリがないけど [472617201]
- ぶっちゃけ天のうって昭和天のうのせいで全然ありがたみないよな
- 犬って顔くっつけて寝たがるよな
- 『猟友会がクマ駆除を嫌がるなら潰すべき。職務を放棄するハンターから免許や銃を没収して罰金を取ろう』の声、ネットで上がる [932029429]
- 【悲報】JA「全然米が売れなくて倉庫を圧迫してる。助けて!」米卸売り業者「安売りしたら赤字になる…助けて!」 [802034645]
- ( ´・ω・` )もう寝るよ
