Open6

呼び出し側の関数の引数を一気に置換する方法を考える

simiraaaasimiraaaa

対象言語は、js, go で考える。
ちなみにjsは、そんなに困ることはないがgoで困ることが多い。


function func1(a, b) {
  return a + b;
}

この関数を変更してこうなったとき↓


function func1(a, a2, b) {
  return a + b + a2;
}

呼び出し箇所を一気に変更したい( 100ファイル1000箇所あるみたいな状況でも )

func1(1, 2);

func1(1, 2, 3);

と一気に置き換える方法はないか?

simiraaaasimiraaaa

これぐらいならシンプルな置換でどうにかなる

func1(1, 2);

↓こうなるとシンプルな置換ではできない

func1(1, getSomething(), 2)
simiraaaasimiraaaa

設計的に問題なければ、関数を追加で用意して既存コードを変更しないこともできる

  • func1(a, b) { return func2(a, 2, c) }
  • func2(a, b, c) { return a + b + c }

とはいえ、きれいなコードを保ちたい場合は、こういうことを避けたいというケースも多いと思う

simiraaaasimiraaaa

じゃあ、呼び出し箇所たどりながら気合で置き換えたらどれぐらいかかるのかというと
一箇所置き換えるのに5秒かかるとすると1000箇所ある場合は5000秒(83分)なので、置換できないところは、気合で頑張ればいいのでは?という気もしてくる。
しかも8割ぐらいは置換できることが多いのでなおさらそう思う。

それでも、これをプログラミングしてるとは思いたくないので、いい感じにしたい。

simiraaaasimiraaaa

完全に正確な置換をするには今のところASTで解析して、置換するしか思いつかない。
ASTの処理の手間を少しでも省くために、対象関数名を REPLACE_TARGET__0001 とかにしとくと楽かも
わざわざ言語ごとに、ASTの処理を実装するのが面倒。
軌道に乗るまで手動でやったほうが早いし、今後人生でこの作業にかかる時間の合計よりAST実装の時間のほうが掛かりそう。

simiraaaasimiraaaa

でも、AST力を上げておくと、いろんなことに役に立ちそう
別にやって損ではないのでこのアプローチは、どちらかといえば有りより