リファクタリングをただのコード修正と思ってる人へ
■ このスレッドは過去ログ倉庫に格納されています
テストも書かないでリファクタリングとかうけるw まずな、リファクタリングでは機能追加・修正は行わない。 動作はまったく同じでコードをきれいに書き換えること。 書き換えるといっても、これなら同じ動きだろ?って推測でやってはいけない。 まずテストを書く。ユニットテストをできるように、 単一のクラスでインスタンスを作る。 汚いコードなのだからたいていは依存関係のせいで単一ではクラスが生成できない それを生成するために、クラスの動作を書き換える。 といっても元のコードは修正しない。継承やプリプロセッサを使って 依存関係を断ち切るために既存のコードを上書きする。 どうしてもそれが不可能な場合には、決められた手順で最小のコード修正を行う そうやって既存のクラスのユニットテストを行う。 それでやっとリファクタリングが行える。 既存のクラスのユニットテストを通るように新たなコードに修正、 もしくは新規作成して置き換える。 この手順と考え方を守ってないのはリファクタリングではない。 で? Eclipseのリファクタリングは名前変更もリファクタリングのひとつなんだよなあ リファクタリングは結果ではない。 プロセスだ。やり方だ。 コードがきれいになったからリファクタリングをしたと 思うのは間違いだ。 バグを入れないのは当たり前だが、コードの動作を変えずに 決められたた手順をもちい、クラス間の依存関係を減らすことで ユニットテストできるようにする作業がリファクタリングだ。 テストコードが増えてなければ、それはコードを書き直しただけで リファクタリングとは呼ばない。 リファクタリングブラウザとは、このリファクタリング作業を簡単にするための ツールであり、リファクタリングブラウザの機能を使った作業(名前変更など)そのものは リファクタリングではない。 本当のリファクタリングを知ると、 新たな設計方針にたどり着ける。 テストしやすい設計。 クラスを単独で生成できるように 依存関係(クラスが別のクラスを使用するなど)が 少ない設計。 publicメソッドの引数には、なるべくクラスを使わない。 クラス内部で別のクラスを生成しない(必要な場合は外部から渡す) >クラス内部で別のクラスを生成しない(必要な場合は外部から渡す) 全部main(String [] arg)で作るんですねわかりま… リファクタリングがしたいと思ったとき、 こういう考えの流れになっていないとだめ リファクタリングしたい ↓ リファクタリングするにはユニットテストコードが必要 ↓ 既存のコードを(なるべく)修正せずにテストするにはどうするか。 ↓ (依存関係が無ければ簡単にテストコードを書けるが、たいていはそのままではテストコードかけないので) 既存のコード・クラスをどうやって他のコード・クラスとの依存関係から分離させるか。 この分離が一番大変な作業。 分離させることに成功したらあとは簡単。 ユニットテストを書いてコードを修正すればよい。 正直名前変更くらいしか使ってないな、それでも相当便利だが >>8 名前変更(リファクタリングブラウザの機能)というのは、 例えて言うのなら小説を書く(リファクタリング)ときの文房具(リファクタリングブラウザ)と 同じ関係だよ。 文房具を使って文字を書いたり、消しゴムで消したりという作業は、 小説を書くための道具を使っているわけだが、 本質的には小説を書く行為そのものではない。 XXXはXXXXXであるべき、なんてXXは全くもってXXXだ。 >>1 その通りです。 何か嫌がらせされてる気がする。 ごめんなさい。取り乱しました。 ソフトウェアテストで良い本ありませんか。 このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所 リ略をただのコード修正だと思わないでよ コーダの思いがこもってるんだからあ え…あぅ……わ、私そんなんじゃないのに… これは、コード修正じゃなくてりふぁくたりんぐなんだから! ちゃんと勉強してから出直しなさい! なによ……わざわざしてあげるんだから…何か言いなさいよ! あっ、べ、別にアンタのためにやるんじゃないんだから、 勘違いしないでよね!ばーかばーか! なんか決まりがあって、そうしないとダメだって言ってるような頭固い人間がプログラムしてるのが間違いだろ。 目的に即してれば、細かいことは違ったって問題ないのに、それは手順としてあーだーこーだ・・・みっともない。 >>12 遅レスですまん ファウラーの「リファクタリング」は必読 「パターン指向リファクタリング入門」はオススメ あと、関連してデザインパターン関連の本を読んでおくといいかも リファクタリングって流行らないね。 そもそもリファクタリングするために必要なユニットテスト技術も未熟だからか。 日本は技術レベルが低いよ。 愚痴はここまでにして、データベースのフィールドってリファクタリングするのに 厄介だよね。ただの文字列だと名前変更に追尾できない。 それはO/Rマッパー使ってもそうだけど、データベース関連はリファクタリングを念頭に置くと、 SQLとデータベースからクラスとして自動生成したほうがいいのかもしれない。 このクラス(仮にDBCLASSとする)ではデータベースのフィールドが一メソッド(プロパティ)になる。 これはビジネスロジックを書くいわゆるモデルではなく、データベースの構造をあらわすだけのクラス。 DBCLASSのプロパティを変更しても、DBCLASS内部でアクセスしているデータベースのフィールド名は変わらない。 逆にアクセス先のデータベースのフィールド名を変えると、DBCLASS内部でアクセスする データベースのフィールド名も自動的に変わる。 ウェブアプリの場合、同じ問題が フォームのクエリー名にも当てはまるんだよな。 要はデータではなく、意味がある名前であるキーを ただの文字列として扱うのはやめようということ。 フォームのクエリー名を変更したら、 自動的にコードの名前に反映させたい。(逆もあり) そのためのコードの生成機能が必要だよ。 >>26 いまだにフォームの設定かいたら、その部分のコードが自動生成されないの? みんなふつうにやってるとおもったんだが気のせいであったか。 >>27 何の話? 自動生成されたとしても、それを文字列で扱っていたらだめだよ。 ようはリファクタリングブラウザで、それがキーとして認識されるような形になってほしい。 リファクタリングだけじゃなくて、コード補完もできるようになるから間違いが減るしね。 コンパイル時点でのエラー検出もおこなえるようになる。 社長に今なにやってる?と聞かれてリファクタリングしてます、と答えたら いつも波風が立つのはなぜだろう リファクタリングがなんなのか、メリットとデメリットについてなど 理解してないからだろ こういう成功例を見せながら地道に説得していくしかないんじゃないの? ttp://ascii.jp/elem/000/000/497/497905/ >>30 いい記事だった。 そこの社長ぐらい、うちんとこの社長も柔軟な頭だったらいいんだがなあ 理解させるには分かりやすいたとえが必要だと思う。 例えば平屋を拡張して2階、3階と増やしていったら、 1階にも手に入れないと、いつか倒壊しますよね?とか。 そもそも本当に1階にも手を入れないと倒れるのか? やってみたら意外と倒壊しないんじゃないの?、とか 理解のないシステム 会社はそれだよね。腐ったシステムを抱え続けると将来的にどれだけのコストになるかわかってない。 だから目先のコスト増に怯えて将来の飛躍の芽を摘んでしまう。 リファクタリングの重要性のわからん上司にどうわかってもらうかでずっと悩んでいたが、 理解のない人にはリファクタリングしているとはあえて言わないのも手だと Ruby版リファクタ本に書いてあって目から鱗だったわ リファクタリングしていると、仕事を押し付けてくる奴がいてうぜーよー。 どうもそいつはリファクタリングしている=暇そうにしていると思っているっぽい。 >>39 >リファクタリングしている=暇そうにしていると思っているっぽい。 正解だから困る >38 組み込み向け「軽量Ruby」と「Rubyチップ」、福岡県が経産省の事業で開発へ ttp://itpro.nikkeibp.co.jp/article/NEWS/20100628/349693/?ST=oss 的外れな提示だったらすまそ。 組み込みスクリプトってLuaとかあるし普通じゃね、と思ったら 組み込み機器のほうの話なのか >>45 いちおうLuaはヤマハのルータなんかにも使われているぽい。 リファクタリングなんてやって意味があると思ってる奴は消防 A〜Zまであるクラスの共通処理をPクラスとして纏めたとするわな したら、PクラスをいじるたびにA〜Zまでの影響範囲を調べなあかんのやで 仮にAにしか関係しないPに入ってしまった共通処理を弄るのだって 一度結合したらはがしてAクラス特有の処理としてPクラスからAクラスを避ける処理なんて 結構、邪魔な処理になるで それでもPとしてまとめてしまったらA〜Zまでサポートしていかなあかんのやで リファクタリング、結構、だが、誰がこの未来を予測できる? A〜Zまでの共通処理が走ってるPクラスを蹴飛ばしてPAクラスを新しく作って A−PA、B〜Z−Pの関係を新しくぶった切るような切込みはできんやろ? せいぜいPの処理にcase Aを入れるような修正が精一杯やないか? 今後を考えてリファクタリングなんてする意味があるんか? 共通処理をまとめるだけがリファクタリングではないし、 自動テストが伴わないものはリファクタリングとは呼ばない。 >>50 いや、上で書いたのはあくまで例だよ 上の例は処理をまとめることによって明らかに構造が汚くなってるよね? この先もまとめたPクラスにA〜Zへのどれかの追加が入るたびに case B、case C・・・と追加されていくだろうね そのときPクラスを消滅する選択肢は誰か選べるんだろか? こーゆーのってさ、その時点ででは確定しなくね? じゃ、リファクタリングってなんのためにするの? って根本的なところに目を向けたときに次の開発をしやすくするためでしょ? したら、その仕様書もなしでリファクタリングをするってことは 仕様書もないのにプログラムの構造を「俺が好き」なだけの構造にただ意味もなく 書き換えてるだけのマスターベーションなんだよ どこの幼房かしらんが、 case B、case Cとなるようなまとめ方はアフォがやるものだろ。 それはリファクタリング以前の問題。 >>53 ほうほう、それじゃ上記の例でPの共通部分にAのみに変更がかかったらどう修正する気? >>54 Aが自前で実装すればいいんじゃね それか、Pが取る引数を工夫して柔軟な対応ができるようにする >>54 Aが自前で実装するように戻す。 あとそういうのは例えばStrategyパターンを使うべきで、共通化するものじゃない。 それすら分からないなら幼房。 >>55-56 >Aが自前で実装 だが、現実は絶対にcase Aを入れる 自分のソース見てみろ 今回は俺が逃げ道塞いだから自前で実装って言っただけだろ?w 正気に戻ればPクラスなんてつくらねーんだけどな 素直に継承するとか、デコレータパターンとか ほかに影響に与えずに拡張なんていくらでもやりようがあると思うよ >>57 いや、その場面でcaseとか、既にそういう実装だった場合を除いてしないと思うが… >>60 違うな 大抵の場合、外部とのやりとりをA〜Zまでまとめない一心でPクラスで作ってしまうから Aだけ切り離してもインターフェースがPを通しているのでPにAへの変更を吸収してもらうほかないって感じになってるはず じゃないとまとめたうまみないしねw 結局>>49 =>>52 =>>54 =>>57 =>>61 が何言いたいのかわからん。 1+1は?と聞かれてみんなが2と答えたら、田んぼの田だやーい間違った間違ったと はしゃぐ鼻水垂らしたガキにしか見えないんだが。 >だが、現実は絶対にcase Aを入れる >変更を吸収してもらうほかないって感じになってるはず 想像と主観だけ。 >>49 はコーダーのレベルにすら達することの出来なかった落ちこぼれ 自分が何が分かってないかすらわかってない 元々>>49 が意味不明なこと言っているのが原因だろ。 >>49 =>>68 が具体的なコード出せ。そうしたら反論してやる。 まあ、コーダー未満の池沼だから出せないだろうが。 >>69 わかってないのは君だけじゃないの? 無駄だってわかりつつやるとお金もらえるからみんなやってるだけだよ 「なんのためにするリファクタリングなのか?」 って考えたらすぐに自分のやってることの無意味さに気がつくはず 現状の設計とマッチしてないから合わせるならわかるけど それは開発段階で気がつくただの不具合だよね? 将来どうするのか?もわからないのにどうしてコードに手を入れられるの? 仕様書無しでコードに手をいれるのはダメだダメだあれほど言ってたのになんでこういうオナニーは好きにやっちゃうの? 目的がわからないのに最適(?)なコードなんてわかるわけないじゃない なんのためのリファクタリングなの? すべてがおかしい、でもお金になるし偉い人もやってるからやる ただ、それだけのもんだよこれは >>70 やあ幼房。>>49 を読んで意味が分かるのは池沼のおまえだけだ。 >>71 うっとおしいからやめろよ 変な言葉も聞きなれない横文字も使ってないし誰でもわかる内容だ 内容の意味がわからないのは経験が浅いからだろ >>49 はリファクタリングの前にオブジェクト指向を勉強したほうがよい よくわかってないプログラマとか プログラム中で使用する文字列をすべてヘッダで#define切っちゃうのとかよくいる 使うその場に直接書いたほうがいいことに気がつくのはいつのことだろうか? 文字列は切り分けたほうがいいよ 聞きかじりで行儀の良いとされる作りにしようとして 多重定義したり実際の文字列探すまでが長かったりする くそみたいな所が多すぎるからそう感じるんだろ >>77 意味がねぇからさ ソースをみた瞬間に文字列が直接書いてあればその時点で意味がわかる それを#defineきったら今度は命名した奴のセンスに丸投げすることになる それが必ずしもわかりいい名前をつけてくれるとは限らない また、複数個所でこの文字列を使うことがあったとして・・・いや・・・ないだろ?w あるならなにかおかしいんだw 文字列の場合、数値とはちょっと違う事情があってこういう定数を#defineを切るのはあまり意味ない また、数値の場合も俺は#defineを切る意味がないと思ってる こんなこというとすぐに頭に血を上らせてソースでいきなり出てきた数値の意味が〜云々で怒るやつがいるが 俺はそうじゃなくてソースを読んで出てきた数値がわかるようなソースを書くべきだと思ってる ちゃんとインスタンスの生成箇所をしっかり制御すればそもそもプログラム全域に一つの値が 複数使いまわされることなどほとんどない(はず) 数値計算(3.1415・・・)ですら特定のファイルにまとまる しかし、プロジェクトにグローバルインスタンスホルダー(大域変数セット)などあると俺の言ってることは全く理解不能だと思う こりゃまた、もの凄い珍説が飛び出したもんだ。 責務やカプセル化の話と、可読性とはイコールではないだろーに。 自分の説の論理的な飛躍に気づけないのか? 「必ずしも分かり易い名前を付けてくれるとは限らない」 「ちゃんとインスタンスの制御をしっかりすれば複数箇所に出てくることはほとんどない」 まともな名前すら付けられん人間が「しっかりとしたインスタンスの制御」なんてやると思うかい? >>81 インスタンスの管理なんてやる必要があるのはグローバル変数使ってるからだろ? >>82 だとすれば >ちゃんとインスタンスの生成箇所をしっかり制御すればそもそもプログラム全域に一つの値が >複数使いまわされることなどほとんどない(はず) ってのはグローバル変数使ってる前提なのか >>83 なんでそうなるの? いままでグローバル変数にばっかたよってるからそういう脳みそしかないんでしょ? いや俺の脳みそ云々の問題でなく、矛盾してるんだってば 管理が要らないのか要るのか、どっちなのさ >>85 それとグローバル変数がどうして関係あると思ったの? >>83 での「だとすれば」がどういう意味もってるのかわからない なにが「だとすれば」なの? 馬鹿だからグローバル使うしか方法わからないだけじゃない? いままでプログラム組んでてこの程度ってすごくみじめ グローバル変数を使わなければ管理が要らないなら 何故にインスタンスの制御とかの話になったの? 要らないんでしょ? >>89 グローバル変数使わなければね 俺の言ってることなにか矛盾してる? >>91 あんまり気にしなくていいよ 「ちゃんとインスタンスの生成箇所をしっかり制御すれば」=「グローバル変数なんて使うほどお馬鹿じゃなければ」 って意味だからw >>92 ちょっと待て、たかがグローバル変数を使わないだけのことを 「ちゃんとインスタンスの生成箇所をしっかり制御」 なんて仰々しく書いてたのか >>93 仰々しく書いたつもりはないけど 君にはできないことだよねw #define 使うな、までは同意できたんだがなあ… リファクタリングなんて、簡単な概念でしょ。 たとえば、多角形を表示するプログラムがあったとする。 それは実際は三角形を表示するプログラムを反復実行してるとする。 三角形を表示するプログラムは、線を表示するプログラムを反復実行してるとする。 線を表示するプログラムは、点を表示するプログラムを反復実行してるとする。 すると、 点を表示するプログラムを、高速に書き換えれば、 これに依存した全てのプログラムが、その内容を変更しなくとも、高速化する。 ってのがリファクタリング。 これのポイントは、修正したのは点を表示するプログラムだけで、それ以外は一切変更していないのに、他も高速化できること。 このためには、インターフェースを極力保ったままで、中身だけを変更することが重要になる。 これがリファクタリングと、普通のコード修正との違い。 >>99 近いが微妙にはずれている。 リファクタリングと高速化は無関係。 リファクタリングした結果、高速化することもあれば (他にメリットがあるならば)逆に遅くなることもある インターフェースも変えないこともあれば変えることもある。 リファクタリング本にもしっかり、「インターフェースを変えるリファクタリング」が載っている。 リファクタリングの目的はアプリ全体の動きを変えずに、ソースコードを綺麗に改善すること。 ただこの目的を達成するために、適当に修正するのとリファクタリングとでは違うものがある。 それはリファクタリングはちゃんとした手順でやるものだということ、 この手順に従うことが、修正とリファクタリングの違い。 どういった手順があるかは、リファクタリング本に書いてある。 この手順に従って修正することでバグを入れずに修正することが可能になる。 高速化は変更の具体例として挙げているだけで、 高速化がリファクタリングだとは言っていないだろ。 >>101 I/F変えたら機能変更だろ。 リファクタリングの範囲をどこまで取るかであって その範囲で内部I/Fは変わることがある。 手順がどーのだって、効果的な手法がそうだってだけで、 ある作業がリファクタリングかどうかの判断に手順は関係ない。 >>103 > I/F変えたら機能変更だろ。 え? そんな事言ってもなぁ。 インターフェースを変えるリファクタリングはたくさんある。 メソッドの移動、クラスのインライン化、メソッド名の変更 引数の追加、引数オブジェクトの導入、メソッドの隠蔽 メソッドの引き上げ、階層の平坦化、継承の分割、他 リファクタリングの目的は、高速化という今すぐに効果があるメリットのためではなく、 過去にその場しのぎで対応したコードの修正とか、設計上まずいコードの修正とか 過去の負債、将来への投資として行うものだよ。 設計がまずい=インターフェースがまずいってことはよくある話で、 コードを改善するためには、インターフェースを変えなければいけないということも当然ある。 >>103 > I/F変えたら機能変更だろ。 インターフェースが機能になってるのは ライブラリぐらいなもんだろ。 システム(アプリ)の動作さえ変えなければ リファクタリングでインターフェース変えたっていいんだよ。。 インターフェースが変わりますって他の開発者への通知が 必要なことがあるかもしれないが、それは、通知すればいいだけの話。 それが世界中巻き込んで大変なことになろうが、 社内の一部だけしか関係ない小さなものだろうが、 「やってはいけないこと」ではない。 >インターフェースが変わりますって他の開発者への通知が >必要なことがあるかもしれないが、それは、通知すればいいだけの話。 幸せな環境だ・・・ >>108 かわいそうな環境の人?w そういう場合に、古い関数を DeprecatedやObsoleteと書いて リファクタリングする方法もあるよ おお、Javaがやってる方法じゃん Java PGは可哀想な子だからな DeprecatedやObsoleteは どの言語でもやってることだろ。 なんかこう、俺とは一段以上 下のレベルの 奴しか見当たらんよなw そう。どの言語でもやってる。 何故ならインターフェースなどそう簡単に変更できないからだ。 それなのに > 必要なことがあるかもしれないが、それは、通知すればいいだけの話。 のような事を書くほど低レベルのPGはJava PGだけだと予想して釣ってみたが、 やっぱりその通りだったねw 「なんかこう、俺とは一段以上下のレベルの奴しか見当たらんよなw」(キリッ >>112 意味がわからんw インターフェースが簡単に変更できないからって、 絶対に変更できないわけじゃないだろ。 お前頭が硬すぎじゃね? めんどくさいからコードに対する変更はもう全部リファクタリングでいいよ >>109 若干かわいそうな環境かも。 機能毎に縦割りでリーダーが立ってて 「こっちは機能追加が進んでて人居ない」とか 「影響が大きい」とか言われて とてもじゃないが変えられない。 それでも自担当の部分だけでもリファクタリングする工数が 貰えるだけマシなのかも知れんけどね。 JavaのPGやってるけど privateメソッドを修正するだけでもJAVADOCの修正とかユニットテストが更新されるからって チーム内でそれを拒む人いるんだよなー ってか、お前が俺のソースコピペして、俺がその責任背負わなくなくなるのが嫌なんだろwwwどうせwww やっぱり目的が意味不明 設計ミスならリファクタリングという形で手を出すべきじゃないし 汎用性の向上にしても次の開発やバージョンアップの仕様書があってこその修正だ 単純にリファクタリングってのが何を目的としてるのかどの文献を読んでもまったく意味不明 >>119 でっていう 教えてほしいならそう言えよw そうでないのなら、やり方はひとつじゃないんだし、お前の好きなようにやれば? >>120 じゃあ、質問だけど これは何を目的とした作業なの? 時間と共に増大する複雑性への対処では。 書いたソースが自分たちのものになるのかで大きく価値が異なると思う。 複雑性が増すと修正にかかる工数が増えるけど、それを良しとするか悪しとするか。 果てしなく続くメンテナンスと機能追加を前提として それぞれのモジュールの精度を高めるために必要な準備作業 じゃないかな 何いってるのかさっぱりわからない じゃ、質問をかえる その作業いつ終わるの? >>122 >時間と共に増大する複雑性への対処では。 何?複雑性って? 仕様とコードが乖離してるの? そもそも仕様や設計がまずいの? 仕様や設計はバッチリなのにコードだけ綺麗にしようとしてる?(場面がまったく浮かばないけど) >>123 精度?よくわからないけど 精度が高い状態と低い状態があって それを判断する手段があるって言ってる? 高い状態はどうなってて、低い状態はどうなってるってのを説明してほしいんだけど? >>125 仕様が変わることによって設計がそぐわなくなったときの対処についてはどう考えているの? 仕様や設計がまずいといえばそれまでだけど、 完璧な仕様や設計は期待できないでしょ >>127 んー それをコードにいれちゃうのはなんかちがうなーって思う だって説明として仕様や設計に入ってもいないクラスが 自分の考える汎用性のためだけに入ってるってことでしょ? まあ、昔の俺ならそういうコードいいと思ったけど 最近はこういう見切り発進みたいなコードをちっともいいと思わなくなった むしろ余計なもん入れちゃうのってどうよ?って思う 余計なもんなんかいれない。 ”必要だから” 入れてる。 >>129 自分の考えるよりよいコードを実現するためのひとつの手段がリファクタリングなのであって、 お前がリファクタリングは不要と考えるならそれはそれでいいんじゃね リファクタリングしなくていいよ >>130 でもそれって仕様書にないよね? どうやって説明するの? これまで派遣やってきたけど そういうの許してる大手なんてみたことないけど >>129 見切り発進と思うのなら、修正した方が良いと思った内容を提案してみては。 受け入れるかは組織なり人なりタイミングによると思うけど、 少なくともうちだったら、そういう提案してくれる人は歓迎するけどなあ。 その人の持つ技術力の評価や信頼にも繋がるし。 >>132 大手なんて10年は遅れてるじゃん ゴミコード量産の現場でリファクタリングしようなんて、俺だって思わないな メンテする奴が死ねばいい >>132 じゃあ聞くが、お前の所の仕様書には、 ifやforやローカル変数名が書いてあるのか? 使用する命令はそれ以外のものは 一切使ったらいけないと書いてあるのか? >>135 そんな話はしてないじゃん でもこっちの場合はそういう制御文にとどまらないもんができちゃうよね? 必要のないクラスだったり関数だったり >>136 なんか勘違いしてね? 必要ないものってなんのこと言ってんの? >>136 世の中に必要なクラス・関数を網羅した 仕様書なんて無いよ。 >>137 仕様と関係ないソース 汎用性のために入れましたって言うんでしょ? この表現でわからないならデザパタ使うと出てくるゴミクラスなんか全部該当すると思う >>139 仕様と関係ない関数は不要なので、コードはすべてmainの中に書いてくださいね >>141 いくらなんでもそれは話が飛びすぎてて馬鹿っぽい デザパタでぽこぽこ生まれるゴミクラス問題は 特定の言語に固有の問題であって、リファクタリングの問題じゃなくね? http://www.norvig.com/design-patterns/ >>143 リファクタリングは保守の一つなのだから、 コードを修正するならば言語に関係なく発生する問題。 リファクタリングとデザパタは 特定の言語固有とか言う以前に、全く関係ない話題。 ついでにデザパタで作るのはゴミクラスではなく必要なクラス。 他の言語では作る必要の無いクラスを作らされたら ゴミクラスと言いたくもなるわい 他の言語では、定義する必要がない型を 定義しても、ゴミ定義とは言わないだろ。 単に、エラーを見つけやすい方法で書くか、 短いコードだから省略して書くかの違いでしか無い。 >>148 Strategyパターンはファーストクラスの関数があれば クラスを作る必要は無いな うん。だからそれは、インターフェースを守った きっちりとしたアプリを作るかどうかの違い。 きっちりしてるというのはどういう意味だ? 静的型検査という意味なら勘違いも甚だしいぞ >>152 コード上に、インターフェースがちゃんと表現されているという意味。 インターフェースを守らない、間違ったコードは組み込めないという意味でもある。 >>153 だから、それは静的型検査という意味じゃないのか? >>154 無名クラスがあれば代用可能 無名クラスも無い?あきらめろ このように、言語によって クラスが必要かどうかは違ってくるというのに、 設計書と呼ばれるものに、そこまでちゃんとクラスを書いているのか? 普通は書かないだろ。 だから、設計書と呼ばれているものは、実は設計書ではない。 コードこそが設計書そのものなんだ。 >>156 >だから、設計書と呼ばれているものは、実は設計書ではない。 >コードこそが設計書そのものなんだ。 そりゃ違うだろ 設計書と呼ばれてるものも設計書 ただ、粒度が異なるだけ ただなぁ, 世に存在するうちの設計書で, なぜこれが必要か といった, 設計ポリシーとともに書かれているものは, ごく稀 で, 最後には ソース読め 状態になると思ってるんだ 仕様書は役に立たないがテストの手順書はとても役に立つな なにをやるための機能なのか一発でわかる 対して仕様書は嘘、間違い、抜け、バージョン違い、勘違い 更新忘れ、認識間違いばっかりになってほとんど役に立たない 仕様書いらなくね? っていうかテスト手順書でよくね? ちなみにおそらくテスト手順書は仕様書を見て作られてはいないだろうな やってみて「ふーん・・・これだろ?これが仕様だろ?な?」的な感じだと思う 仕様書とソース・プログラムの挙動が不一致ならバグ認定、即修正 っていうレベルのもの以外は仕様書に書くな!!!! >>160 ショートカットとか本当にどうでもいいもののリスト作ってるひまあったら他のことやれよな >>134 > ゴミコード量産の現場でリファクタリングしようなんて、俺だって思わないな なんかすごくよくわかる。発注しまくりでゴミコード量産しまくりで身動きが取れないわ うちのプロジェクトjavaソースだけでついに1万個を超えた リファクタとかいうレベルじゃねーだろ >>163 すごいな まんこの部分だけ強調して三回ぐらいは口にしたいよね javaでもすでに10年物のソースコードとかあるからな リファクタリングとか、 10万行のソースコードがあったとして、 その10万行のソースコードを、読んだってレベルじゃなくて、そうとう熟知した状態で 1人で行わなきゃならない ていうか、それできるレベルなら、多分最初から書き直したほうが綺麗に書ける まぁそれは理想で SE共のいってるりファクタリングは機能ごとに、ちょこっとずつ最適化していく程度のものを言ってるよね 自分の能力でソースコード全体を見渡せる範囲で何とかするリファクタリング なんていうか、それはね まず木で作られた線路を、途中から鉄にして、さらに途中から銅にしたようなもので、本当に器用に継ぎ接ぎをしてるだけ その継ぎ接ぎ部分はとてもシビアになるし、バグが出ても特定不可能で、 「よくわかんないけど、○○にすると落ちるから☆☆にしといてwwwwwwwwwwwwwっうぇwwwwなんで落ちてんのwwwっうぇwwww」みたいな状況にもなりかねない ソース全体を見渡しているわけでもないリファクタリング作業なんてのは、あまりやりすぎると ゼロから書き直す以上の労力をいつの間にか注いでいる事にもなりかねないので 最低限以上はやっちゃいけない >>166 お前は、ただのコード修正をリファクタリングと言ってるだけだね。 リファクタリングは単なる「コード修正」とは違うもの。 リファクタリングは「既存の動きに影響を与えない方法を使ってコードを修正すること」 既存の動きに影響を与えない方法ってのがあるんだよ。 これを使わないとリファクタリングにはならない。 行き当たりばったりの思いつき修正とはわけが違う。 論理的に考えぬかれた体系化されたテクニック。 それカタログ化して解説した本が、世の中にでてるリファクタリング本 >リファクタリングとか、 >10万行のソースコードがあったとして、 >その10万行のソースコードを、読んだってレベルじゃなくて、そうとう熟知した状態で >1人で行わなきゃならない >ていうか、それできるレベルなら、多分最初から書き直したほうが綺麗に書ける とてもじゃないが、まともに教育を受けた人間の書いた日本語には見えない。 > 「既存の動きに影響を与えない方法を使ってコードを修正すること」 ここで仕様をリファクターする必要を考慮しないのがリファクタリング厨 >>169 リファクタリングは仕様を変えないのが原則です。 仕様を変えたほうがいいこともあるが、 それは修正であってリファクタリングではありません。 あたまがわるーい。 ユーザーインターフェースかわんなきゃリファクタリングと言ってみるtest > 仕様をリファクター はぁ? んなもんリファクタリングじゃあなーいと言ってやれ。ドキュメントをリファクタリングしちゃるとか言ってる奴、それもリファクタリングじゃねーぞコラ。そういうのは、リストラクチャリング(再構築)というのだッ。 仕様変更にまで手をいれない修正だったら俺はする意味ないと思うけどね いいと思ってるのは自分だけっていう典型だと思う 試験とか全部やり直しになるけどそこまでコードに重心置けないです しかも動作は変わらないとかね >>174-175 あんたたちに言いたいことは、全て本の最初に、 それは違うよって書いてあります。 つまり、そのレスはFAQで答えがバッチリ出てるので、 今更議論するような話ではないです。 >>176 とかいって逃げたいから自分の言葉で説明しないで本に書いてあるとか言ってるんでしょ? わかるよ 説明できない人ってみんなそうだもの あんたもいっしょ 残念だけどここ本質なのよね そもそもリファクタリングっていう行動自体意味がわからない 将来どう変わるか?の仕様もないのに汎用性? 何に対していってるの?あれほど仕様書に重点をおいてるのに なんでコードレベルでソフトウェアの方向性がわかるの? それと何度もいうけど全体の工数からいったら実装なんてすげー短い期間なのに リファクタリングなんてしなくていいんだよ 馬鹿かよ 設計や仕様決めに時間割いたほうがいいの、わかった?御馬鹿ちゃん? 人件費みたって派遣PGと正社員様様と比べて比較になるわけねーだろ そんな糞みたいな脳みそしかないんだったら技術者なんてやめちゃえばいいのに 単純なシチュエーションだと、今動いているものがあって それに仕様変更や機能追加をする"前"にリファクタリングしたり えーちょっと何やってんのか分からなぁ〜いって時に、リファクタリングして今の動きを確認したりする鴨 さすがに何も用事が無いのにリファクタリングはしないぞw >>179 ローカルのHDDの中で勝手にやってろレベルだなw >>177 どうしたの? したくないならしなくていいんだよ? 別にお前のコードのことなんて知らないし 仕様書を大雑把に ・機能仕様書:ユーザの観点からシステムがどのように動くか記述する ・技術仕様書:プログラムの内部実装について記述する に分けたとき、機能仕様書を変更しないのがリファクタリング 技術仕様書は変更する必要がある と、俺は解釈してるんだけど >>182 そんな金になんない仕事やったらダメだよ 仕様どおりには動いているんだ よほど現実からかけ離れた組み方でない限りはそんなところにお金を入れてはダメだ リファクタリングの価値は リファクタリングしたことによる将来のメンテナンスコストの低減分だと思うから、 純粋なリファクタリングをする意味ってあると思うけどね。 まあ、少なくとも、作ったコードを客に出すのが仕事の人は、 リファクタリングの価値を見出すのは難しいだろうね。 お客が腐ったコードをメンテナンスし続ける費用を負担してくれる限り、 工数がかかる方が、お金になるだろうから。 寧ろそうやって放置されたコードのメンテナンスの際にESP能力を発揮しながらリファクタリングして日銭稼いでますが何か。 >>184 でもドングリの背比べじゃない? 仕様にまで踏み込めないレベルの修正でなんか変わるの? 同じ人、もしくは似たようなレベルの人がやんでしょ? >>186 同じようなレベルの人がやったら対して変わらんだろうね。 時間がなくて小手先で直したのを時間が取れる時にまともに直すとかかしら。 あほなプログラマが書いた動くけどわけわらんプログラムを レビューで突き返したりするのもリファクタリングになると思うけど、放置するの? >>187 でも設計レベルではなにも変わらないんしょ? アホだろうがどうだろうが違いがでるレベルにならんのとちゃうか? >>186 > 仕様にまで踏み込めないレベルの修正でなんか変わるの? お前コード書いたことないだろ? >>188 お前の言う「設計レベル」ってどういうことだ? コードには設計があるのは知ってるよな? それは機能のことじゃないぞ。 >>189 あるけど そこでそんなに違いが出るとは思えないんだよね 大手もそう考えるから(いや実際そうなんだろう)PGは派遣ばかりなわけだしね http://www.os.cis.iwate-u.ac.jp/wikky/wikky.cgi?%E7%AC%AC2%E7%AB%A0%EF%BC%9A%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E5%8E%9F%E5%89%87 2.1 リファクタリングの歴史 リファクタリングの先駆け:1980年代以降Smalltalkの仕事をしていたWard CunninghamとKent Beckの2人 Smalltalkはリファクタリングに特に向いている環境 コンパイル、リンク、実行のサイクルが短く、コードを気軽に書き換えることができる 彼ら2人の考えはSmalltalk文化にリファクタリングの概念を定着させた 筆者「リファクタリング?そこまで重要ではないよ」→Kentと同じプロジェクトに携わり、 Kentのリファクタリングを目の当たりにする→ソフトウェアの生産性、品質に明らかな違いが…→筆者「!!」 上の経験からリファクタリングを重要視するようになった >>192 そのストーリーって重要な部分なの?w しかもそんな馬鹿みたいな長文書いて大事な要点がちっとも書いてないじゃん >ソフトウェアの生産性、品質に明らかな違いが… 明らかに大事なのってこの部分の詳細だろ 何がよくて品質がどうよくなったのか? だろ? お前の国語の能力低すぎてリファクタリングまで怪しくなるわw >>193 そういう文句はオリジナルを書いた奴に言え。 >>191 違いを理解できない能力なだけじゃないの? 重複の除去が有効とか書いてあるじゃん 前にやった仕事で、ほんの一部を除いて同一の機能を持つモジュール2つが 別々の人によってそれぞれ実装されてて 目玉飛び出そうになったのを思い出した 別にいいじゃん その2つをくっつけることで後に呼び出し先Aの機能を修正したいだけなのに その機能がわざわざまとめられてるために もう一つの呼び出し先Bのソースまで洗わないといけなくなるかもしんないだろ まとめるのは必ずしも正解ではない >>199 必ずしも正解ではないのは正しいけど 同じような修正が必要になったときに片方の修正が忘れられることの方が多いと思われ 共通で使われてるメソッドの参照元を調べることより クラスもメソッドも違うけど実は中身が同じでなければならなかったのを探すほうが大変な気が 分ける理由がないうちは一緒にしといて 必要になったら分ける方のが正しいと思う ちなみに >>198 は その両方を移植する仕事だった 「工数儲けた」と思ってたら 両者をソース読んで同一機能であることを確認した上で 一つにすりあわせて、その承認もらう羽目になったとさ 当然まともな設計書なんてありゃしないし >>200 いや、お前の言ってることはGoogleやAppleでは正しいだろうな だが、日本の工業製品ではNG もちろんいいたいことはわかるけど それじゃ見積もりがとれないこの1点でNG 色々な大手でたくさんのプロジェクトが走っていて 共通ライブラリなんて生まれないっつか生まれても消滅してしまう理由はここにある 修正の影響範囲が巨大すぎて見積もれない また、修正時に全員が同じタイミングで対応できない これも大きな問題だ こっち動かなくなるのに「直したよ〜」とかメールくれられても困るだろ? そっちに手がまわらないのにリリース前に真ライブラリでバグってリリース失敗であぼんとか話にならない 修正した本人は「いいんですーこれが本来あるべき姿なんです〜」って主張しようと 修正するほうは「糞が・・・」って思うっしょ? まあ、MSの出荷するもんにみんなが愚痴をこぼす瞬間だと思うけど >>202 で、その壁を超えられる所が勝ち組で 超えられないところはどんどんブラック会社化するわけだ。 仕事、つまらないだろう?w >>203 でもいくらもないっしょ? 日本のITって進化に失敗してて紙業務を電子化したような仕事のほうが多いよね? 韓国にもすっかり抜かれちゃったみたいで国内全員でショボーンって感じじゃない? 研究開発分野と本当に極一部だけだろうね まあ、いまそういう開発してても日本じゃいつ紙業務の電子化ITにまわされるかわからないから 勝ち組って意味でいうと海外脱出組が勝ち組だろうね >>204 ごめんな。 うち自社で作ったウェブサービス提供する会社なんだわ HTML5系とかそっち系。 選ぶ会社の時点で勝ち負けが決まるよね。 仕事、つまらないだろう?w うちは少数精鋭なんで(使えない奴はやめさせられる) 同じコードをいくつも書くとかそんな無駄なことやってられないんだよね。 テストも人海戦術で同じことを何度もやるとか、時間的に無理だし、 もちろん手動テストは極力減らすので、変更したって 影響があるならすぐ分かる。 >>205 ウェブ系なんて工業製品とかわんねーけどな あんなん汎用性見越して組む必要あるかね? 寿命が短いからどう組んでもどうとでも動くが正解だろ? 納期まで早い方が真 お前の世界こそプログラムを綺麗にまとめて褒める奴1人もいないと思うがな >>207 汎用性見越して組むとか言ってないんだが。 無駄にある重複コードをまとめると言ってるだけ。 重複コードを作ると、納期が延びます。 修正があると、重複コードの分 修正量が増えます。 少しの修正であっちこっち修正して、 あっちこっちテストして納期伸ばしてるのは誰ですか?w >>209 それって何箇所? 10箇所?20箇所?程度なら貼ったほうが速いよね? 思いっきりまとめあげられてて難しい仕組みに頭ひねってソース解読しなきゃいけないぐらいだったら 単純コピーで貼ってあってくれたほうがまだソース読みやすいよね っていうか件数が100件いかない程度のコピペならお前が便所に席を立った間にやっておいてやるよ この程度の件数だったらどう組んでも変わらない >>210 お前適性ないんじゃね? ぶっちゃけ、仕事楽しくないでしょ? >>211 いや、楽しいよ お前みたいな対象物のメリットとデメリットも判断できんようなの出し抜いて数字上げるのが何よりの快感だわ(笑) 結局、技術の上部だけしかすくえないひとって何も見えてないんだよね 新しいってだけである意味パニック状態になってる自分がなにより見えてない 数字を出しさえすればそれが全てだと思い込んでいることはよく判った。 さぞかし楽しい人生だろうねぇ。 >>213 お前性格屈折してるな そうとういじめられたな >>210 > 思いっきりまとめあげられてて難しい仕組みに頭ひねってソース解読しなきゃいけないぐらいだったら > 単純コピーで貼ってあってくれたほうがまだソース読みやすいよね 申し訳ありません ifとforしか理解できない人もいるということを忘れていました リファクタリングの過程でデザインパターンを適用してしまったことをお許しください >>213 コピペもできるしリファクタリングもできる俺がそれを言うならまだわかるけど、 お前はコピペしかできないんだからさ、取捨選択の上でコピペを採用したみたいな言い方はやめてよ もっともらしい後付けをしたところで、お前のカードはコピペしかないわけで >>216 forすら理解してないかもよ 100回ループ廻すくらいならコピペするって言い出しかねん 正面から反論できないときは人格攻撃になるんですね その時点で白旗あげてるっていうかなんていうか >>219 だってー 低レベルな人を教育してあげる気なんて毛頭ないですしー >>220 でも自分のやってることの説明できないってのは問題じゃない? 結局トレードオフの問題であって やればやるほどとかどんな場面でもってわけじゃないってとこは否定できないわけでしょ じゃあ、君のやり方は正しいの?また、他の人と差がでるのは何が決め手なの? ってのは結局のところどこでも求められると思うんだけどね それが説明できないなら君に用のある人なんていないと思うんだよね みんな暇じゃないから(笑) トレードオフ考えてやるんだから やっぱりリファクタリングは必要ってことね リファクタリング全否定って人はいるのかしら トレードオフはコードをまとめる話だろ? リファクタリングはまったく必要ないよ そもそも意味わからないもん 次の仕様が決まってる中でのコード修正ならわかるけど 次になんの予定もないのに何に向けてどう修正してるのかまったく理解できない その修正はいいの?悪いの? オナニーで終わってない? これらを判断できる材料すらわからない 単に金をドブに捨ててるだけだと思う 汚いコード ゴミ溜めが如くきったない部屋で過ごしてもなーんにも問題無い ↑ ↓ チリ一つも落ちていないようなクリーンルームじゃないと過ごせない 綺麗なコード って話だろ? 何事もほどほどにしとけって事だよ >>225 人の話を良く聞かないで進めちゃって失敗するほうじゃない? >>224 キミがそのコードをずっとメンテナンスする責任者だとして、 どこかのプログラマが明らかにまとめるべきところまとめてこなかったり、 分けるべきところをを無理やりまとめてきたりした場合、 正しく動くという理由でそのままにしておくのかい? >>227 作るときに設計書にあわせてもらいます ソースだけ弄るってことはしません >>228 要するに仕様は変えずに設計を変えるんだろ リファクタリングじゃないか 最高 綺麗で動く ↑ 汚いが動く ↓ 綺麗で動かない 最低 汚くて動かない 一番下のは捨ててよし [動く/動かない] と [綺麗/汚い] の相関関係だお 汚いけど動くのは、綺麗だが動かないものより価値がある。 でも綺麗で動かないのを 動く にしやすいし、 汚いけど動くものも、後で何か変更するにあたって、動くのを保ちつつ綺麗にしておくと直しやすい。 「綺麗にする」のがリファクタリング。動かないものを動くようにすることとはイコールではない。関係はあるけど。 >>232 使用がバッチィからコードもバッチイって発想はないのか? 仕様が汚いと動かすのが難しい ↑ ↓ 綺麗な仕様は動かしやすい って関係はあると思うけど、コードと仕様は直接関係しないんじゃねの? >>234 汚い仕様を何とか動かすために、 汚い姑息なコードを大量に入れてる 例なら山ほどあるよ コードを綺麗/汚いで語るから話がおかしくなるんじゃないか。 リファクタリングって大なり小なり設計の問題の修正のことだと思うんだが。 オレがずれてるのか。 >>236 おれもそう思うよ. 仕様も設計の内だとも思うけど... もちろん設計の問題とコードの綺麗/汚いは関係ありますが? 最初にきちんと設計をしたつもりでも、実装段階では想定したとおりに行かなかったり、抜けがあったりすることはよくあることです。 実際に書いているうちにいろいろ思いつくこともあります。ちょこっと例外的な処理を付け加えて、を繰り返し、コードは汚くなっていきます。 そうしてソースがスパゲッティ化し、メンテ不能のソースとなっていきます。 そうならないようにするためにリファクタリングがあります。 リファクタリングとは、仕様を変えることなく、ソースコードを改造することをいいます。 汚いソースコードでもプログラムは動きますが、メンテナンスするのは大変です。 汚いソースコードと綺麗なソースコードではメンテのしやすさが全く違います。 なのできるだけ綺麗なソースを書くように心がけ、汚くなったら速やかに書き直すことです。 後々のことを考えて、わかりやすいソースに直します。 >>238 > そうならないようにするためにリファクタリングがあります。 そうならないように設計を見直す方が先じゃないか? 小手先でどれだけいじっても, 汚い設計は汚いソースを 再生産するだけじゃないのか? それだったら, 設計をリファクターすべきだ ぶっちゃけ, ユーザーインターフェースが変わらなきゃ 仕様の範囲内だ >>238 コピペはいらんよ。 汚い綺麗で語るとコードの可読性ばかりを問題にしてるように感じるって話。 だからリファクタリングがいらないとか言う奴がいるんじゃないの。 コードが綺麗であっても設計上の問題が存在することは当然あるよね。 コードの綺麗/汚いは設計の一部しか示していないと思うし、 その修正はリファクタリングの一部でしかないと思う。 >>240 したらただの仕様変更だよねそれって まあ、名称にこだわる必要もないけど 関数、クラスの仕様は変わっても システム全体の仕様は変わりません。 なので仕様変更にはあたりません。 設計を仕様と見なしたら 仕様変更を伴わないコード変更って存在するのか? aとかbとかわけのわからん変数名を 意味がある変数名に変更するとか。 I/F変更を伴うかどうかっていう観点じゃないの ユーザに見える部分とか 担当者の異なるモジュール間とか 結局、 外から見た目の振る舞いが変わるか/変わらないかがポイントで、 外から見た目の振る舞い=仕様であって 内部構造≒設計は、リファクタリングの対象 って事でおk? >>248 個人的にはソレが正しいと思うけど そう思ってない人がいる予感。 241とか >>249 じゃあ、リファクタリングってのは設計変更までを指すってことでいい? 何やんだかさっぱりわからないけど >>250 設計の範囲を定義しろ。 話はそれからだ。 >>251 そっちにまかせる >>248 がえらそうに宣言してるから>>248 に決めてもらうか (この人たち、なんで今さらこんな議論をしてるんだろう) そうか、リファクタリング本を読んでるのは俺だけだったか >>255 本の受け売りじゃなくて中身をちゃんと理解しろよ そういう手合いはおそらくよんですらいない 買っただけ 改修が必要になったときに初めて その場で interface をでっちあげて、その後、クラスお取替え これでいい気がしてきた リファクタリングを身に付けるとコードレベルでの設計力が上がりますか? 設計力は下がります でも組んだ後の問題に対する対応力は上がります 設計力あがるだろ 正しい設計のコードに 変化させるのがリファクタリングだ。 >>49-52 で結論は出てる リファクタリングはオナニー 好きにやればいい 公開オナニー好きでも床オナ好きでもその方法を誰も咎めることはできない オナニー? 自己満足と言いたいのかもしれないが。 仕事でやるのなら自己満足じゃないぞ。 みんなの満足。 密に結合した処理を処理を疎になるようにするとか 処理が対象になるようにシーケンス直すとか って意味があるリファクタリングだと思うけど こういうのはリファクタリングっていわんの? >クラス内部で別のクラスを生成しない >>4 のこの話って完全にはDIでも使わなきゃ無理だけど、 FactoryMethodで解決できるよね。 >publicメソッドの引数には、なるべくクラスを使わない。 完全抽象化クラスに類するもの限定ってなら正しいけど、 intや文字列型だけってのは無いよね。スタブ渡せば済む話だし。 言葉の揚げ足取りに終始しててウザいだけのスレになっちゃってるなw 大規模アプリには 必ずリファクタリングが必要。 開発工程の一つに加えていいレベル。 VB6で幾度となく機能追加が行われたコードをぼんやり眺めてると リファクタリング?何それおいしいの? という気分になってくる。 >>272 そういうコードこそ、リファクタリングが楽しいんじゃないの? 趣味でやるならすごく楽しい。一人でやるのなら絶対リファクタリングしてる。 けど仕事となると時間が取れない。 さらなる機能追加と他言語への移植作業用のドキュメントが優先になってまつorz 移植作業前にリファクタリングできたら解読も楽だろうになあ。 そんなことより成果物(ドキュメント)が優先だってさ。しゃーねーや。 リファクタリング本はかなり勉強になったな。 ぐちゃぐちゃなコードしか書けなかったのが、リファクタリングしまくってたら 最初からオブジェクト指向やらデザインパターンやらを考慮したコードが書けるようになってた。 リファクタリング中にバグが見つかっても修正しちゃいけないんですか? 振る舞いが変わるわけだし。 リファクタリング原理主義者の方の意見が聞きたいです。 好きにすれば?どうせ個人でやってんだろ 一人ならほんと楽しいよねリファクタ。 業務でリファクタなんかできねーよ リリースしてから何年も動いてるパッケージに手入れられるわけないだろ! 業務でリファクタリングの時は、バグの種類にもよるけど基本的にはそのまま。 勿論、リファクタリング後に修正することを見越してリファクタリングすることになる。 実は、バグを見つける為にリファクタリングすることもあるので、「できねーよ」で済まない場合もあるのよ。 バグを見つけるためにリファクタリングをすることはあるが 改修はリファクタリング前のコードに対して行うことになるなぁ リファクタリングとは テストの合格を維持したままの コードの修正でしょ 上を納得というか安心させるための無駄検証にコストを掛けた後だと いじくれないというのはわかる だがサブシステムを小分けして その範囲内で裁量をもたせられるようにしてないのはアカン >>282 > 改修はリファクタリング前のコードに対して行うことになるなぁ それって人件費を無駄に捨ててるじゃないか? 会社に損害与えてるよ。 プロ意識無いのかね? でも実は一発目無計画で作ってリファクタリングするのが一番品質がいい 一発目無計画っていうのがありえなさすぎ。 趣味のプログラミングだろそれは。 >>287 それは全然不思議じゃないね。 下書きだと思えばいい。 一発で書くよりも、下書きして全体を理解してから 清書する。 神ならざる身で限界を知りつつも最善を目指す手法ではないか 考え方の違いなんだよね。この業界に「ボーイスカウトの規則」っていう言葉があるらしい。 http://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63 > ボーイスカウトが、来る前よりも帰った後の方が山をきれいにしておくことにちなんだ規則。 > ソフトウェア開発においては「モジュールをチェックインする際には、必ずチェックアウト時よりも美しくする」ことを意味する。 リファクタリングしない人って、ただ動けばいい、コードが怖くて触れない。 他の部分はいじらないですませようとしちゃう。 修正しない部分なら見て見ぬふりもいいが、修正するなら、 そのまわりを綺麗にしろと。 それが出来ない人は、バグも多いんだよ。してシンプルにしてないから。 複雑なものはバグが多い。複雑だからコードを理解していない。 理解してないからバグが出る。当たり前の話。 そういう自己満足だけの身勝手な修正が一番たちが悪いんだよ >>292 なんでですか? まずきれいなコードのほうが、メンテナンス性が高くなり バグが減り、開発コストも下がります。 ここは、否定しませんよね? じゃあ、最終目標は「修正」するべきであってます。 あなたは、まったく筋違いの否定をしているのでは? >>293 そもそも前提が間違ってる。 きれいなコードって何だ?お前のオナニーだろ? コード修正したいなら、きちんと設計のレビューを受けてチームの了承得てからにしろ。 コードがスパゲティになってしまって、 簡単な機能追加ですら2週間もかかるようになってしまってた (しかも、テストを繰り返しても正しさに自身が持てなかった)のが、 3週間ほど時間をかけてリファクタリングした結果 簡単な機能追加なら1時間もかからず行えるようになりました 今どきスパゲティコードなど、そうそうお目にかかるもんじゃない リファクタリングするもしないも、そのソフトの特性や現場事情があんだから、 まずそういう情報がないとなんとも言えねーだろ。 共通して言えるのは独断で判断するなってことだよ。 >>296 ちゃんとリファクタリングするようになったからね リファクタリングする前のコードを保存しておいて リファクタリングしてテストに合格したら 前のコードを消去すれば安全だよ >>300 マトモなバージョン管理システムとBTSは導入済み前提でしょうよ でなきゃリファクタリングなんて無理 >>288 神が降りてきて、わぁぁぁぁぁってプログラム書く手が動くような事あるだろ? 最近ソフトウェアが壊れていくプロセスってのが わかりだしてきたよ。 いくつかパターンがあってね、名前でもつけて 近いうちに何処かで発表したいかなって思ってる。 たとえばモノマネパターン。 周りにあるコードを真似て書こうとするパターン。 このような関数があったとする。 function foo(name) { var funcTable = { func1: functioni() {・・・}, func2: functioni() {・・・}, func3: functioni() {・・・}, }; funcTable[name](); } それを真似してこんなコードを書く function bar() { var name = 'func1'; var funcTable = { func1: functioni() {・・・}, }; funcTable[name](); } もし0からコードを書かせたらこんなアホなコードを書くわけがないのに、 なぜか周りにあるコードを真似して書こうとする。 クソコード書いて、次は誰かがもっといいコード書くだろうからそれマネしようとか思ってたら 俺のクソがプロジェクト中にコピペされて救いようがなくなってたことならある >>305 それそれ、誰もが知ってるコピペパターンw できれば最初からクソコード書くなって話でもあるが、 それは仕方ない。誰でも成長するものなのだから=後の自分はもっと綺麗に書ける。 なのに、昔の初心者のコードを真似る奴が多い多い。 それやってると、初心者のコードをありがたがって参考にしてどうするの?w 話それたけど、本来はコピペするなら再利用できる形にリファクタリングして それを呼び出さないといけない。そしてこれは絶対にやるべきリファクタリングの一つ。 ただし、無関係な処理なのに形が似ている(しかしわずかに違う)のを 無理やり共通化して複雑化させるパターンもあるので注意。 そういう場合でもコードはなるべくシンプルになるようにしなくちゃいけないのだが、 モノマネパターンの通り、なぜか同じ形を真似ようとする。 できないわけじゃないのに真似をする。何も考えてないのかねって思う。 仕様書が別になってたらどんなに処理が似てても別にするなあ 似てる処理を共通化できないのは設計がきちんと出来てない証拠 仕樣的に別物とか関係ない いやあるよ。 だいたい仕様変更が入ったときって、仕様書の画面毎とかだかし、 テストも仕様書毎につくるから、共通化してもテストの工数あんま減らんし。 修正になった仕様書の枚数と、手をいれる工数が一致してるとすごく客に説明しやすい。 >似てる処理を共通化できないのは 断じて違う。「似てる処理」を共通化するんじゃない。部品を共通化するんだ。 このへん誤解してなんど泣いたことか。 おまえのその考え方はスパゲッティまっしぐら。 >>309 どんな考えでもいいけど何かしらの共通化がされてたら > 修正になった仕様書の枚数と、手をいれる工数が一致 これは成立しないぞ まず自分の矛盾に気付くのが先のようだ。 >>310 青いのう 部品を共通化するって考え方が徹底してれば、だいたいの場合は一致するもんだ。 もちろん客に説明するより少ない工数で済むならそれでいいよ? 問題は、「似てる処理」を共通化してると、工数が仕様書の改修量よりずっと膨らむことがあるってことなんだ。 ささいな修正が全体に影響してテストが膨らんだり、結局コピペで新たにクラス作らなくちゃいけなくなったりな うん、これも共通化してるなら何でも同じとか言われそうだな 現実のブツ無しだと説明が難しいが… >>311 説明が難しいのはお前が「部品」とかいうオレオレ言語使って自己満足してるからだ。 ワケの分からん独自理論開発するまえに基本をしっかり勉強しろ。 >>311 甘いのう 残念ながら今時の設計者の中にはコードを全く書けないやつが少なからず居る よって、共通化なんて幻想に過ぎぬわwww func1(){ a b c d } ↓ func0{ a b } func11(){ func0() c d } func12() func0() e f } 上のような共通化は似てる処理と部品どっちが主張しているんだ? >>312 独自理論じゃないよ!みんなそう言ってるよ! お前こそ本読んで知った気になってるだけだろ!頭でっかちめ 確かに、だいたい初心者向けの本には同じ処理を共通化すべしとか適当に書いてあるから、 実際の経験がないと理解しづらい部分ではある。 >>315 「部品」で意味してるのは何なんですか? >>316 ごめん。一般的じゃなかった。 「機能」って読み替えて。 人間は細胞でできているだろ プログラムも細胞で作れば上手くいく 俺の独自理論だけど 共通化するときの決まりの一つとして、 全く同じコードの時に共通化するのであって 似ているコードを共通化してはいけない。 似ているコードをむりゃリ共通化しようとすると、 引数で処理を分岐することになる。 aが渡されればAの処理を、 bが渡されればBの処理をみたいに。 引数で分岐しだすとアウトだな。 >>317 あーなるほど わざわざありがとうございます 経験的にforの内部、ifの内部は関数にまとめると都合よいことが多い そして気が付くと xxhelper, xximpl, xxsub といった関数であふれるw >>320 似ている理由を吟味するのがリファクタリングだろ。 似ている理由を吟味した結果、同じことをちょっと違った実装しているだけと気付けば問題なく共通化できる。 >>323 設計段階で、最初から同じものだと分かってるものでさえのちのち弊害出てくるのに。 後付けでコード眺めて似てるじゃんとか思っただけのもんがまともに共通化できるわけないだろうが 共有化するには物事を抽象化するセンスが問われるから、 低能が共有化しようとして失敗するのは良く分かるよ それに、言語によってはクロージャやメタプログラミングが無かったり 有っても扱い難かったりして、実現可能な抽象化が限られるケースもある クロージャwメタプログラミングw どんだけ狭い視点で話してんだよ それかなにか、お前は世界中で使われるライブラリの設計者かなにかか?w お前のコードとか会社に出たら即ゴミ箱行きだよww ただの帳票出力で得意げにtemplate使ってんじゃねえwwww後引き継ぐ奴の身になれ 死ね。くさかどああkjsdふぁj;fじゃ死ねええええ 自分の経験上、>>328 みたいにプログラミング言語の機能の話を 狭い視点とか言い出す奴って コードをロクに書けないSEモドキに多くて、 そういう奴に限ってリファクタリングにも否定的なんだよね コード読めないからリファクタリングの価値を実感出来ないのかな? 自分と同じドカタ仕事してる奴以外は 全て学生に見えてしまう様になったら病気です 自分の経験上、リファクタリングしたがる奴は例外なく低スキル。 アホSEがExcel仕様書の罫線を二重罫線に書き換えて 仕事したつもりになってるのに比べたら 比較にならないレベルの価値があるよ > リファクタリング 2重罫線を大事にする客だって多いわ。 客はコードの中じゃなくて、資料とか見るんだわ。 リファクタリングなんかしたらね、 なんかちょっと挙動変わってるんだけど? 障害じゃないけど勝手に変えちゃ駄目でしょ。 うん?次からは言います?いや、そもそも動いてるもん変えなくていいよ って話になる。 なんでもかんでもリファクタリングだのオブジェクト指向だの、 時と状況関係なしにやろうとするアホが多いんだよな。 工数改善の見通しが数字で説明できるならともかく 実感とかで勝手にリファクタされたらたまらんわw 受託開発やってるところと 自社サービスの開発やってるところは 何もかもが全然違うんだから、 分けて議論しないと平行線のまま 受託なんてドカタを人月で売って稼ぐビジネスモデルなんだから、 リファクタリングでコードを拡張しやすく保ち、 機能拡張を他社より速く行う事で競争優位に立つ とか、そういうのは関係ないじゃん? お前らマクドナルドのパートと大差無いんだから、 技術者の議論に入ってきちゃダメだよ >>340 ほー。 具体的にどういう課題があってどんなリファクタして、プロジェクトがどの程度成果上げたのか具体的に説明してみ? 壊れたレコードみたいに本で読んだこと繰り返して、しかも理解が浅くて現実が見えてないっぽいから 底辺派遣てすぐばれるよw >>341 現実つーかレスの意味が見えてないのはお前のほうだな 自社サービスで食っていけてるってだけで圧倒的な成果だろうな 労働集約型な受託開発なんて価格競争で擦り減るばかりで エンジニアに何のメリットもないし、早く脱出すべきなんだけど 脱出するためのスキルが溜まらない負のスパイラル SEが設計してコーダがコード書くってスタイルと リファクタリングは相性悪いだろうな SEの設計が日本語プログラミングになってるからな。 日本語と一対一のコードでないとめんどくさいことになる。 >>346 それで食えないスパゲティの一丁上がりかw リファクタリングは1にも2にも自分のためにやるものだ デスマーチを充実したアフターファイブに変えたければやっとけw >>346 その日本語プログラミングではBASICにも劣る 抽象化しか出来ないのが問題なんだよね リファクタリング否定派は技術力に乏しく低脳という風潮 一理ある どう考えてもすぐリファクタする方が低脳だろw リファクタしたがる奴の傾向として ・理解力の不足。 自分に理解できないものをすぐ諦めてクソ呼ばわりする。 他人の書いたコードの一貫したポリシーや目的を汲み取れないから、先人が用意してくれた便利なライブラリも使えない。 理解できないから規約も無視しがちで、彼の書いたところだけ作りがおかしい。 ・謙虚さの不足。 相手を見下して、自分のほうがいいものが作れると根拠なく信じてる。 すでに用意されているものを再発明するだけならまだいいが、 しばしば完成されたフレームワークの重要な部分にクソを差し込んでめちゃくちゃにする。 ・計画性の不足。 先の見通しが利かないから、行き当たりばったりでクソしか作れない。 リファクタも行き当たりばったりにやるから、クソが超臭うクソになるだけということになりがち。 挙句に自分で訳がわからなくなって、成果物を全部消したりする。 ・客観性の不足 自分のやったことの成果を、客観的に見ることが出来ない。 リファクタしたことで、掛けた工数がどれくらいでペイしたとか、数字で物事を考えられない。 彼がリファクタするのは、単に楽しいから。本人は仕事してる気になってるが、周囲から見ると遊んでるだけ。 という感じ。 そもそも最初からちゃんと書く能力があったら、リファクタしたいと思うことは少ないはず。 >>352 > ・理解力の不足。 > 自分に理解できないものをすぐ諦めてクソ呼ばわりする。 > 他人の書いたコードの一貫したポリシーや目的を汲み取れないから、先人が用意してくれた便利なライブラリも使えない。 > 理解できないから規約も無視しがちで、彼の書いたところだけ作りがおかしい。 > > ・謙虚さの不足。 > 相手を見下して、自分のほうがいいものが作れると根拠なく信じてる。 > すでに用意されているものを再発明するだけならまだいいが、 > しばしば完成されたフレームワークの重要な部分にクソを差し込んでめちゃくちゃにする。 とりあえず、最初の二つだけで良いから リファクタリングとの関係を論理的に説明してみ? >>353 他人の書いたコードを書き換えたがるんだよ… 自分に理解できないからクソだ。という理屈で。 クソに感じるのは自分の能力が足りないせいだということに気づかない。 そんな奴、実際には見た事無いが 受託開発だとレベル低いから居るのかもしれんね >>354 具体的にはどう書き換えられたの? 共通化できる処理を各所にバラバラに書き散らかしてたのを シンプルにまとめられた挙句 「DRYも理解出来ないアホが開発に関わるとか意味が分からない」 って言われたとか? コードオナニストは、常にコード以外の観点が欠けているのが特徴。 いくら諭しても話が噛み合わず、日夜コードのブラッシュアップに励んでいる。 >>356 知らん。問答無用で差し戻したから。 散々テストしたはずなのに客先に持ってったら動きが変わってて 共通モジュールに手が入ってたんで何やったのか聞いたら「わかりにくかったんでリファクタしました。」 何年も動いた実績あるモジュールにそんな理由でいじんなアホか死ね >「共通化できる処理を各所に(略」 うん。そうだな…だいたい君と同じぐらいの理解度の奴だったよ。 > 散々テストしたはずなのに客先に持ってったら動きが変わってて それリファクタリングになってないから リファクタリングじゃない話を使ってリファクタリング批判してどうすんだよ >>359 別にリファクタは批判してないよ? 考えもなしにリファクタしたがる奴を批判してるんだ。 >>360 お前んところがレベル低くて、勝手にコードぶっ壊す馬鹿が居るってだけの リファクタリングと関係ない話を一般論として語られても、 底辺は可哀想だなって感想しか持ち様が無いぞ >>359 お前はリファクタリングのつもりかもしれんが 完璧なテストが存在しない以上、挙動が変わる危険は常につきまとうんだよ。 完璧なテストとか言う以前に、 ろくに自動テストとか書いてないでしょ? ていうか、レビューもまともに機能してない (じゃなかったら>>358 のケースなんてコードがマージされるはずない) テストもマトモに書いてないじゃ、そりゃトラブルよ Excelで書かれたチェックリスト片手に手動でテストして 「散々テストしたのに」って言ってそう >>336 挙動を変えるのはリファクタリングじゃなくて仕様変更だろ 仕様変更でもバグ修正でもいいが、 コードを書き換えたら挙動が変わることがある。 つまり、機能追加もバグ修正もするなってことだ。 ネストが揃ってないとか空行が多いとか 変数がはるか上で宣言されてるけど使ってるのは遥か下に固まってるとか 理解力以前に目が疲れるコードをどうにかしろって言ってるんだよ 変数定義の位置を移動したりスペースを除去したり するのもリファクタリングなわけだが 失敗例をあげてリファクタリングは糞って言ってるの最高に滑稽。 井戸の王様を気取ってる蛙か リファクタリングが糞なんじゃないよ リファクタリングしたがる人が糞なんだよ >>371 ゴミみたいなコードばっか書いてっから 他人にリファクタリングされまくっちゃうんだろ 新人はリファクタしたがっていかん 関数の共通化とかGenericsとかTemplateとか覚えたてのこと使いたがる ちょっとしたクソが一晩したらそびえたつ巨大なクソに 技術レベルの低い人ってのは初心者に近くて リファクタリングという技術用語を理解できないんだよ。 だからわかり易い言葉に置き換えるといい リファクタリング=整理整頓・改善 こう言い換えれば、改善する必要があるんです。 整理整頓すると普段の仕事が捗るんです。ということになる こう言い換えれば、反対する人はいなくなるよ。 生理整頓した状態を維持しながら仕事しろよw 個人レベルの話ならクソコードをフィックス前にに最低限他人が読めるようにするのなんて責務のうちだ リファクタはどっちかというと組織再編といったほうがいい 課題と今後の見通しがあってはじめてやることで >>375 その責務を果たさない奴が、 行き当たりばったりのコード書くんだよな。 そいつに限ってリファクタリングの意味を理解してないという。 もう技術者として終わってるとしか言いようが無いね。 リファクタリング本を一回読んだとき何を感じるかだよな。 ああそうそう、こういう点で苦しくなってたんだ、って気付くか、 何一つピンとこずに何やってんのこの本?と思うか。 クソコードを普通のコードに直す作業をあんまりリファクタと呼びたくないw リリースした後でバージョンアップのついでにやるもんだろ ボーイスカウトの法則といって、 コードを修正するときは、修正する前よりも 綺麗にするもんです。 これが出来るのと出来ないのが、 初心者と中級者の境目。 もちろん、出来ないほうが初心者ね。 これが許されるのは新卒1年ぐらいなもん。 規模が小さいうちは手抜きで簡単なコードを書くだろ? 最初から拡張性とかそういうものを考えて作りこまない。 で、規模が大きくなってきた時に、将来性のことを 考慮して作り変えればいいんだが、 最初の手抜きのコードをそのままに、手抜きを真似して 同じようなコードを追加するやつどうにかならんかね。 規模に応じたコードの書き換えをしない。できない。 発想がない。そういうい奴がクソコードを量産するんだよ。 権限のない末端PGが現場の手続き無視してユニットテストのないコードを 勝手に修正する、自称リファクタリングは非常に迷惑。 日本の受託開発の仕事ではリファクタリングなんてするべきではない。 >>383 ユニットテストが無いことが前提になってる時点で、 やっぱり、その程度の所が、リファクタリングを嫌ってるんだなとしか 思えないよ。残念だったね。君のところの技術不足を露呈しただけ。 えと、技術力不足であることを自覚してね?落ち込むところだよ。 最初から厳密に書けばいいんだよ 手抜きコピーが多いのは、そういうものかと思ってしまうからだ 自称上級者がスタートアップ書くことが多いが、手抜き繰り返して しまいには自分自身が変な癖背負い込んでいくだろう 初期段階でよい方向に導くには、最初のやつががんばるしかない 人間誰しも、最初は初心者で 一年後には今よりも成長しているという 前提にたつと最初から完璧なコードを書くのは不可能 どんなに優れたコードを書いたとしても 一年後の自分はもっと優れたコードを書ける。 >>386 この程度の奴がリファクタしたがるんだよなあ… リファクタってのはある設計から別の設計に軸足を移すことだ。 書き散らしたクソコードを書き直すのは、リリース前にやっておくべきそれ以前の問題なんだよ。 お前の末端の画面とか帳票とかは、誰も共通機能として使ってないから汚かろうがクソだろうが問題ないよ。 お前の自己満足のためにプロジェクトとめられてたまるか。 どんなクソでも、客の前にひりだしたクソはてめえのクソだ。受け入れて前に進め。 大体最初からある程度ちゃんとしたプログラムも書けないやつに まともなユニットテスト作れるわけないだろうが。 関数の中身やprivateな関数のインターフェースを修正するようなリファクタリングと、 ライブラリのpublicなインターフェースを変更するような 影響範囲の大きいリファクタリングの話が混じってる気がする 後者はそう簡単じゃないよ 影響範囲に入る全ての開発者と調整が付かない限り変更できない (勝手に変更したら、ライブラリ使用者側から見たら仕様変更だからリファクタリングにならない) 初心者にオススメなのは、派生開発でコードを読むときに、動作確認をテストで書くことかな。これはとっつきやすい。 『レガシーコード改善ガイド』では「仕様化テスト」のところ。 リファクタリングするなっていってる奴がいるけどさ、 時間が十分にあるという前提にたつと とたんに何も言えなくなってしまう それってリファクタリングがダメなのではなくて 時間がないという問題だから。 じゃあ、なんで時間が足りないんですか? 今までと同じやり方してるんじゃないですか?って 追い詰めると、泣き出しちゃうw >>390 そういう場合は、旧関数の互換性を保ちながら 新しい関数を作ればいいんだよ。 >>390 そういうことのないように依存性を無くすようにプログラミングする プログラマの規律が無いだけ 当たり前のことを当たり前に理解してそれを前提としている人と、 当たり前のことなのに全く理解しないでそれを前提とできない人とが会話しているようだ。 ウォーターフォールだったり、詳細設計書で日本語プログラミングしたりしてるとこと リファクタリングは相性悪いよ 開発の全体を見直さないと、一部だけ優れた手法を取り入れようとしても 歪みが出て上手く行かないんだよね うまくいかないんじゃなくて 難しいだけだろ? それを実行する力が技術力なわけで。 どうしても自分が書いたコードを書きなおしたい人がいるようだけど そんなコードはいずれバグで書きなおされるんだから、あまり気にしない方が良い。 その情熱は悪くないけど、もっと前向きに使うべきだよ。 前向きって新しいコードを書くってこと? 残念だけど、開発ってのは既存のコードの修正がほとんどだよ。 新しい機能を追加するといっても 前よりも効率よく開発するために既存の部分を、 使いまわす(コピペじゃないからね!)するために 既存の部分を修正して使えるようにするんだから。 >>397 みたいな事言ってると、拡張を繰り返すうちにコードが保守不能なカオスになって もう無理だから全部捨てて作り直しだー、ってなるんだよ でもSIerとしては、それが飯の種だから良いんだけどね 全部捨てて作り直しだーまで追い詰めるって馬鹿だと思う。 少しずつ変化させていくことができないからそうなるんだよね。 全部いっぺんに変えるなんて現実的じゃないんだから。 全部いっぺんに変えることは不可能。じゃあどうするか? それに答えられないから、どんどん壊れていくんだよ。 まあ、少しづつ良くしていくことが出来るのも技術力なわけで。 それを頭でわかっているのと実行するのとは全然違うわけで、 その実行できる力ってのが技術力そのものなわけで。 >>400 前向きってのは、コード書きの脳からデザイナーの脳に変われるように努力しろって事。 >>403 何に逃げてるのさ? 両方できるようになるというのなら正しい意見だが、 別のものに逃げたらだめだろ。 まるでペンもイラレもろくに使えない奴が 発想力とかいうのに逃げているのと同じ。 コードをまともに書けるようになった上でデザイナーになることはできる。 だけど、コードから逃げてもデザイナーにはなれない。 よくある設計とコーディングっていう役割分担からしてくるっとる。 プログラミングなんて、設計九割五分なのに。 実装なんざオマケのオマケ。 SEとプログラマ、とわけてプログラマがキーボード叩く役とか、きがくるっとる。 まぁ聡明なお前らの会社は違うだろうけどね。 「前向き」って言ってる奴が、 コードとデザインの両方を手に入れるじゃなくて、 コードから逃げてデザインを求めていて笑えるよ。 そういう奴は両方できない。 もう最近ガチガチの詳細設計やるとこって殆ど無いだろ コメント的仮想コードとかで詳細は終わらせちゃうところが多い その方が柔軟だしな 一応UMLでシーケンス図とクラスとPublicメソッドだけはきっちり作ってるな DBアクセスとかあたりまで そっから先はprivateで実装して アプリのフレームワークに依存しないメソッドとかクラスとかはプCommonフォルダに各自放り込んでもらう で上手くいくと思ったけど Commonがかなりカオスなことに >>409 >Commonがかなりカオスなことに kwsk >>411 コードが酷いのは予想のうちだけど あれだけ言ったのに、規約が守られずにアプリのフレームワークに依存が作られてる 最初あたりに誰かがやったせいで後続が真似して、手続きなんとなくまとめただけみたいな処理がいっぱい 関数の共通化もうまくいってなくて 例えば分かりやすいところでは文字列をバイト列に変換してパディングするって処理があるんだけど SJisStringUtil.ToByte DBCodeChanger.LeftPaddingByteArray StringModel.BytesWithSpace こんな感じでいっぱいできてる 挙句にsTanakaとかフォルダできてるしw まあありがちやねw だから規約を作った人は 必ずコードレビューをしなくてはいけない。 >>953 糞設計、糞コード書くような人たちが 集まってコードレビューしてもなんの意味もない しかもそういう人って声が大きいだけが取り柄みたいな人だろうし A社に発注して作らせた大規模なソフトを、 B社に一時的にメンテナンスさせて、 今はC社に機能拡張させているとか言う例が実際にあるからなー それぞれがそレなりにちゃんとした会社であっても、 開発者の継続性が0の場合、 中のソースがかなり混乱するのは仕方ないかもしれん。 リファクタリングはアートですよ。 アートは人間が生み出すものではありません。 ある日、天から降りてくるんです。 この感覚がわからない人は、アートしたことが無いんです。 つまり、リファクタリングもわからないってことです。 わかる、わかるぜ〜 ソースコードがある書き方になりたがってねだってくるんだぜ〜 俺はそのとおりに書き写してるだけなんだぜ〜 やべえ。 適当ぶっこいてたらマジキチ召喚しちまった。 ちょっと反省。 他人のコードだと思って、何の前情報もない状態でコードを読み そこから読み取れる情報だけで、「なんで?」って思う実装を減らしていくのがリファクタリング もちろん、処理の効率とかをよくする場合もあるけど、 どっちかというと、そういうのよりも第三者が見て読みやすいコードである状態を保つ事のほうが重要 (リファクタリングで大幅に処理コストが改善できるような糞実装が最初にされてることは稀) ただ、リファクタリングをできるレベルに達していない職場も少なくない とくに業務系や人売りで奴隷を集めた職場とかは、大抵メンバーのスキルが足りてなさすぎて無理 っていうか設計(という名のゴミファイル作成)段階からそびえ立つうんこを作っていってるから、実装時は既に手遅れ リファクタリングの誤用 ttp://capsctrl.que.jp/kdmsnr/wiki/bliki/?RefactoringMalapropism リファクタリングの境界線 ttp://capsctrl.que.jp/kdmsnr/wiki/bliki/?RefactoringBoundary ちんこの振る舞いを保持したまま変化させる、もちろん性的な意味で。 インタフェースの変更はリファクタリングか http://capsctrl.que.jp/kdmsnr/wiki/bliki/?IsChangingInterfacesRefactoring > 答えは簡単――インタフェースの変更はリファクタリングだ。 未知のバグフィックスはリファクタリングか? http://capsctrl.que.jp/kdmsnr/wiki/bliki/?IsFixingAnUnknownBugRefactoring > 私はリファクタリングと呼べると思う。 バグを含んだ振る舞いを知らなかった(あるいは気にしなかった)わけだから、 > これは「外部から見たときの振る舞い」ではないのだ。 たとえバグに気付いていたとしても、 > それが気にするようなバグでなければ、 リファクタリングと呼んでもよいと思う。 最適化はリファクタリングか? http://capsctrl.que.jp/kdmsnr/wiki/bliki/?IsOptimizationRefactoring > 最適化とリファクタリングはどちらも変化を伴うものだが(なかには最適化かつリファクタリングとなる変化もあるが)、 > 両者は別物だと私は考えている。なぜなら、両者の目的が異なるからである。リファクタリングは、 > コードを理解しやすくするためである。最適化は、プログラムを速くするためである。 > つまり、リファクタリングと最適化は似ており、共通する変更がありはするものの、目的が異なるため、両者は別物であると私は考えている。 宣言の順序変更はリファクタリングか? http://capsctrl.que.jp/kdmsnr/wiki/bliki/?IsDeclarationOrderingRefactoring > 宣言(Javaで言うメソッドやフィールド)の順序を変更することは、リファクタリングと呼べるのか? > リファクタリングの定義で、 「理解や修正が簡単になるように」というフレーズを使った。 > 宣言部分を変更すると、理解や修正が簡単になるのだろうか? 私は、そういう場合もあると思う。 > ソフトウェアの内部構造を変更しないという点が紛らわしいかもしれない。 リネームしても実行内容は変化しない。 > だがリネームは、プログラムの理解度を向上させる 非常に重要なリファクタリングの一種である。 あれもこれも取り入れた「オブジェクト指向」とまるっきり同じパターンだな どんどん曖昧な意味になりそう すべてリファクタリングの結果発生する作業だろ。 まったく理解できていないな。まさに本末転倒 OpenSSLがリファクタリングされまくっているな >>429 違う > リファクタリング中に2,3日システムが動かなくなっちゃってーなどと言ってる奴がいたら、 > んなもんリファクタリングじゃあなーいと言ってやれ。 ドキュメントをリファクタリングしちゃるとか言ってる奴、 > それもリファクタリングじゃねーぞコラ。 そういうのは、リストラクチャリング(再構築)というのだッ 客の要件はそのままプログラムにできるけど、 それじゃあ最適化できてないから 外面の挙動は変わらない範囲で最適化を行う。 コードの実体だけがリファクタリングの対象じゃないだろ。 >>433 それこそがリファクタリングの誤用で リファクタリングではないと述べられていること。 最適化じゃないんだよ 最適化なんかできるわけねーだろってのが大前提なんだよ バグも含めて機能そのままで、構造だけ変える(良くするつもり)ができるっていうのが結構単純な 還元主義的な思い込みで、実際の構造物は両者は一体というか、都合良くできないと思うんだよね。 テスト駆動とかもそうだけど、この種のスローガンが胡散臭いのは、物作りの本質的な困難を直視 しないで、小手先の技法を当てはめれば解決みたいに喧伝しすぎるところにあるんじゃないかと思う。 別に胡散臭いとは思わないが、真に受けちゃったバカが「リファクタリング最強!」とか言い出すのはかなりうざい。 >>436 > バグも含めて機能そのままで、構造だけ変える(良くするつもり)ができるっていうのが結構単純な > 還元主義的な思い込みで、 できるよ。 というか、リファクタリングは構造を良くしましょう(終わり)じゃなくて、 構造を良くするのは当然の話しとして、機能をそのままにするためにはどうすればいいか? って所が出発点で、 機能をそのままにするために、編み出された様々なテクニックが リファクタリング手法なんだよ。 できないというのなら、リファクタリング手法(それには名前が付いている) 一つ一つに対して出来ない根拠を述べてみてよ。 君は単に、リファクタリングに手法があることを知らないで、 闇雲に自己流でなおそうとしてみて失敗しただけでしょう? なんだ、自分で自白してるじゃんかw > この種のスローガン スローガンとしか認識していないw リファクタリングは、数学的な証明と なんらかわらないんだが。 ダメなコードは直すことでよくできる という公理が大前提 1000行もあるようなおバカ関数を数学的に定式化して改善するのは無意味なこと 見れば何をすべきかわかる >>440 つまりどういうこと? リファクタリングすればいいって話を 言葉を変えていってるだけだよね? リファクタリングを知らない人は、 リファクタリングを一気に直してしまおうと 思っているに違いない。 リファクタリングが問題が起きることがありえない 小さな修正の繰り返しであることをしらない。 デザパタ信者みたいなのが暴走して悪評を広めてるんだろう その悪評を鵜呑みにしているのが 頭悪いと言われる所以なわけで。 自分の頭で考えろよとw 流石に数学の定理と同等か言い過ぎだろ。 パターンと同じでさ、セオリーやメソッドじゃない、ちょっとしたコツの集積だろ オブジェクト指向、CMMI、PMBOKとかと同じでさ、アメリカ人の教授とかはそういうのまとめて 自分が言い出しっぺになって、学会ごっこしたり、資格試験の元締めやろうとしたりするのが好きなんだよ。 そういう商売に乗せられているだけなのに、さも学術的な根拠があるものとして「勉強」したりするのが 偉いと思っている奴はどっかオツムが弱いとしか言いようがないw >>446 数学の定理じゃなくて、数学の証明だろ? a + b = c を b = c - a に置き換えるようなもの。 式の変形だよ。 リファクタリングのテクニックっていうのはどれも この式の変形と同じようなもの。 一部の人が勘違いしているように、ぶっ壊して同じように作りなおすことじゃなくて、 項の移動のように、全く同じ結果になる変形をしているにすぎないんだよ。 >>446 あと警告として、自分が知らないことを 勉強している奴は生意気だっていうのやめたほうがいいよ。 中学生かよ。あいつ勉強なんかしてるんだぜーってw いや、普通に恥ずかしいでしょ? ガリ勉ガリ勉いって勉強しない悪ガキ。 自分が後で困るというのに。 警告してあげないといつまでたっても 気づかないよ。 ぶっ壊して同じ結果が得られるように作り直すこととの違いを教えてください。 イチから作り直したい病と 現実の範囲で出来る事だけやる工夫の違い 機能やクラスを抽出するのだって破壊を伴うんじゃないの。 リスクが少ない範囲での変更もあれば、 時には大胆なリファクタリングもあると思うけど。 >>451 > ぶっ壊して同じ結果が得られるように作り直すこととの違いを教えてください。 たとえば数学で、3x - 11 = 4 のxを求めるという問題があった時 1. 移項とい手法を使って、3x = 4 + 11 にして、 2. 足し算という手法を使って、3x = 15 にして 3. 両辺を同じ数で割るという手法を使って、x = 5 という風に、変形をしても等しいと証明されている 安全な手法を使ってシンプルな形に変形していくのがリファクタリング >>453 大胆なリファクタリングって何よ? まずさ、数学の式の変形のやり方と一緒で、 リファクタリング手法には名前があるって知ってる? 一覧見つけてきたから、これのどれが大胆で破壊を伴うのかちゃんと説明してくれ。 http://d.hatena.ne.jp/asakichy/20100607/1275877997 >>453 が言ってる、 大胆なリファクタリングというのは、 これらの手法を使わずに いきなり最終的な答えを だそうとしていることでしょ? それはリファクタリングじゃない。 >>452 も少し勘違いしているね。 リファクタリングを「ソースコードを綺麗にしましょう」ということを 英語で言ったものとしか認識していないようだ。 リファクタリングというのは、安全に変形できるという 手法を使って、いっぽずつ書き換えていくもの。 手法を使わない書き換えはリファクタリングじゃない。 >>456 それな その手法の確立というか その手法の念押しというか そういう面も大きい リファクタリングの「関数の抽出」をやったら 増えた関数呼び出し分の実行コストが無視出来なくて 仕様を満たさなくなってしまいました >>459 そしたら「関数のインライン化」という リファクタリングをすれば 動作を変えることなく、仕様を満たせるようになるよ。 やっぱり問題が起きた時にやるのは リファクタリングだね(笑) つまり途中で一回ぶっ壊して同じ結果が得られるように作り直すわけね 良いと思うよ リファクタリングがゲシュタルト崩壊しそうなスレだ。 >>461 一回ぶっ壊したらだめだろw それではリファクタリングになっていない。 リファクタリングは壊さずに直すことであり 壊さないで直すための手法がまとめられている。 http://d.hatena.ne.jp/asakichy/20100607/1275877997 >>464 >>459 の操作で一回ぶっ壊れてるじゃん 少なくとも「関数の抽出」はリファクタリングの操作としてアトミックじゃない 慌てずリファクタリングの公式に沿って変更すれば副作用は一切ない。 >>465 > 少なくとも「関数の抽出」はリファクタリングの操作としてアトミックじゃない アトミックだけど? リファクタリング本を見ればしっかり書いてあるよ。 アトミックに作業する方法。 どうせあんたは関数を消して書きなおす(書き直してる間 元の関数がなくなってる状態)が起きるって思ってるんだろうけど。 ほんと、やり方をしらんのね。しらんから壊れるって言ってる。 わかりやすい。 ちなみに、リファクタリングブラウザを使えばもっと簡単に行える。 もちろん、リファクタリング本にはそういうツールを使わないやり方も書いてある。 >>467 手で書き直したとかじゃなくて、メソッドの抽出することで 仕様を満たさなくなるケースもあるって話だろう その直後にインライン化したとしても、一旦仕様を満たさない状態になったのは事実 まあ俺ぐらいリファクタリングに精通すると、最初からリファクタリング後の最終形になるように最初からコーディングできちゃうわけで、あえてリファクタリングを意識しなくていいわけなんだけどね。 中島敦の「名人伝」にでてくる「弓ってなに?」といった弓の名手のごとし。 >>469 壊れてないよw ばかなのかな? 人の話きかないよね。 >>470 > 手で書き直したとかじゃなくて、メソッドの抽出することで > 仕様を満たさなくなるケースもあるって話だろう メソッドの抽出で仕様を満たさなくなることはありません。 > その直後にインライン化したとしても、一旦仕様を満たさない状態になったのは事実 あんたの言ってる「仕様」って関数呼び出し○ナノ秒以内で あることっていう要件の話だよね?w それは仕様ではない。 >>471 それは過剰な設計になってるよ。 コードの規模に応じて、適切な設計というのは異なる。 コードに修正が入る、それがバグの修正でない限り 機能化拡張だろう。 機能拡張にともなって規模が増るというような時にリファクタリングをするんだ。 機能追加とリファクタリングはわけてやるものだから、 機能追加前、もしくは機能追加後にリファクタリングね。 最初から過剰な拡張性をもたせるのはよくない。 今更ながら>>1 が言っていたことって正しいんだなって思った。 ソースコードを綺麗に作りなおすのがリファクタリングだって 思っている奴が多いこと多いこと。 >>473 > あんたの言ってる「仕様」って関数呼び出し○ナノ秒以内で > あることっていう要件の話だよね?w > それは仕様ではない。 ループの中で繰り返し呼び出されたら馬鹿にならん差になることもある 仕様かどうかはケースバイケースだアホ リファクタリングの「関数のインライン化」をやったら 生成されるプログラムのバイナリサイズが許容範囲を超えて 仕様を満たさなくなってしまいました ID:kUSteVkT必死すぎだなw ”要件” を満たせないなら、 同じ仕様のまま 要件を満たすように リファクタリングすればいいだろうw ID:kUSteVkTアは書いたコードが要件を満たせなかったら そのコードを捨てて一から作り直んだろうかw 一日中スレに張り付いてる ID:9UWhhSIJ に必死過ぎと言われてもな… で、リファクタリングの手法に則って変換しても 要件を満たせないケースがあると認めるのか? やっと要件といったねw リファクタリングは仕様を変えずに コードをわかりやすい形に修正するものだから 要件を満たさなく慣れば、満たすように リファクタリングすればいいってことで終わる話だ。 なんせリファクタリングしても仕様は変わらないのだから 仕様を変えずに要件を満たせるように作り変えられる。 >>482 いや、俺は最後に修正をコミットするときに仕様を満たしてれば 途中で壊れてようがリファクタリングとしてOKって立場だから、それで良いよ でも、お前はリファクタリングの手法に則ってれば 絶対に壊れることは無いっていう立場だろ?(>>454-456 ) 絶対に壊れない奥義は秘中の秘で 師匠に皆伝を認められないと伝授してもらえないんだよ リファクタリングってどのタイミングでやる事を想定してるのかな プロジェクトにそんな工程存在しないし 終わって凍結したコードを後から修正なんてしないでしょ 不具合とか新機能とか更改する案件が出てきて初めて 次のプロジェクトやりましょうってなるわけでしょ そうなったとしてコードの機能追加や修正はあっても このスレで言う仕様通りに動くものにわざわざ手をつけるなんてことするかな やりたい時がやるべき時なんだよ。 コードがクソだと思ったら何時でもそれがリファクタリングのタイミング。 だからそんなタイミングなんて実際存在しないよねって話をしてるのに >>487 だからコードがクソだと思わなかったらやる必要ないんだって >>483 > いや、俺は最後に修正をコミットするときに仕様を満たしてれば > 途中で壊れてようがリファクタリングとしてOKって立場だから、それで良いよ リファクタリングの誤用 http://capsctrl.que.jp/kdmsnr/wiki/bliki/?RefactoringMalapropism > ……のだが、リファクタリングは、適切に使われてはいない。 > リファクタリング中に2,3日システムが動かなくなっちゃってーなどと言ってる奴がいたら、 > んなもんリファクタリングじゃあなーいと言ってやれ。 ドキュメントをリファクタリング > しちゃるとか言ってる奴、 それもリファクタリングじゃねーぞコラ。 そういうのは、リストラクチャリング(再構築)というのだッ。 > リファクタリングはより具体的な技術のことで、 小さな「振る舞いを保持したままの変化」 > (リファクタリングと呼ばれている)から成り立っている。 システムをリファクタリングするときは、 > 数分以上、システムが壊れたままにしてはいけない。 >>486 >やりたい時がやるべき時なんだよ。 趣味だよなこういうのは 死ぬまでいじってろ >>490 趣味とは、汚くても動けばいい。と 客の前で言えないことを、こっそりやること。 >>489 コミットするまでシステムはそのままなんだから(正確にはデプロイするまでだが) 完全にリファクタリングの定義に沿ってるよね 誤用してるのはお前だね IDEのリファクタリングのメニューから選べる機械的にできる変換のみを リファクタリングとする派閥があるんだよ 要件を満たすかではなく、機械的にできる事が重要なわけ なお、これは底辺の馬鹿でも可能な「ドカタ・スタイル」として認知されてる >>446 >オブジェクト指向、CMMI、PMBOKとかと同じでさ、アメリカ人の教授とかはそういうのまとめて >自分が言い出しっぺになって、学会ごっこしたり、資格試験の元締めやろうとしたりするのが好きなんだよ。 リファクタリングって、資格試験制度や学会作ろうって動きがあるのかな? パターンはなんかやってるところあるよね。 >>493 > IDEのリファクタリングのメニューから選べる機械的にできる変換のみを > リファクタリングとする派閥があるんだよ それは、リファクタリングをわかってない派閥であり、 無知なリファクタリング反対派となんらかわらないよ。 リファクタリング本を読んでいれば、 リファクタリングブラウザで行えるのは リファクタリングのほんの一部だって知ってる。 リファクタリング前と後で同じテストが通ればOK派と、 リファクタリング中のどの時点でもテストが通らないとダメ派か。 >>1 リファクタリング自体が理想論。 つまりは、自分(以下A)と同等かそれ以上の腕の持ち主だけで人材が構成されている必要がある。ただし、これは自分視点。 しかし、この状態だと、A以上の腕の持ち主からAを見ると、Aは足手まといで汚いソースを作り上げる元凶。 上級者が、切磋琢磨していく状態なら良いが、上級者なんて1%もいない。99%の下手が次々と入ってきてクズソースを乱発。 腕の良い者達は、クズソースのリファクタ作業だけをやるハメに。 腕の良い者達だけでやっていれば、もっと早く開発ができるのに。しかしリファクタリングというとできるのは腕の良いものだけ。 よってクズの尻拭いを永久にやらされる上級者は、腐る。 そしておしまい。 リファクタ云々よりクズの徹底排除こそ最優先。 それがなされなければ、確実にクズソースの生成のほうが圧倒的に早い。 3行で言うと 1%の有能な人間のリファクタリングの速度より 99%を占めるクズが作り出すクズソース量産スピードのほうが速い だから、間に合わない。 ということだね。 隠された4行目は そして、1%の有能な人間はここにはいない。 か? >>500 何が理想論なのかと思えば、 あんたの会社では無理って話なんだね。 また俺の会社すげえ自慢か ITドカタのクセに生意気だ なんで力量がはっきりしてない人のソースレビューもせずに、 終わってからリファクタリングしてるの。クズじゃないの。 自分のコード書くだけが仕事じゃねーんだぞ。 リファクタリングが工程になのであればら、彼の知っている開発手法はそもそもTDDに向いてないので、その前提でTDDの話なんてできないと思うのです 世の中にはCIって概念があるのを知らないのだろうか まぁ土方なら仕方ないと思いますが リバースエンジニアリングが難しいのと同じで、 自分でソースを書くよりも、 他人が書いたソースを読むのは、ずっと難しい 仕様書→ソースは、簡単 ソース→仕様書は、難しい >>504 > また俺の会社すげえ自慢か 俺の会社だせえ自慢じゃね?w >>508 > 他人が書いたソースを読むのは、ずっと難しい 最近これ違うと思うようになってきた。 他人が書いたソースが読みにくいと思ったら そのソースは他人が読むように書かれていない 自分よがりなソースコードなんだよ。 読む方に非があるんじゃなくて、書くほうが悪い 自分よがりなんて書いてる奴は、他人に読みやすい文章になるような注意力に欠けた 独りよがりの文章しか書けないんだろうな。 >>511 > 独りよがりの文章しか書けないんだろうな。 独りよがりって、自分よがりと同じ意味じゃね? うむ http://www.weblio.jp/content/%E8%87%AA%E5%88%86%E3%82%88%E3%81%8C%E3%82%8A 自分よがり 読み方:じぶんよがり 別表記:自分善がり ひとりよがり(独り善がり)に同じ。周囲を顧慮せずに自分の都合や損得のみで物事を考えること。 >>516 自作自演しなくていいよ。 そんなコメント普通しないからw 要求仕様の変更に追随するために設計を変えていくのがリファクタだ 撒き散らしたクソコード直すのはリファクタとは言わん テストの前に個々人レベルでやる仕事だ 他人が作ったものをメンテする時は まず他人にやらせろってこと? つーかリファクタリングとか言いにくいから修正でいいじゃん リファクタリングを定義しようぜ とりあえずQA形式にして質問と回答は最近の書き込みから適当に埋めた <<リファクタリングとは>> Q 何時やるの? A やりたい時。糞コードを見つけたら。今でしょ Q 具体的には(工程では)いつ? A 回答なし Q やる必要あるの? A 回答なし Q 誰がやるの?A 自称上級者 Q 上級者の定義は?A 回答なし Q その上級者には何かメリットが?A 回答なし Q リファクタリングってお金もらえるの?A ボランティア Q どういう効果が期待できるの? A 将来的なリスクを回避する、または逆にリスクを抱える >>500 に対して>>503 の返しするということは、>>500 の話が論が正しいことを>>503 が認めているということ。 つまるところ、会社の構成員の実力によって不可能になるということ。 をあんたの会社では〜。の一文で認めている。 ゆえにその切り返しをするなら、リファクタリングは議論する価値がないということ 誰でもできることでないなら、実現は夢物語ということだ 工程を確保して 下がやりたいと言ったら邪魔するなというだけの話かもしれない >>524 行き詰まるところ先人達が考えて考えた結果 新言語の開発 にしか答えがないんだよなww どんな素人でも言語のルールには逆らえない。つまり従わざるを得ない。 理論だけで劇的な変化があったのなんて GOTOレス だけだろ。 わかりやすくステップ数で言うけどjavaで10ステップで組まれていてごちゃごちゃなプログラムがある。 仕様変更するのに1万ステップの変更が必要。これを、新言語おまんこ女学院言語で開発すると、 main() おまんちょ() って書くだけで同じ機能が実現され、 仕様変更には use ここか?ここがええんか? main おまんちょ(伝説の第49手目(3箇所、同時、左手だけちょうどいい微速)) って直せば実現できる言語が生まれれば、これ以上の可読性の向上はないわけで。 馬鹿でも簡単に、馬鹿でも可読性が高く、馬鹿でもスピーディーに・・・・を求めて新言語というのは生まれている >javaで10ステップ を >javaで10万ステップ に訂正 >>485 パッケージ製品のメジャーバージョンアップとか? 一般的なIT土方の工事現場にはまず縁ないわな リファクタリングしない人は 修正する時、テストしないの? テストするならリファクタリングしても 問題ないよね。 全部埋めてやったぞ <<リファクタリングとは>> Q 何時やるの? A やりたい時。糞コードを見つけたら。今でしょ Q 具体的には(工程では)いつ? A アジャイルですから。工程て何? Q やる必要あるの? A やらなきゃバグでるよ?いつか破綻するよ? Q 誰がやるの?A 自称上級者 Q 上級者の定義は?A 糞コードを発見する嗅覚を持つこと Q その上級者には何かメリットが?A コードが綺麗な方が気持ちいいだろ Q リファクタリングってお金もらえるの?A ボランティア Q どういう効果が期待できるの? A 将来的なリスクを回避する、または逆にリスクを抱える <<リファクタリングとは>> Q 何時やるの? A テスト駆動開発においては、テスト記述→コードを書く→リファクタリング の順番で開発する Q 具体的には(工程では)いつ? A コードを書いた直後。工程で言えば開発工程 Q やる必要あるの? A 義務だろうね。小説で言えば清書する必要あるの?ぐらいのレベル。 Q 誰がやるの?A 客観的指標(McCab等)で差があるコードを見比べて、優れている方を言えるレベルの人全員 Q 上級者の定義は?A 客観的指標(McCab等)で計測して良いとされるコードを書ける人 Q その上級者には何かメリットが?A 上級者であっても、可読性やメンテナンス性が高いコードの方が早く機能追加・修正・不具合対応ができる。 Q リファクタリングってお金もらえるの?A 開発の一部であり、清書みたいなものなので当然お金はもらえる。 Q どういう効果が期待できるの? A 期待ではなく事実としてメリットがある。メリットは二つ上に書いたとおり。 >>534 たとえばさ、誤字脱字、これはあっても読めれば別に問題ないんだよ。 でも見つけたら直すだろう? そうやって誤字脱字の見直し、修正が例え1時間で終わったとしても 業務である以上、それは給料に変わるんだよ。 問題ないのに直すのは明らかに無駄な労力だろ リファクタリングてそういう事なのか? >>531 そもそもテストは各工程に含まれてるよね? 一度コードに手を付けたらリファクタリングだろうが何だろうがテストはやり直しだよ 工程をこなしてる間つまりリリースし終わって暇にでもならないと リファクタリングなんか入り込む余地なんて無いぞ 要するに無駄ってことじゃないの >>536 「ソースコードを読むのに時間が掛かる」は 一番重要な問題だよ。 それが開発工数の大半を占めているんだから まあ理論的に完璧なリファクタリング手法を使っても 無関係であるはずの部分でコンパイラやOSのバグを踏んだらそれまでだから 実テストにやたら工数のかかってたらその後はさわれないだろうね テストやりました。バグが見つかりました。 ソースコードが汚くて、コードの意味がわかりません。 ソースコードが汚くて、バグの原因がわかりません。 あちこちにコピペされてて、バグの修正が大変です。 バグを修正したら、別のバグが発生しました。 バグを修正しましたが、処理が複数のモジュールに 分散していたので多くの再テストが必要です。 こういうのを解決するのがリファクタリング。 違うね。 > テストやりました。バグが見つかりました。 > (以下略) それはデバッグや。 >>542 いや、それは前置きだから。 リファクタリングが解決するのは、 デバッグまでの過程で発生する問題。 同じデバッグという目的であっても、 その目的を達成するまでの時間は違うんだよ。 開発段階ですでにスケジュールオーバーしてる現場だらけなのに机上の空論w 新言語開発しろw >>544 意味がわからないレベルの人っているんだよねw リファクタリングすら必要ないほどの腕のいい奴を最初から揃えれば良くね? というのと同じくらいリファクタリング理論は破綻してる 他人のソースコードの解読は新規作成より時間がかかるケースが多々。 仕様がわかってるなら、そんなチェックをお願いしないといけない奴のソースレビューをするより、最初から自分でやったほうが早いし確実 つまり、リファクタリングの行き着く先は、無脳者を開発に入れなければ良いに行き着く。 少数精鋭方式。 >>548-549 一理あるが理想論 だから現実解としてリファクタリングが出てきたんじゃないのか? 仕様変更っていうのは避けられないものだし、 機能追加や新しく出来た○○に対応するとか どうしても変化は避けられないわけで その変化にたいしてコードも変化させていかないといけないんだよ。 それにさ、人っていうのは成長するのは当たり前なのだから、 一年前の自分より、もっと優れたものを書けるようになっているはず。 一年後はさらに優れたものを書けるようになるはずだが、 それは今をきちんとやっていてできること。 過去の自分の真似ばかりしていても、成長はできないよ。 >>552 言い返したいことがあるのなら なにか言い返していいんだぜ >>550 でもgotoレスと違って誰も実践しないだろ? そういうことだ。 誰が好き好んで人の尻拭いをやるというのだ リファクタリングは有能が無能の尻を拭く作業ではなく自分の尻を拭く作業だ 最初は速度など無視してとりあえず動くように作る 動いたら次に速く動くようにする 速く動いたらそれを読みやすく整える 読みやすくなったら今度は新機能を楽々追加する これで立派なリファクタリングだ >>556 ボトルネックが出来て、そこを解決すれば全体に速度が上がるようなものなら 後からでもどうにかなるが、全体的に微妙に遅い、微妙にリソース食っている、 それで全体的に遅くなってるだと後からじゃどうにもならない。 >>555 実際誰もやっていない それが、この理論の決定的な答え 誰もやらない=やって評価されるどころか、失敗した場合の責任を問われるだけ メリット一切無い >>555 そもそも、そんなものはリファクタリングではない リファクタリングは「現時点『運用中』の動いているシステムプログラム」に勝手に手を加えること。 「まがいなりにも動いているシステムのプログラムを勝手にいじるな」 というのが世界の常識。でこの常識を変えようとした思想がリファクタリング。 ただ、結局は、誰もやらんってこと。 理由の大半は「仕様がわからん」ということ。 エクストリームプログラミングから全否定かよ。 カオスだな。 バグを仕込んでしまう可能性があるのが致命的 あとは評価制度の問題だな 長期的に絶対メリットはあるんだがそんなん誰も見ちゃいねえし 他人の尻を拭くハメになったとき、リファクタリングが可能である唯一の条件は、 引継ぎ時点でリファクタリングされているソースコードであること、だ そうでなかったらご愁傷様あきらめた方がいい >>559 > リファクタリングは「現時点『運用中』の動いているシステムプログラム」に勝手に手を加えること。 なんでウソつくの? 本当と言い返せるものなら言い返していいんだぜ?w ただし、そんなことをしたら、ソースを要求するので 準備しておくこと。 恐怖駆動開発だな。 http://www.hanselman.com/blog/FearDrivenDevelopmentFDD.aspx レガシーコードでテストが無い and/or コードに対する理解が無い ↓ エンバグ、ビルドを壊すことへの恐怖 >>557 新しいマシン買えばいいだけじゃないか 開発費とハードウェア費用どっちが高くつくと思ってるんだ りファクタリングって言うのは、オブジェクト指向の言語(これが大前提)で、 開発段階にあって、試作品が第一段階で問題なく動いて、 あとは性能やコードの見直しやカイゼンだよねって段階で設計へフィードバックするプロセスですよ。 その後に顧客側のチェックと納品ですよね。 運用中のシステムに手を入れるという話では無いですよ。 カイゼンを全否定ならトヨタはどうなるんでしょうか? 一度客に納入してさあ、次に改修の仕事がきたときにリファクタリングしていたから工数が減っていたとしてもなんのメリットもないんだよな。むしろ工数が少なきゃ金が取れない。リファクタリングした分取ったら水増し請求だ。 機能やバグについて同等で、メンテしやすさだけ向上させる工程なんて日本の一般的な開発ではインセンティブゼロだよ。趣味ならともかくプロの仕事なら。 最初からリファクタリングの作業も込みで工数見積もりなり、費用請求しろ、ってそんな見積もり見て納得する客いるわけないじゃん。最初から手直しいらない納品物にして下さい、と言われてオチ。 出来上がってテスト済みのソースをあれこれいじるなんてお遊びが入り込む余地はない。 それと、テストという概念は個人がスクリプトやツール類を書く場合には絶対に生まれてこない発想で、 多人数で、複数の技能レベルの人が、仕様書をガイドに組織的に開発に関わる条件下で必然的に生じる仕事上の手続き。 個人がコード書く場合は、ソースコード全体、アルゴリズム、関数やクラスを全て把握しているので テストコードをいちいち書く必要がない。だからデバックという手順はあっても、関数やクラスのテストコードを いちいち書くという発想にはならない。コード修正も容易、エラーが発生してもその場で即対応できる個人レベルの作業としては正しい。 組織で開発する部門では他人が必要なコードを仕様化した関数やクラスの動作条件を定めているから、 それを大前提としてモジュール動作をテストする必要がある。一見して馬鹿げている行為に思えるのは、 アルゴリズムを提示せずトップダウン的に関数のIN/OUTのみで仕様を提示するためにモジュールのテストが必須になる。 チェックデータの側面についていえば情報管理上テストデータが必ず必須になる。それは本物と試験用のデータが違うということ。 テストコードは本人が書くと、世界は如何にばかげた行為に時間を費やしているのかと思うだけだが、 本来は書く側は最終コードが動作すると確認した上で、2重チェックとして仕様を作成した側がテストするためのコードなり手段を作るべきだな。 人が居ないというなら、テストコード書くのでなく、統合テスト的に動作チェックすべき。 リファクタリングは工数水増しの手段ではない。 保守とは違うので、日本の開発やってる業界のインセンティブなど関係がない。 リファクタリングとは関係がないな。 見積もりの段階でリファクタリングなどの話は出てこない。 手直しが要るといって費用請求している段階で、それはリファクタリングの問題ではなく 失敗したプロジェクトや案件だということだろう。それを誤魔化す為に誰かが嘘として リファクタリングと言ってるだけだろう。 もし>>567 が客側の意見であれば、失敗したプロジェクトや案件とは縁を切って 再出発したほうが開発側も、客側も気持ち的にはしあわせになれますよ。 >>563 >http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0_ (%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0) >リファクタリング登場の経緯と目的[編集] >リファクタリングが登場する以前は、一度正常な動作をしたプログラムは二度と手を触れるべきではないと言われていた。 >下手に手を加えて動作が変わってしまうと、それに伴って関連する部分にも修正が加えられ、やがて修正はプロジェクト >全体に波及し対処しきれなくなるかも知れない。またソフトウェアテストを十分に行い正常な動作が確認されたとしても、 >そのプログラムをわずかでも改変すれば、バグ (欠陥) が見つかったときに改変があったプログラムを疑わなければならない。 >>566 >りファクタリングって言うのは、オブジェクト指向の言語(これが大前提) は?wwwwwwwwwwwwwwwwwwww オブジェクト指向とそうではない言語での違いを説明しろよ オブジェクト指向という言葉になんか宗教的妄信でもしてるのか? 必要なのはコードのリファクタリングではなく チームメンバのリファクタリングである 言い換えると、ソースコードをリファクタリング出来るように チームメンバーの技術力を高めることである。 > チームメンバのリファクタリングである リファクタリングて振舞いを変えてはいかんのでは? 例えばバグが多く、しかも非常にメンテしにくい糞コードがあったとする この場合 1. バグを含んだままリファクタリングして、その後バグを直す 2. 先にバグを直して正しいテストを通る様にしてから、リファクタリングに着手する どっち? >>576 原則としては2番 ただし、今既に十分なテストがあるのなら、 リファクタリングしてもよい。 ようするに「バグが有ることに気づいていなかった」と考える。 バグが有るといえども、その状態で使われていたのであれば、 問題ない範囲(把握している範囲)で使われていたわけで、 使われていた部分の動きが変わっていなければ何も問題ない。 適切に動いていないバグの部分の動きが変わった所で 誰も困らない。そもそもバグは仕様ではないのだから。 ホント現実をみてないな クソコードの影にクソ仕様書あり 仕様が網羅されていないクソ仕様書、そしてあってるのかあってないのかもわからんクソソース そして、仕様を完全把握しているものは不在(いない) コードを読みやすくする?直す?どーやってなおすんだよ正しい仕様不明なのに 手を入れなければ責任問題は自分にはかからない 正式に仕事として認可されるまでは、さわらずほっとく。こんなのが大量なんだ現実は まともな仕様書を作るやつは、まともなプログラムも書いている。でもそれは修正等々なんて必要のないソース リファクタリングの対象となるソースは、前者のクソコード、クソ仕様書のほうだ。正解が不明なのにどうやって直すんだ >>579 具体的に、クソコードになってしまう クソ仕様の例を言ってみて。 思いつかないんだよね。 > コードを読みやすくする?直す?どーやってなおすんだよ正しい仕様不明なのに それは、正しい仕様がなければ、 現在のコードの動きを仕様と考えればいいだけ。 >>581 クソソース1万ステップもよみとーない 句読点のない文章みたいに処理の区切りがまったくないような文体で書かれたソースなんぞ誰が手をつけるか 開発手法が根本からおかしい リファクタリング以前の問題 >>580 クソ仕様って誰が言った? クソ仕様「書」って言ってるの。馬鹿なの?あほなの?無能なの? おまえマ板の無職windowsさんでしょ >>584 じゃあ、そのクソ仕様書の具体例を 言ってみて。 >>582 > 句読点のない文章みたいに処理の区切りがまったくないような文体で書かれたソースなんぞ誰が手をつけるか でも、バグがあったら直さないといけないし、 仕様変更、機能追加があったら、手を付けないといけないよね? うちのソースコードはほとんどが綺麗だから 句読点のない文章みたいに処理の区切りがまったくないような文体で書かれたソース なんてほとんど無いよ。 そんな汚いソースがたくさんある所は、 手をつける箇所=リファクタリングするべき場所でしょう。 この板はガセネタをもとにした煽り合いのスレしかないみたいだな ・××と言われているが本当は○○ ・こんなことも知らないの? これが2ちゃんクヲリチーだな >>585 作ってあげるよ、クソ仕様書 機能: 俺の心の中にあるいい塩梅で、業務を遂行する処理 以上 これは極端に書いたが、冗談抜きで口頭で仕様をやりとりしたのか いっさい、仕様書に、当該機能部分の記載がない。 >>590 どっちにたいして言ってるのかわからんよ、その文では クソシステムが嫌と言ってる人に言ってるのか、 リファクタリングwをしないやつはだめだって言ってるやつに言ってるのか どっちにも解釈できる クソソース1万ステップ読まなくていいようにするためにリファクタリングするんじゃないか マーチン・フラウアーのリファクタリング本てruby版とjava版て言語が違うだけで内容は重複してるの? それとも別の内容が多いから両方買った方がいい? >>589 それがソースコードとなんの関係があるの? その曖昧な仕様によって、作られる機能が 曖昧になるだろう。 だが、機能が曖昧になるだけで、 それを実現するコードの読みやすさは関係ないはずだ。 >>593 >>454 ででてるリンク先の一覧が内容の比較として使えるよ。 多くは重複しているが、それぞれ片方にしかないものもある。 と思ったが、Java版、新装版がでたんだったか。 旧版、新装版、両方持っているが新装版の方はまだ見てないやw ぱっとみ片方にしかないものは、言語の特徴によるものっぽいから 重複率は同じか少し高くなるだけだろうね。 それでも俺はそのうちRuby版かうけどねw >>596 リファクタリングっつって真理教とか妄想するお前が一番オームくさい。 リファクタリング大勝利!!! Aさんがリファクタリングしました。 Bさんが読みましたAさんのリファクタリングがクソです。Bさん直しました。 Cさん見ましたBさんのソースコードクソです。Cさん直しました。 永遠と、、、、、 個人の力量、感性によって結果が大きく作用してしまうものは、学術的工学的な基本がないからどうにもならない。 普通は、 Aさんがリファクタリングしました。 Bさんが読みましたAさんのリファクタリングがクソです。Bさん直しました。 Cさん見ましたBさんのソースコードクソです。Cさん直しました。 Cさんリファクタリング大勝利!!! ・・・でしょ? Class レイザラモンFoo Extends Object Public サルinit(void); Public クエリFoo(String SQL文はクソ); Protect ないですFoo(void); Destractor システム緊急停止オペ呼んでくさいFoo(void); End Class こんな仕様のクラスを業務システムのスーパークラスにしてあとは全て継承 という仕様は誰だって疑問を持つと思うんだが、そこを直すのがリファクタリング。 リファクタリング大勝利!!! >>598 それリファクタリング関係ないしw なぜなら、俺が作ったコードを誰かが編集した時に、 変な修正の仕方をされることがあるから。 それを直すのがリファクタリングなわけ。 >>599 再びAさんが担当した時、Cさんのコードを読めず仕事になりませんでした。 Cさんリファクタリング大勝利!!! 個人の知識の違いによってソースの見え方が違うからな アホが天才のコードを見ると何じゃこりゃってなるし、逆もまた然り 知識って・・・そんなの一機能5分もあれば 知らない状態から理解できるだろ。 どんだけ素人なんだ? つーか知らない時点で、判断できないわけで 議論からはお役御免なわけだが それに、知らないなら何をやっているか 理解できないわけで、リファクタリング出来るわけがないな。 おれはやらな〜いw これでリファクタリングは崩壊するwww アホみたいな話だが結局>>598 が真理だよな。 リファクタリングする人は、自分のコードもいずれリファクタリングされる事を受けいれねばならん。 リファクタリングはただのコード修正と思ってもらってかまわない リファクタリングするよ派はここでなにしてんの?しないよ派とじゃれあってるのが楽しいの? やり合ってる本人は議論してるつもりかもしれないけど、外から見てるとしょうもなさすぎてww >>607 それは単に、プログラム?なにそれおいしいの? 動けばいいでしょ?って言ってるだけでしょう? そんな会社はリファクタリング以前に 仕事が終わってる。 >>1 が考えるようなことは誰もが考えてる。 その結果、新しい開発言語が生まれているということを理解できないのか? 過去、多くの開発手法・開発スタイルが提唱されたが、 社会に受け入れられたものは、「理論」と「それを強制する新しい開発言語」が常にワンセットになっていた 「超絶スパゲッティコード」を少しでもまともにするために 原因の「goto」を取り除く方法として、「gotoレス」という理論とともに「3つの基本構造を使うようにした、構造化プログラミング言語」が生まれ 「グローバル変数の多用がデバッグを困難にする問題」を少しでもまともにするために 原因の「不必要にメモリをどこからでもアクセスできる状態」を取り除くため「カプセル化」が提唱され、オブジェクト指向言語に組み込まれ 等々・・・・。 何を持ってリファクタリングといいたいのかわからないが、汚いコードを綺麗なコードになおすというなら。 リファクタリングが成功したといえる、最終のコードはどのようなものなのか。具体的に示す必要がある。 プログラムとして存在するあらゆるコードパターンに対応した、綺麗なコードを示してくれ。 それを明示できないうちは>>598 の意見が正しい。 個人の感性次第なら、汚いコードと周りは言うが書いているプログラマにとってはリファクタリング不要な綺麗なコードと判断するだろう。 先人達は、その時代のプログラムコードの問題を考えた。 その答えが、理論を具現化した新プログラミング言語の開発だ。 >>1 はしのごのいうなら、リファクタリング後の形になるプログラミング言語を生み出せ。 どんな馬鹿でも、その綺麗なプログラミングになるプログラミング言語を。 >612 新しい言語というから何かと思えば gotoレスとかカプセル化とか 全然新しくないじゃないか。 30年ぐらい前の話だろ。 > 何を持ってリファクタリングといいたいのかわからないが 無知は勉強すればいいだけ。恥ずかしいことなんて無いよ! >>423 , >>426 あたりを読むといいよ。 リファクタリングの誤用 ttp://capsctrl.que.jp/kdmsnr/wiki/bliki/?RefactoringMalapropism リファクタリングの境界線 ttp://capsctrl.que.jp/kdmsnr/wiki/bliki/?RefactoringBoundary インタフェースの変更はリファクタリングか http://capsctrl.que.jp/kdmsnr/wiki/bliki/?IsChangingInterfacesRefactoring > 答えは簡単――インタフェースの変更はリファクタリングだ。 未知のバグフィックスはリファクタリングか? http://capsctrl.que.jp/kdmsnr/wiki/bliki/?IsFixingAnUnknownBugRefactoring > 私はリファクタリングと呼べると思う。 バグを含んだ振る舞いを知らなかった(あるいは気にしなかった)わけだから、 > これは「外部から見たときの振る舞い」ではないのだ。 たとえバグに気付いていたとしても、 > それが気にするようなバグでなければ、 リファクタリングと呼んでもよいと思う。 最適化はリファクタリングか? http://capsctrl.que.jp/kdmsnr/wiki/bliki/?IsOptimizationRefactoring > 最適化とリファクタリングはどちらも変化を伴うものだが(なかには最適化かつリファクタリングとなる変化もあるが)、 > 両者は別物だと私は考えている。なぜなら、両者の目的が異なるからである。リファクタリングは、 > コードを理解しやすくするためである。最適化は、プログラムを速くするためである。 宣言の順序変更はリファクタリングか? http://capsctrl.que.jp/kdmsnr/wiki/bliki/?IsDeclarationOrderingRefactoring > 宣言(Javaで言うメソッドやフィールド)の順序を変更することは、リファクタリングと呼べるのか? > リファクタリングの定義で、 「理解や修正が簡単になるように」というフレーズを使った。 > 宣言部分を変更すると、理解や修正が簡単になるのだろうか? 私は、そういう場合もあると思う。 > ソフトウェアの内部構造を変更しないという点が紛らわしいかもしれない。 リネームしても実行内容は変化しない。 >>614 を見ればわかるけど、 リファクタリングを 汚いコードを綺麗なコードに直すこと とは書いてないんだよね。 なんでこんなふうに間違って解釈してるのかな? それって、汚いコードが(あなたの所に)多いってだけで、 リファクタリング以前の解決するべき問題だよね? リファクタリングとはソフトウェアの変化とともに、 あるべき設計に安全に変化させる方法のこと。 >>613 あ?30年前だ? がきんちょがてきとーなことぬかしてんじゃねーぞ? 30年前のコードならgoto乱発が現役だ 汎用機に大量にその証拠があるわ どあほが。 >>615 具体性がございません。 個人の感性次第でよろしいですか? なら退職時、全部アセンブラコードだけにしちゃいますがw このスレも ↓のスレも ソースコード品質検定試験が世の中には必要だ http://kanae.2ch.net/test/read.cgi/prog/1411354584/ 同一人物が立てたスレだと自白しました。 そして、人物の正体も自白しました。 >5 名前:仕様書無しさん[sage] 投稿日:2014/09/22(月) 17:48:09.54 >無職Windowsしか使えないリファクタリング馬鹿がまたスレたてやがった > >6 名前:仕様書無しさん[sage] 投稿日:2014/09/22(月) 21:31:27.59 >>>5 >たてたね。それで? > >なにか言い返したいことがあるのなら >いっていいだぜ?w > >7 自分:仕様書無しさん[sage] 投稿日:2014/09/23(火) 07:22:55.61 >>>5 >自然と、「無職」「Windowsしか使えない」「ム板でリファクタリングスレ」を立てたことを認めているww さすが、無職でWindowsしか使えないだけはあるw だれも同調してくれないww 説得力もカリスマ性も感じないからなw >>617 具体例はここに書いてあるよ。 > >>614 を見ればわかるけど、 > > リファクタリングを > 汚いコードを綺麗なコードに直すこと > とは書いてないんだよね。 まだ無職が語るの? 恥ずかしいからお前の社会的立場を恥ずかしくない位置にリファクタリングしてからプログラムのリファクタリングを語れよw しかし、この超売り手市場なのに就職出来ないって、相当無能なんだな いやぁ馬鹿スレを止めてくれてありがたい 完全に自爆だけどな(笑 え? マジで!?いろいろ見て回ってきたけど ゲーム作りたくてプログラマになったけど、就職できず、Windowsしか扱えないので、派遣でコボルやるもクビになって無職 なの?!( ;´Д`) そんな身分で、現役のプロのプログラマにプログラム、プログラミングにたついて講釈たれてたの? ε-(´∀`; ) どんだけ、恥知らずというか、身の程知らずというか、小保方というか。 空いた口が塞がらないわ(^◇^;) マジでお前自信をリファクタしろよ(・Д・)ノ という妄想を書く人って、 実社会では自分が落ちこぼれなのかな。 リファクタリング良さそうなんだけど、いろいろ疑問点があります 上で内部的インターフェイスの変更もリファクタリングに含まれるという話がありましたが インターフェイスを作り変えたら対応するテストケースも作り変える必要がありますよね? その場合、リファクタリング内でテストケースに手を付けて インターフェイスとテストケースを同時に作ってしまっていいものでしょうか? 外部的インターフェイスに指定したテストケースのみパスすれば 問題ないと考えるのでしょうか? テストケースは全部通さないと駄目だよ 人間の書くテストが全部網羅してるとも限らないから テストの穴を突いた部分が他所で影響してるかもしれない 原則としてよほどの事でもない限り一度リリースしたら手をつけないがベスト リファクタリングなんて幻想だからやめなさい インタフェースを作り替えたらテストも必要 というかテストできない・しづらいインタフェースを作ったらあかん >>628 > テストケースは全部通さないと駄目だよ 内部動作をリファクタリングする場合はそうだと思います。 > 人間の書くテストが全部網羅してるとも限らないから > テストの穴を突いた部分が他所で影響してるかもしれない 100%のテストはないけど、十分捕捉率の高いテストと 十分機能変更の余地が低いリファクタリング手法の組み合わせで 実用になるというのがリファクタリングの主張ですよね。 内部動作のリファクタリグだけならそれでいいんですけど、 ただやっぱりインターフェイスの拡張・取捨選択も やりたくて、そういう場合どうすればいいのかなと。 > 原則としてよほどの事でもない限り一度リリースしたら手をつけないがベスト 一度リリースしたっきりでソースのことを忘れ去っても 大丈夫なプロジェクトならそうかもしれませんが、 リファクタリングがターゲットにするプロジェクトは リリースした後に(リファクタリングするしないに関わらず) 何度も手を付けてメンテナンスすることが要求されるような 継続性のあるプロジェクトではないでしょうか? > リファクタリングなんて幻想だからやめなさい 上手くいくと言っている人も多いので、 安易に幻想だと断定もできないように思います。 幻想だとはっきり納得出来たらやめます。 >>629 > インタフェースを作り替えたらテストも必要 > というかテストできない・しづらいインタフェースを作ったらあかん テストしづらくはないのですが、 例えば1つ1つの public メソッドにテストを書いていたら とても作業が時間内に終わらないというような、 時間がかかってしまう的な問題です。 でも public メソッドはクラスの持つインターフェイスだから テストは必要ってことですか? ただ、そのテストのメンテナンス、テストを減らしたり、改善したり、 そういう話はまだ多くないんですね。(例えば)テストが増えてくると、 全部のテスト通すのに 3 時間かかったりとか、 テストの量自体が問題になってくる。 またテストが実装に深く依存してて、リファクタリングしたらテストが ばーっと真っ赤*49になっちゃうからやめようみたいな話とか。 テストをたくさん書けば良いってものじゃないんですよ。 設計の改善を前後で担保するためのテストだったはずなのに、 設計改善の邪魔をしてるんじゃないか? と。 テストが変更のコストを一定にするという夢を俺たちは見てやってきたのに、 テストが増えると変更コストが上がっていないかい? という問題に対してどう戦うか、 それが今の TDD の主戦場だと思っています。 http://www.ogis-ri.co.jp/otc/hiroba/others/OORing/interview43.html >>632 下手なテストを書くとそうなるって話ですね。 テストできない・しづらいインタフェースを作ったらあかん >>627 有能な人材だけで構成されているなら可能 でも有能な人材はそもそもそんなコードを書かない つまり、現実では実現不能ということ。 よく考えてよ。 ゲーム会社への就職も面接すらいけずに終わり、他の会社も全滅、登録派遣しかなく ようやく派遣されたCOBOLでクビになり、 自分は有能だと思い込んでいるケドWindowsしか使えない 無職の人の立てたスレだよ? >>637 返信ありがとうございます > よく考えてよ。 誰が立てたかでなく、何を言っているかで判断しています > 有能な人材だけで構成されているなら可能 627 では可能かどうかという聞き方はしていないのですが、 627 のどの部分を指して可能と言われているのでしょうか? > でも有能な人材はそもそもそんなコードを書かない これも、627 ではどんなコードかに関して言及していないと 思うのですが、そんなコードというのは何を指しているのでしょうか? 世の中に汚いコードが溢れてるってことだなw リファクタリングは汚いコードを直すことじゃないよ。 コードは修正するたびに(≒機能追加) どんどんコードが増えていく。 素人集団は、コードの既存部分を直さずに追加するだけで終わらせる。 有能な人材はそもそも汚いコードを書かないというが、 それは、有能な人材は、リファクタリングをしながら機能追加していくから 汚いコードに"成長しない" ということを意味する。 設計がまずかったり場当たり的に組んでしまったりして いったん汚いコードになってしまったらもう手遅れですか? 汚いコードをインターフェイスを変えつつ 改善していきたいと思っているのですが >>648 「汚いコード」のうちは未完成と考えるよ。 設計書だってレポートだって小説だって 書いた最初は下書きでそれから清書するもんだろ? >>640 汚いのを綺麗にする行為をリファクタリングとは"呼ばない" これが原理主義者の主張するところである >>643 ではリファクタリグしたとしても汚いコードは汚いままなのですね >>644 汚いコードはリファクタリング前に綺麗にしてから リファクタリングするから、 リファクタリング後は当然綺麗になってるよ。 >>645 リファクタリグとは別に、汚いコードを綺麗にする方法があるのですね どうやるんでしょう? >>646 まず何が綺麗で何が汚いかを勉強することだね。 それを知らないことにはどうしようもない。 逆に知ってしまえば、具体的な質問ができるようになるよ 汚い××というコードを、綺麗な○○に変化させるには どうしたらいいでしょうか?って そういう質問なら答えがちゃんと言える。 君の今のレベルの質問は曖昧すぎて答えがない。 >>642 その高スキルに限って自分のソースが保守できずに早々に放棄する 書きなぐり続けるのはその繰り返しのため >>642 俺様のコードは凡人には分からない 協調作業が出来ないタイプの典型 困ります、俺のプロジェクトから即刻リジェクト してほしいです 田中お前だよ 世の中なんでも使い捨てで楽な方に向かってるのに プログラミングの世界は古いものを大事に使いたがる不思議 怠惰なフログラマこそ率先してコードを使い捨てにすべきじゃね? >>650 使い捨てる理由の大半はどんなにうまく保存しようとしても劣化し続けるから。 ソフトウェアはそういう物理的制約から書いたものはずっと同じまま残り続ける。 うまくバックアップや環境が残りさえすれば半永久的に使い続けることが出来る わけだから、怠惰であればあるほどそういう資産を積み上げていくんだよ。 >>651 バカだな劣化するからリファクタリングとかいう下らない事が流行るんだぞ 再利用って考え方がそもそもコストが高いんだよ もんじゅとか例に挙げなくてもリサイクルって金掛かるだけで 利権で儲けるしかない仕組みだって判るよね 再利用のコストに関しては単純に何回再利用するかで変わってくるから、 コストの高い再利用をしているお前が悪いんじゃないのとしか言えない。 リファクタリングも同じで、2度と手を入れないような部分や新規プロジェクトを 渡り歩くような人には不要なもの。 ただ昨今のアジャイル開発とか呼ばれている ものだと、ある程度の期間は修正や追加が必要になってくる。 無計画に接ぎ木を してわけの分からないキメラを作るより、ある程度剪定して理解できる範疇に 修める必要があるよねっていうのがリファクタリング。 >>654 ソフトウェアの再利用もその都度コストがかかるんだが? 普通は回数に比例してコストが増加するぞ >>655 > ソフトウェアの再利用もその都度コストがかかるんだが? > 普通は回数に比例してコストが増加するぞ 再利用するために何らかの変更が必要なら、そのときだけコストがかかるが、 以降はコストかからんだろ。 再利用前提で作ろうとしてる時点で余計なコトスがかかっとるわい 再利用性や拡張性というのは、将来のことだから仕様外。 仕様外だからプログラミングの対象外。 おわり。 再利用と考えるからいけない。 モジュール化。 適切なモジュール化は、再利用出来るだけじゃなく、 複雑度も減ってバグも少なくなる。 適切なモジュール化が出来ない奴が 再利用にコストがかかるとか コードが再利用できないとか言う。 >>660 それは再利用じゃないよ 機能を小さく保つ事で、本来の目的である一次利用出来る範囲が広がるだけだ それを便宜的に「再利用しやすい」などと表現してる訳だ ソフトウェア本来の目的とは異なる本当の意味での再利用にはコストがかかるんだよ 本当の意味での再利用? そんなもんに興味持つ必要はなさそうだが? >>660 それな。 本当にそれ。 >>661 > 機能を小さく保つ事で、本来の目的である一次利用出来る範囲が広がるだけだ 一次利用が出来る範囲が広がる=再利用だろw 全く修正しないで使うのが再利用。 コピーして修正して使うのが流用 流用をすると、AとA'というコードが生まれなんで二つに分かれてるの? 違いはなんんあの?と結局両方を読まないといけなくなる。 流用するたびに読むべきコードがどんどん増えていく。 はてに一つを修正するともう片方の修正を忘れるとか。 なので全く修正しないで使う「再利用」でないと意味が無い。 全く修正しないで使えるのだからコピーする必要はなくなる 流用元から流用先がどこにどれだけあるかは基本的に分からない。 流用元に何かバグがあって修正する必要があった場合に論理的に考えると 流用先も直しておいた方がいいor直す必要がある。 ただ流用先を全て特定 することは難しく、特に流用先で動くように変数名とか変えてあると確実に 漏れる。バグじゃなくても何か修正追加したいと思った時の事を考えると コピペをばらまくより関数で再利用するほうがいいよねってなる。 ただ人間は欲深いもので1つの関数にあれもこれも詰め込んで破綻させる 奴が出てきたりする。こういうのを見て、関数なんて作らなくてコピペでいい だろって奴が出てきて無限ループする。 頑張って同じ機能がすでにあるか探して、 あったらあまりいいコードじゃなくても正しく仕様を満たすからそれ使って 散々気をつけてんのに誰かが変更しやがる >>661 ,660 >ソフトウェア本来の目的とは異なる本当の意味での再利用にはコストがかかるんだよ アプリ内でのモジュールの共通化(=アプリに特化したフレームワーク、ライブラリ の抽出)と、どんなプロジェクトでも使えるようにフレームワークやライブラリーを 汎用化するのは似て非なるものだと思う。 どのタイミングでやったら工数に影響を与えずにできるの? みんな、言い負かされないようにリファクタリングを定義してるから、本当の目的がなんなのかぼやけちゃってるよね。 保守性(機能変更のし易さ)と速度の向上 リファクタリングの目的はこれでしょ。 それが必要ならリファクタリングすればいいし、将来的な機能変更もなく速度にもとくに問題がないなのら、どんなに汚いコードであっても下手にいじる必要はないよね。 むろん、個人で作った(使ってる)プログラムならリファクタリングするかしないかはその人の勝手だけど。 >>673 次の変更がきてから変更すればいいじゃない? 大抵の趣味人はリファクタリングなんかせずに垂れ流しだろ あとwikiから "Code refactoring is the process of restructuring existing computer code―changing the factoring―without changing its external behavior. " リファクタリングとは既存のコードを再構成する工程であり、 そのコードの外的な振る舞いを変えずに 問題の細分化(factoringを意訳)を変えることである。 だってさ、こんなスレよりよっぽどわかりやすいや ユニットが再編成されたコードの外的な振る舞いをテストする という意味ではユニットテストはその目的を果たしてないけどな うちの会社の糞プロジェクトはリファクタしてことでバグ生んで大炎上してたな >>680 外的な振る舞いを変えないのがリファクタリングだろ >>682 なんだ?だからテストしなくても良いとか言いたいのか? >>683 なんでそうなるんだ? リファクタリングによって振る舞いが変わってない事を確認する為にユニットテストが必須という話をしてるのに >>684 なんでそうなるんだ? ユニットが再編成されたコードの外的な振る舞いが変わっていない事を確認する為にユニットテストは使えないという話をしてるのに 分子構造が再構築された全ての細胞の働きがもとそれと1つも変わらないならそれは再構築前と同じ生物になるのではないか という理屈 >>684 テストが必要っていうのは正しいが、そのテストはユニットテストとは限らん。 まず>>678 に書いてある「外的な振る舞い」というのは どこが外的かを考える必要がある。 リファクタリング対象がモジュール(クラス等)であれば 必要なテストはユニットテストだ。 だけど設計に近いレベルであれば必要なテストというのは E2Eテストやシステムテストだったりする。 何をリファクタリングするかによって必要なテストは変わる >>687 設計に近いレベルの変更というのがどういうものを指すのか良くわからんが、E2Eテストやシステムテストが必要になるコード変更はリファクタリングとは言わないでしょ。 >>688 むしろその規模のリファクタリングでなければコーダーのオナニー以上の意味がないくらいなのだが >>690 規模の話はしていない。 1箇所数行のリファクタリングであろうが、1万箇所数万行のリファクタリングであろうが話は同じ。 E2Eテストやシステムテストでなければテストできないようなリファクタリングって、具体的にどんなものなんだ? >>691 リファクタリングで効率が良くなったとして、ユニットテストレベルで勝手にリリースして 本当は他のシステムで必要な協調動作パラメータの再調整が必要だったり 想定してたバッファがパンクする可能性とか想像できんの? そもそもリファクタリング単体の案件なんてまず発生しないし 他の案件の一部にねじ込むってパターンがほとんどだから結局テストは全工程やる事になるけど >>692 「他のシステムで必要な協調動作パラメータの再調整が必要」なほどの大きな変更を「外的な振る舞いが変わっていない」と表現・定義して、それがリファクタリングであるというのはちょっと同意できない。 そもそも、>>687 で > 何をリファクタリングするかによって必要なテストは変わる ということなので、E2Eテストやシステムテストが必要なリファクタリングとは、具体的にどんなものか、というのが疑問なんだけど。 >>692 > 想定してたバッファがパンクする可能性とか想像できんの? あと、これ、単なるバグ(または設計ミス)でしょ。 しかも、単体レベルで検知可能。 レベル低くて結構だが 要件から漏れた設計なんて後からいくらでも見つかるのが現実 最初から設計や実装が完璧ならリリース後のコードに手を付けようなんて考えすら出てこないだろ ID:pecoNgwzがすごい小さい世界で生きていることだけはよくわかる >>691 > 1箇所数行のリファクタリングであろうが 君はこれで何がリファクターされると考えているのかね? 既存のコードを君好みのノーテーションに変える事をリファクタリングとは言わないのだよ リファクタリングとはただのコード修正とは違うという意味 君分かってないよね っていう勘違いをここまで堂々と話してるところが2chだなぁと感じる >>691 > E2Eテストやシステムテストでなければテストできないようなリファクタリングって、具体的にどんなものなんだ? 違う言語にリファクタリングした場合 >>692 > リファクタリングで効率が良くなったとして、ユニットテストレベルで勝手にリリースして > 本当は他のシステムで必要な協調動作パラメータの再調整が必要だったり > 想定してたバッファがパンクする可能性とか想像できんの? これリファクタリングと全く関係ないよね? 機能追加で便利になったとして、ユニットテストレベルで勝手にリリースして 本当は他のシステムで必要な協調動作パラメータの再調整が必要だったり 想定してたバッファがパンクする可能性とか想像できんの? >>701 言語関係ないと思うが。 出来た実行可能ファイルかライブラリーか知らんがそれの挙動が変える前と代わっていないかテストすればいいだけだろ >>692 > そもそもリファクタリング単体の案件なんてまず発生しないし 当たり前。何かの修正があるときに 適切な形に変えるのがリファクタリング 「何かの修正」が加わる前の時点での適切な設計と 「何かの修正」が加わった後の適切な設計は必ずしも同じではない 「何かの修正」を加えるときは、もし最初から「何かの修正」が存在したと 仮定した時の適切な設計も同時に実現しなければいけない 修正するたびに適切な設計から離れていく、修正するたびに 壊していくようなやり方は責任あるプロの仕事とはいえない > 他の案件の一部にねじ込むってパターンがほとんどだから結局テストは全工程やる事になるけど 結局テストは全行程やるんだから、修正のたびにリファクタリングを加えてなんのもんだもない >>703 だから、出来た実行可能ファイルかライブラリーか知らんがそれの挙動が変える前と代わっていないか E2Eテストやシステムテストでテストするんだよ >>705 実行ファイル一つならそうである可能性もあるけど、ライブラリだったらシステム全体ではないよね。言語関係ないとはそういうこと。 勘違いさせたならすまんが、俺は別にリファクタリングにシステムテストとかが必要ないなんて思ってない。その一つとは別人。 リファクタにE2Eテストがいらないというのはある意味ただしいんだよ アジャイルにおけるリファクタなんかがまさにそう 自動テストありきでイテレーションに組み込まれる ただリファクタにも色々あるよねって話 リファクタリングの責任範囲はユニットテスト迄でシステムテストとかは機能の変更、追加、向上なんかの範囲だと思うけどね この二つを混ぜてリファクタリングと呼んでる人が一定数いて話をややこしくしてる もちろんリリース前には一通りテストはするけどそれはそれ。リファクタリングに必要なテストとは別物 >>708 いやE2Eテストが自動化出来ないというわけでもないからちょっと違うくない? リファクタリングにも色々あるよねというのには同意。 リファクタリングの対象を決めることは大事だよね。 システム全体をリファクタリングしようとしても成功率は低い。だからE2Eテストはいらない(システム全体を一度に変えようとすんな)と言いたい気持ちも解る。 >>709 責任範囲がユニッテテスト迄w もはや何を言いたいのか自分でも分かってないだろお前w >>711 君が言いたいことは分かんないけど自分の言いたいことはわかってるよ >>712 いや分かってねえよお前w 既存のユニットテストが利用出来るようなコード修正は お前のコードオナニー以外の何者でもない お前はリファクタリングという正義を笠に着てコードオナニーをしているだけの 童貞コーダーにすぎないのだよ >>713 まさに混同してる人が話をややこしくしてる見本 >>706 何だその意味がない答えは? > 実行ファイル一つならそうである可能性もあるけど、ライブラリだったらシステム全体ではないよね。言語関係ないとはそういうこと。 ライブラリだったらシステム全体ではないかもしれないけど、実行ファイル一つならそうである可能性もある >>710 まあそうね >>713 いやわかってないのはおまえ リファクタといえば一般的にはTDDありきのおまえのいうオナニーだ >>709 > システムテストとかは機能の変更、追加、向上なんかの範囲だと思うけどね 意味が全くわからん。外から見たときに機能も何も変わらなくて 内部の設計が良くなってるならそれはリファクタリング >>716 > リファクタといえば一般的にはTDDありきの TDDがリファクタリングありきなのであって リファクタリングはTDDとは関係ない >>718 関係ないのではなくリファクタがそれだけではないってだけ おまえめんどくさいな >>719 それだけじゃないっていうのなら、 他に何があるのかを言えよ お前は否定するだけで、自分の意見を何も言ってない >>716 んなアホなw まともなリファクタリングしている奴だって大勢いるわw >>715 だから違う言語にしたというのと、システムテストをするというのは無関係だって話だよ。それだけ。 ID:6yEMM6pR がまともなリファクタリングを語るのはもうギャグにしか見えない >>722 外部から見たときの動きを変えずに、内部の言語を変えたら ユニットテストもつかえねーだろ。 何を言ってんだお前 >>717 そう言ってるつもりだけど?機能の変更までやったらシステムテストは必要だけどそれはリファクタリングの後の工程だよねってこと >>724 なんで?例えばC互換のABI作れる言語なんて山ほどあるけど(バイナリ作る言語ではほぼ必須機能だよね) 他にも内部の言語は変えたけどモジュールの外向きのラッパーは今までと同じ言語で書くというのもあるだろ >>725 お前頭沸いてんなw そもそもテストの存在意義すら分かってねえじゃねえかw ユニットテストは必要だけどシステムテストは必要ないなどと言う開発メソッドは 人類の歴史上でただの一度たりとも存在した事はねえよw >>726 なんでお前特別な状況下においてできるって話をしてるんだ? 一般的にはできない(やらない)だろ >>728 別に特別とは思わないけど。例もあるよね。 FirefoxのメディアパーサーをRustで書き直した話とか。 >>720 ほんとめんどくさいな バカがオナニーと言ってるようなifをswitchに変えるリファクタからソフトアーキ自体を変えるものまで全てリファクタだっつってんだろ >>730 ←自分のオナニーが認められないから根本的な設計思想の変更までリファクタリングだと言いだす極端すぎるバカw バカをチンカス野郎と言い換えても 罵倒であることは変わりない これがリファクタリングでしょ? 「外部からみた振る舞いを変えずに内部の設計を変更すること」がリファクタリング ここでいう"外部"が関数の外部だったりシステムの外部だったりするけど、どっちもリファクタリング リファクタリングを実施するのは設計〜製作工程 TDDなら製作と同時にユニットテストも当然走る TDDであってもそうで無くても、製作後にテストの工程は当然流す 添削おなしゃす >>734 > TDDなら製作と同時にユニットテストも当然走る > TDDであってもそうで無くても、製作後にテストの工程は当然流す これはリファクタリングの定義とは関係ないし TDDでなくてもユニットテストは当然走る >>735 >これはリファクタリングの定義とは関係ないし そうだね 上の方でごっちゃにしてる人が居たからついでに書いたけど、語弊があったね >TDDでなくてもユニットテストは当然走る そうだね 製作と"同時に"走るかどうかだけの違いだと思う >>739 日本の社畜プログラマーは文系卒のゴミばっかりだから 日本のソフト業界は大量のゴミを一部の有能なエンジニアがコントロールすることでなんとか成立してる ゴミにTDDなんてやらせたら有能な人間がリファクタリングに追われる羽目になる >>740 どうせゴミが書いたコードなんて修正しなければならないんだから、テストがちゃんと書かれてる方がそれをパスするようにリファクタリング出来てマシだろ。 ゴミが書いたテストコードなんて使えるわけなかろう 時間の無駄 >>740 ←TDDもリファクタリングも分かってないゴミwこういうのがリファクタオナニストw リファクタリング前提の開発なんて小規模開発以外はやるものじゃないね それを言うならプロトタイピングだろw なんだよリファクタリング前提てw >>746 > リファクタリング前提の開発なんて小規模開発以外はやるものじゃないね 設計に問題があるときどうしてるの? 問題があるっていうのは、最初の時点で間違っていた場合の他 機能追加などで最初の想定と変わってしまった場合 リファクタリングしないで、問題ある設計のまま 開発を続行するの? 大きい開発ほど最初に想定しなかった事態が起こるはずだけど? >>749 それをリファクタリングと言うのか ただの上流への出戻り、やり直し、糞開発じゃないの >>747 アジャイルって知ってる?オナニーくん >>750 > ただの上流への出戻り、やり直し、糞開発じゃないの 上流へ出戻りするのは良いんだが、 今のコードはどうするんだよ?捨てるのか? リファクタリングというのは今のコードをよく知られている 手順を使って安全に(バグを入れることなく)変化させていくことをいう リファクタリングの勉強をちゃんとした人なら、知っているはずだが リファクタリングしないことを選択すべき理由として 作り直したほうが速い場合っていうのがある。 作り直したほうが早い場合はリファクタリングの哲学によって作りなおすが、 コードを安全に変化させたほうが早い場合は当然リファクタリングをする。 で最初の質問に戻るが、お前コードを修正したほうが早い場合でも リファクタリングしないで、コードを捨てて作り直すって言ってんの? それとも行き当たりばったりなただの修正を行ってバグ発生させるの? 現状それなりに動いているけど 将来性を考慮しての改善するのがリファクタリングでしょ そもそもマトモに動いてないコードは問題外 > 将来性を考慮しての改善するのがリファクタリングでしょ YAGNIに反するからそれは違う。 その将来が絶対来るというのなら話は別だけど >>751 うーんw いずれにしてもコードを捨てる捨てないに関わらず設計に問題があるものをその開発中に直すことをおれの界隈ではリファクタリングとは言わないね おまえがそれをリファクタリングと言うのは自由なので好きにしてくれw >>754 俺が言ってるんじゃなくて世間一般の定義。 っていうか開発中とそうでないのが別れてる時点で お前、前時代的だしなぁ。 お前なら一日に何十回もデプロイするような ウェブアプリをどうやって変化させていくんだ? 「俺にはできません。」ですかな?w ちなみに、TDDでは最初にテストコードを書いて それに通る最小限の実装を書く、その後リファクタリングを 行うというのを繰り返して開発するものので、 http://www.atmarkit.co.jp/ait/articles/1403/05/news035.html#025 > 開発中に直すことをおれの界隈ではリファクタリングとは言わないね > 開発中に直すことをおれの界隈ではリファクタリングとは言わないね というのはもぐり、無知レベルでしかないよ それてないじゃん?w それてるっていうのなら、戻していいよ。君の手で うーんww そもそも少人数短期イテレーション開発におけるリファクタリングの話なんて始めからしてないのだがw 毎日デプロイするwebアプリ?そんな小さな話も全くしてないw おまえが数億円契約の大規模開発をやったことないのはよくわかったw >>760 大規模だからって何の自慢になると思ってるんだ? 大規模は別にどうでもいいよ どういった開発をしているのかが重要だろ。 いくら金がかかっているからって ろくでもないやつばっかり集めて人海戦術で ひたすら効率の悪い開発方法をしている? だとしたら自慢どころか恥だよね。 もっと規模とか金以外に自慢できることないの? >>753 は? while文よりfor文の方がわかりやすいね って書き直す事のどこが機能追加なの? 読みやすくしておくことも未来への投資じゃね? リファクタリングに開発規模は関係ない レガシーコードの山に頭抱えながら仕事するのも自由だし、好きにしてくれ 規模が大きい開発はクソコーダーがクソコードを量産してくるから俺様が随時コードを書き換えてやる ってのが ID:E3hlYujb の主張 こういうリファクタオナニストに好きにさせてはいけない >>764 そうじゃなくて作ってからリファクタリングなんてやってる暇があるなら先にレビューで潰すってことさ それでも設計レベルでの変更が必要にるならレビュアもゴミだったってだけのこと 本当に大規模開発やったことあるのか? 新規で作って作りっぱなしだったのか? >>767 それこそ規模の大小は関係ないわけだが 結局なにが言いたいのお前 >>769 関係ないことはない 設計レベルでの見直しをリファクタリンクを言うのであればそんなことがやすやすと可能なのは少規模開発だけ 話を戻すと開発中にそんな状況になるのを俺はリファクタリングとは言わん リファクタリングとはもっと前向きなものだ っていうことを>>750 から何度も言ってるからだけなんだがねw そもそもファクタリングとは? それをやり直すってことでしょ じゃあ逆に聞くけど設計から変えてUTのコードがそのまま使えるケースってどんなの?w テストコードの書き換えが必要な改修は開発スキームとして事前にスケジュールに組み込まれるリファクタリングとは全く別ものだろww 別にリファクタリングは個別のユニットテストに影響ないレベルとは限らないでしょ。 リファクタリング対象によってそこは取捨選択すべき。 結論から言えば概念としてのリファクタリングは否定しないが、 リファクタリングのための工数なんて実際は取れないし、 そんな余計なリソースがあるなら他の事に回した方がいい 所詮暇を持て余した学生の戯言だよ >>775 いやだから話の前提が>>749 だから選択も糞もないくやらないといけない状況でそれをリファクタリングとはいわねーって もうええわww プロジェクトの開始時にリファクタリングの見積も出してね オーバーした分はお金出せないからね だからまずファクタリングの定義からしようか それをやり直すってだけの話でしょ 機能要件を満たすため 非機能要件を満たすため オナニーするため 目的が何であろうとリファクタリングはリファクタリングですよ オブジェクト指向でシステム開発するなら、リファクタリングは必須です。 クラスの設計、インターフェースの抽出・設計といったプログラミング前に 既に必要です。 >>771 > リファクタリングとはもっと前向きなものだ ここへ来ていきなり精神論かよ やっぱり頭沸いてんだろお前w とりあえず動くものを新規で作って書き換える場合か、すでに動いているもので、修正が入りまくって汚くなったものを整理するくらいしかない。 自由にいじくりまわすのをリファクタリングとは言わない。 >>762 > while文よりfor文の方がわかりやすいね > って書き直す事のどこが機能追加なの? while文よりfor文の方がわかりやすいねとか 俺は言ってない。お前が言ったことだ。 お前は、機能追加じゃない例を自分で出して 自分で自分にツッコミを入れてるだけなんだが、 何がしたいの? >>777 > いやだから話の前提が>>749 だから選択も糞もないくやらないといけない状況でそれをリファクタリングとはいわねーって お前根本的に間違ってるんだわ。 まず先に最初の話のツッコミ漏れを補完しておくとだな >>749 で設計に問題があるときはどうするのか聞いた。 これは言い換えると「やり直し以外の選択の余地がない例」として上げたんだよ。 それなのに、>>750 で > ただの上流への出戻り、やり直し、糞開発じゃないの やり直しすればいいじゃんって、お前アスペか? やり直し以外の選択肢の余地がないことにたいして、 「やり直ししろ」ってそれは反論になってない 俺が意図してる答えだ でな、リファクタリングかどうかっていうのは、手段なの 「糞もないくやらないといけない状況」のときに、 リファクタリングを使って、修正を行うのか リファクタリングを使わずに、修正を行うかの話 ここまで言えば、お前が根本的に間違ってることが理解できるだろ? お前はリファクタリングが手段であることをわかってない。どんな状況かはどうでもいい。 修正をするときに、どうやって修正するかの話だ。 お前は、リファクタリングしないで、行き当たりばったりで修正してバグを入れ込むんだろう? 俺はリファクタリング(わかりやすく言えばリファクタリングの本に書いてあるテクニック)を使って修正するんだよ >>778 > プロジェクトの開始時にリファクタリングの見積も出してね リファクタリングが手段であることを知れば、 「リファクタリング(手段)の見積もり」がおかしい言い方だとわかるだろう。 正しく言うならば「プロジェクトの開始時に修正の見積もだしてね」だ 修正にはバグだけじゃなくて仕様の追加や間違いによる修正も含まれる。 あとは修正するしかない状況で、行き当たりばったりで修正するか リファクタリングで修正するかの違いなだけだ >>776 > リファクタリングのための工数なんて実際は取れないし、 リファクタリングのための工数が取れなくて リファクタリングを使わない修正であれば 工数が取れるっておかしくね?w >>784 ほらな きちんと書いてないと こうやって誤解されるわけだ 言いたかったのは 「現状while文で処理されていて問題ないけど このケースはfor文の方がわかりやすいから書き直そう!」 どこに機能追加される余地があんの? >>790 > どこに機能追加される余地があんの? ないよ? 誰がそこに機能追加される余地があるって 言ってるの? お前? >>753 には while とか for の話は 明らかに書いてないけど? >>791 あのさー YAGNIに反するって言ったのは誰なんですかね? 余計な機能はつけるなってことでしょ? whileからforに書き換えるのに何か機能追加されんの? YAGNIの話? 753 自分:デフォルトの名無しさん[sage] 投稿日:2017/02/08(水) 23:18:57.65 ID:EqksEKaR [3/7] > 将来性を考慮しての改善するのがリファクタリングでしょ YAGNIに反するからそれは違う。 これがどうfor やwhileと関係すんの? ほんまやね。レス辿って明らかにおかしいのを見つけたがら言ったけどそれforのレスにかすりもしなかったわ。すまん。 下手に勘違いされると困るから補足しておくと、 汚いから修正するってだけならYAGNIでやるべきではないが、 その部分を修正していたり読む必要があるならば、 いつ必要しているの?今でしょ?ってことで 今すぐ必要としていることなわけだから、 そこを修正するのはYAGNIではない 読まなきゃ汚いと思わないんだから、矛盾してるような気がするけど。 必要ないのに汚いコードを読み始める酔狂な奴が居るとしたら別だけど。 > 読まなきゃ汚いと思わないんだから いや、コードメトリクスツールなどをつかえば 読まなくても、客観的に汚いとわかる >>797 いつになったら何のことをリファクタリングと呼んでるか書いてくれるの? 汚いから直すってのもリファクタリングと呼ぶと思うけど、 汚いから直すってのは実際の開発現場じゃなかなか難しいと思うよ その汚さが原因で性能が出ないとか、機能追加できない、し辛いって明確な理由があれば別だけどね >>802 > その汚さが原因で性能が出ないとか、機能追加できない、し辛いって明確な理由があれば別だけどね だから俺は聞いたんだよ? そういうどうしても直さなければいけないときに リファクタリングで安全に修正するのか? それとも行き当たりばったりに修正してバグを入れるのか?って >>801 理解できる頭がないのに質問するなよw 何度も言ってるだろうがww リファクタリングを行うタイミングを間違ってるんだよね 俺は何らかの機能修正とかでコードをいじるときに 関連するところを少しづつなおす 大抵が数行程度で10分もかからずに終わる こまめに修正しないで、手遅れになってからやろうとするから 大規模になってしまって、別途工数が〜とかいう話になるんだよ。 手遅れになってしまったものを修正する工数がないからと 手遅れなコードのままさらにコードを追加するから さらに手遅れになっていくんだろうが >>806 多分解ってると思うけどその言い方は誤解を生むと思うぞ。 リファクタリングと機能追加は明確に分けるべきで、リファクタリングして、テスト走らせて振る舞いが変わってない事を確認してから機能追加に入るべき >>805 他人の否定はしてるけど、自分では何も言ってないよ君 >>807 うん。わかってる > リファクタリングして、テスト走らせて振る舞いが変わってない事を確認してから機能追加に入るべき どちらもあるよ。 機能追加してからリファクタリングする物の典型的な例がTDD Red/Green/Refactor 通りの順番 > Red/Green/Refactor 通りの順番 これのことか? Refactorはリファクタリングのことだよ 別の手法じゃなくて全く同じもの 1.機能追加前にテスト書く 2.追加コード書く 3.テスト 4.ダメならテストに通るまでコードいじる もしかしてこれもリファクタリング扱いしてるの? >>815 それはRed→Greenのところでしょ… 最近、特定のフラグ変数に関するif文の山をswitch構文に清書し直したんだけど、これってリファクタリング? >>816 それさ、リファクタリングのいち定義であってリファクタリングではないから。 >>817 そのif文が変ならな。まともなif文なら書き換える必要がない。 >>817 ただswitch文にすると仕様変更時にswitch文では対応できなくなる可能性があるので逆かもしれない。 >>817 確かにswitchでかけるならばifよりswitchの方が少しだけ見やすくなるけど、 大抵はリファクタリングにはならないよ 巨大なswitchもリファクタリングすべき対象となる 何がダメなのかというと比較の回数がifのときと変わってないから。 比較が多い=複雑なので、これは単なる書き方の違いでしかなくて リファクタリングとまではいかない。重要なのは比較回数 じゃあどうすべきかというと、一番簡単な方法は 関数テーブル(ルックアップテーブル)を使う方法 大量のswitchでの比較が条件が揃えば0個にまで減る >>818 > それさ、リファクタリングのいち定義であって > Red/Green/Refactor 通りの順番 がリファクタリングの定義に見えるんだ・・・ ここにはどこにもリファクタリングの定義なんてものは 書いてないんだが >>816 が言ってるのは、Red→Greenでやる内容は リファクタリングじゃないよって言ってるだけでしょ 俺からも補足するが、リファクタリングは 動いているコードを、動いているコードに置き換えることだよ。 修正前と修正後のどちらかが動いていなければ それはリファクタリングではない * Green 1.機能追加前にテスト書く * Red 2.追加コード書く 3.テスト 4.ダメならテストに通るまでコードいじる 5.テストに通った。やったー完成だ! ←ふざけんじゃないよ。なんだこのコピペだらけで無駄がばかりのクソコードは * Green 6.リファクタリングする 7. 読みやすくなりました。←このコードならレビューする気になる。シンプルあとで読んだ人も理解しやすいだろう 8. 完成、1に戻る 現実にはこの5. テストに通っただけの状態で 完成としてしまうやつが多いんだよな。 そういうコードで許される環境っていうのは コードレビューが行われていない。 コードを見ずにテストに通ればOKとしてしまう環境 そして向かうはデスマーチw 駄目だこりゃ。なんでそういう手順がリファクタリングなのか? Refactorとリファクタリングが同じ意味の言葉だってのが伝わってないのかも知れないな あ、はい間違えました > 6.リファクタリングする これじゃ リファクタリンギング ですねw このスレってそもそも特定のリファクタリング作業のスレッドか。話がかみ合わないわけだ。 誰が特定のリファクタリング作業の話をしてるんだ? 誰がはどうでもいいや「特定の」ってどれのことだよ? TDDの例出したからTDDに限定した話だって勘違いしてるんでしょ >>829 「特定の」がなにか言うだけだよ。 お前がちゃんと考えて発言しているなら 簡単な質問なはずだが? もっとも俺はお前が何も考えてないってことを あぶり出すために「特定の」が何か聞いたんだけどなw 定義から定まってないからなリファクタリングって いや、実在するのか? 殆どの用語は定義なんか定まってないよ 数学でさえ、ある用語に対して数学ではこういう定義で 使いましょうと決めているだけ ソースを組んだときと今とでチンコのポジションを若干変更した これがリファクタリングである 特定の統合開発環境のリファクタリング機能をリファクタリングだと言ってるやつはいなくなったなw 俺の中では変数名の変更=リファクタリング Visual Studioの機能名がそうだったから 俺の中では、マーチン ファウラーのリファクタリング本(古い方)に のっているのがリファクタリング 変数名の変更ももちろんのってる 後はそのリファクタリングをどれだけ簡単に 正確に行えるかの違い。 ローカルスコープ程度で済むものなら良いけど スコープが広い部分のリファクタリングは手動でやるのは大変 それを自動的に間違いなく行える、静的型付け言語+IDEの力は偉大 あるスコープの中で外部から見た仕様を変えずに内部の設計を変えるのがリファクタリング 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 K2FKH ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる