質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
リファクタリング

リファクタリングとはコードの本体を再構築するための手法であり、外見を変更せずに内部構造を変更/改善させることを指します。

Q&A

解決済

1回答

1100閲覧

リファクタリングの判断基準にメソッドの呼び出し階層の深さはあるか知りたい

k499778

総合スコア599

リファクタリング

リファクタリングとはコードの本体を再構築するための手法であり、外見を変更せずに内部構造を変更/改善させることを指します。

0グッド

1クリップ

投稿2021/10/02 19:57

前提・実現したいこと

元々Java開発をしていましたが、現在Rails開発に携わっています。

メソッド階層が多いと個人的には読みづらいと思うのですが、リファクタリングの判断基準にそのような視点はありますでしょうか?

例えば以下のコードがあるとき

ruby

1 def delete_foo(x, y) 2 (1..5).each do |i| 3 { 4 "hoge_id_#{i}": x, 5 "hoge_value_#{i}": y, 6 } 7 end 8 end 9 end 10 11 def update_foo(x, y, z) 12 (1..5).each do |i| 13 if z == hoge.public_send("hoge_#{i}_id") 14 { 15 "hoge_id_#{i}": x, 16 "hoge_value_#{i}": y, 17 } 18 end 19 end 20 end 21 22 def create_foo(x, y, z) 23 (1..5).each do |i| 24 unless z.include?(i) 25 { 26 "hoge_id_#{i}": x, 27 "hoge_value_#{i}": y, 28 } 29 end 30 end 31 end

この部分をまとめられるので

ruby

1 { 2 "hoge_id_#{i}": x, 3 "hoge_value_#{i}": y, 4 }

以下のように修正すると、メソッドの呼び出し階層が深くなり、読みづらい印象を受けました。(まだ下のコードはシンプルなのでそこまで感じないかもですが、)

ruby

1 def delete_foo(x, y) 2 (1..5).each do |i| 3 params 4 end 5 end 6 end 7 8 def update_foo(x, y, z) 9 (1..5).each do |i| 10 if z == hoge.public_send("hoge_#{i}_id") 11 params 12 end 13 end 14 end 15 16 def create_foo(x, y, z) 17 (1..5).each do |i| 18 unless z.include?(i) 19 params 20 end 21 end 22 end 23 24 def params 25 { 26 "hoge_id_#{i}": x, 27 "hoge_value_#{i}": y, 28 } 29 end

試したこと

・「リファクタリング メソッド 呼び出し階層 深さ」などで調べる

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2021/10/02 22:47 編集

読みにくくなったようには見えませんが、なぜそう思ったのでしょうか? 逆に params という定義が一か所に収まったおかげで、三か所すべてで間違い探しをせずに済んで読みやすくなりました。 (引数を正しく使い、まともに動くものができたと仮定しての話です) 強いて言うなら、params という名前が問題かもしれません。 hoge_ なんとかをまとめた無意味なデータなので、この例ではまともな命名はできませんが、これがちゃんとしたデータであれば、person や commodity など読みやすい命名ができると思います。
k499778

2021/10/03 01:05

ご返答ありがとうございます! たしかに上記コードですと、メソッド化した方がむしろ読みやすいと思うのもわかる気がします。 実際に自分が修正しているコードは、もう少し複雑で、delete_fooなどを呼び出す処理自体も複雑だったりして、 呼び出したメソッドから、さらに呼び出されていると直感的にわかりづらい印象を受けました。 たしかに客観的に考えるとメソッド化した方が良さそうな気はしたのですが、主観は微妙かなと思い、決め手となる判断基準を調べておりました。
k499778

2021/10/03 01:05

たしかにメソッド名は大事ですよね
guest

回答1

0

ベストアンサー

リファクタリングの判断基準にそのような視点はありますでしょうか?

新装版 リファクタリングの第3章「コードの不吉な臭い」で「リファクタリングの必要性を示す不吉な兆候について説明」されています。

重複したコード、長すぎるメソッドなどが挙げられていますが、呼び出し階層の深さはリファクタリングの判断基準とはされていません。

私としては、開発者がリファクタリングした方がよいと感じるなら、すればいいと思います。

本章で、リファクタリングがいつ要求されるかについての正確な基準を設けるつもりはありません。経験で磨かれた人間の直感には、メトリックスをいくら集めてもかなわないものです。

投稿2021/10/02 21:29

編集2021/10/02 22:17
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k499778

2021/10/03 01:06

ありがとうございます!判断基準には含まれていないことを知れて良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問