fuga_else
@fuga_else (fuga)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

何度も同じデータ元から値をgetする処理は、変数にしまったほうが良いのでしょうか?

解決したいこと

Javaでリファクタリングを行っています。
何度も同じデータ元から値をgetしてくるような実装に対して、見にくく感じるので変数にしまったほうが良いのかと思いました。
ただ、デメリットもあると思い、どちらがベターな実装方法なのかを知りたいです。
ご意見ください。

リファクタリング前のソース(例)

for (DataRow row : datalist) {
 methodA(row.get("name") , row.get("id"));
 methodB(row.get("name"));
 if(row.get("name").equals("hoge")){
  continue;
 }
 methodC(row.get("name"));
}

リファクタリング後のソース(例)

for (DataRow row : datalist) {
 String name = row.get("name");
 String id= row.get("id");

 methodA(name, id);
 methodB(name);
 if(row.get(name).equals("hoge")){
  continue;
 }
 methodC(name);
}

row.get("id")は、一度しか使わないからわざわざしなくてもいい?
同じものは同じように見せるべきだから、したほうが良い?

メリット

  • 変数にしまったあとのソースの見栄えが良い

デメリット

  • 行が増える
  • メモリを無駄に使っている?
  • ローカル変数が、同一クラス内の他の変数名とかぶることがある。
    • これは、かぶらない名前をつければいいのですが…
1

私の結論としては、このくらいなら変更しなくても問題ないと思います。
変更してもいいですが、いったんこのままにしておき、触る機会があったときに改めて検討するのでも良さそうです。

私が検討する時のポイントとしては次のような項目になります。

  • 分かりにくい(取得処理の文字数、行数が多いなど)
  • 取得するコストが重い(WebAPIやストレージから取得するなど)
  • 説明が不足している(説明変数)

行が増える
ローカル変数が、同一クラス内の他の変数名とかぶることがある。

別のメソッドにすることを検討します。

for (DataRow row : datalist) {
    example(row);
}

メモリを無駄に使っている?

よほど制約のある状況でなければ変数1つ2つで困ることは無いと思うので、
分かりやすさを優先します。

あと、もしかしたら別の部分のリファクタリングを検討するかもしれません。

row.get("id"); // => row.getId()
row.get("name"); // => row.getName()
2Like

回答ありがとうございます!

リファクタリング検討するポイントなど、自分の中でとてもふわっとしていたので
基準を教えていただけてとても参考になります!

とりあえず、今回はそのままにしておいて、影響範囲が広がってきたタイミングで再検討しようと思います!

0Like

Your answer might help someone💌