リファクタリングがしやすいのは、静的型付け言語
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/06/10(日) 19:41:22.34http://www.ibm.com/developerworks/jp/opensource/library/os-eclipse-refactoring/
まあ、まずこれを読みましょう。
Eclipseが凄いだけ? 半分間違っています。
静的型付け言語が凄いから、Eclipseもここまで便利な機能を搭載できるのです。
いくらEclipseでも、動的型付け言語に同レベルの機能は搭載できません。
実際されてません。
0153デフォルトの名無しさん
2012/08/05(日) 12:28:39.50リファクタリングして解決
0154デフォルトの名無しさん
2012/08/05(日) 12:29:54.13リファクタリングの話をすれば、
concatStringとconcatArrayを定義していたとしても、
本当にconcatStringは自分だけが使っているものか?
という判断ができないから置換が難しいってことだな。
concatという名前をつけるのが間違っていたとして
同じようにconcatStringという間違った名前をつけているものが
他にもあるかもしれない。
どうやってもその保証ができない。
0155デフォルトの名無しさん
2012/08/05(日) 12:30:26.132つのライブラリーでcomponentsJoinedByStringが定義されました
どう別々の仕様にできる?
0156デフォルトの名無しさん
2012/08/05(日) 12:30:40.85引数が2つの時はどうすんの?wwww
0157デフォルトの名無しさん
2012/08/05(日) 12:32:41.39名前空間とクラス名が違っていれば、
メソッド名が同じでも別々の仕様だろ?
静的言語なら、別々の仕様にできる以前に、
最初から別々の仕様になってる。
0158デフォルトの名無しさん
2012/08/05(日) 12:34:31.33どうしても同じ名前はできてしまうってことだろ?
0159デフォルトの名無しさん
2012/08/05(日) 12:35:12.99全部Int型ならaddIntだろうし、違うなら[writeBytes:array, sizeInt:10 ]になるだろ
write$Byte[],intとなってんのを考えればすぐ判るんじゃない
0160デフォルトの名無しさん
2012/08/05(日) 12:37:54.74全部Int型ならaddIntだろうし、
Int型とString型とInt型だったら
addIntStringInt ってこと?
動的言語って欠陥あるなw
0161デフォルトの名無しさん
2012/08/05(日) 12:38:14.82クラスの実装はともかくとしてインターフェース側の仕様は統一できるように
しないといかんだろ
あとたらればじゃなくcomponentsJoinedByStringをどう別の仕様にするか具体的に書いてみて
0162デフォルトの名無しさん
2012/08/05(日) 12:40:04.68静的型付でも同じでしょ
正しいかどうか結局考えなきゃいけない
0163デフォルトの名無しさん
2012/08/05(日) 12:40:11.05どこに?
人には具体的にという割には、自分は全然具体的に書かないんだな。
>>145
「冗長」の意味わかってる?
Object.addObject なら、Object.add だけでいいだろ、追加するだけなんだから。
>>152
違うよ、計算機がやるかプログラマがやるか話。
プログラマは楽しようよ。
0164デフォルトの名無しさん
2012/08/05(日) 12:41:49.92Cとかメンバー関数の存在しない言語で大規模開発した経験とか無いと辛いだろうね
0165デフォルトの名無しさん
2012/08/05(日) 12:41:58.81いいや、静的に正しいかどうかは「計算機」が決められるから、プログラマは考える必要が無い。
0166デフォルトの名無しさん
2012/08/05(日) 12:42:30.85じゃあ、条件をはっきり提示しろ。
Aというクラスに、componentsJoinedByString があった。戻り値は数値だ
Bというクラスに、componentsJoinedByString があった。戻り値は配列だ。
これらは名前が同じだが、クラス名が違うので当然仕様は別だ。
同じにしたいなら、同じインターフェースを継承するだけのこと。
ここまではいいか?
0167デフォルトの名無しさん
2012/08/05(日) 12:43:02.83>>148に書いてあるし同じ内容がいままでずっと出てたろ
脳内フィルターもいい加減にしろよ
0168デフォルトの名無しさん
2012/08/05(日) 12:43:36.04昔話したいなら「昔のPC」板にでも行けよ。
て言うか、そんなもの持ち出さないといけなくなるほど、追い詰められたのか?(w
0169デフォルトの名無しさん
2012/08/05(日) 12:44:50.22戻り値ない名前なのに言語のコーディング規約違反じゃん
0170デフォルトの名無しさん
2012/08/05(日) 12:45:14.11> Cとかメンバー関数の存在しない言語で大規模開発した経験とか無いと辛いだろうね
したことがあればわかると思うけど、
たとえばGTKライブラリ。
gtk_window_new みたいに、
頭に、gtkというプリフィックスをつける。
当たり前だけど、addIntみたいに、型名をメソッド名に入れたりはしない。
0171デフォルトの名無しさん
2012/08/05(日) 12:45:34.90>>148
>> concatって同じ名前をつけるのが間違ってるって
これがフィルターだって言うの。
静的側から見たら、全然間違ってない。
0172デフォルトの名無しさん
2012/08/05(日) 12:46:04.33どこに戻り値ないと定義されているんだ?
0173デフォルトの名無しさん
2012/08/05(日) 12:46:28.23クラス名は名前空間省略できるけど重複したら限定名使って一意の名前にしないとダメっすねぇ〜
0174デフォルトの名無しさん
2012/08/05(日) 12:47:16.04だから一意の名前になっているから大丈夫ですよね?
0175デフォルトの名無しさん
2012/08/05(日) 12:48:21.25動的型のリファクタリングの話してる時におかしいだろうが
0176デフォルトの名無しさん
2012/08/05(日) 12:49:01.48戻り値の型を書いてないから
0177デフォルトの名無しさん
2012/08/05(日) 12:49:20.77Array.concat ・・・ 間違い
Array.concatArray ・・・ 間違い
Array.array_concat ・・・間違い
Array.array_concatArray ・・・正解
ってことか。
あ、動的言語の場合ね。
0178デフォルトの名無しさん
2012/08/05(日) 12:51:53.01一意になるように管理してるって話だろ?
0179デフォルトの名無しさん
2012/08/05(日) 12:55:31.84var es = doc.getElementsByName(name)
こんなのだよ。名前を使って複数のエレメントを
返すってことが明確になっている。
これが静的言語ならこうなる。
Element[] es = doc.get(name)
getという短いメソッド名でありながら
代入先の変数の型から、getが何を返すのかわかるし、
引数の型を見てオーバーロードできる。
もちろん、型情報が存在するから間違ったコードは自動的に検出できる。
0180デフォルトの名無しさん
2012/08/05(日) 12:56:52.88動的と静的の比較なんだが、理解できてないのか?
0181デフォルトの名無しさん
2012/08/05(日) 12:59:38.78別のパラダイムなんだから当然でしょ。
静的型のメンバー関数な書き方から抜け出せないなら静的型を使う。
0182デフォルトの名無しさん
2012/08/05(日) 13:02:23.33リファクタリングの仕方の問題なんだから
それぞれの特徴に合わせた話をしないと行けないだろ
静的型付言語に動的型付言語のリファクタリングを強要してリファクタリングしづらいとか
動的型付言語に静的型付言語のリファクタリングを強要してリファクタリングしづらいとか
言ってもそりゃしづらいねで終わるわ
0183デフォルトの名無しさん
2012/08/05(日) 13:04:14.45リファクタリングというのは、間違ったコードを直すという面も大きい、
つまり、間違えることが前提になっているから
間違いしなければ大丈夫って発想じゃダメなんだよ。
そこわかってる?
0184デフォルトの名無しさん
2012/08/05(日) 13:04:45.25最初はフォームチェックぐらいしか想定してなかったから
Java風を取り入れた大規模に向かない名前が多かったけど
Javascriptもこういう名前の付け方増えてきたね
0185デフォルトの名無しさん
2012/08/05(日) 13:05:17.16汎用的なメソッドの名前にするか
そのクラス専用のメソッド名にするかなんて
決められるわけ無いよな。
未来のコトはどうなるかなんてわからんのだし。
0186デフォルトの名無しさん
2012/08/05(日) 13:05:54.64それを言い出したら、どっちもどっちでそれこそ終わりだろ。
すくなくとも、名前の被りをプログラマが気にしないといけない動的と、
計算機が管理してくれる静的を比べたら、静的のほうがマシだろ。
特に大規模を経験したことあれば、「人が管理できる」なんていうのは
幻想だとわかるはず。
0187デフォルトの名無しさん
2012/08/05(日) 13:06:35.62>>148の後半の話だな
0188デフォルトの名無しさん
2012/08/05(日) 13:07:28.52ミスしているかもしれないしなw
ミスがあるのがわかったとしても、
ミスがないことを保証してくれないのだから
どんだけチェックしても不安は拭えない。
あ、動的言語の話。
0189デフォルトの名無しさん
2012/08/05(日) 13:08:31.55OSXは幻想か?
WindowsのWM_XXは幻想か?
派遣や短期雇用だらけとか管理体制が悪いだけじゃないの
0190デフォルトの名無しさん
2012/08/05(日) 13:08:56.22「名前をちゃんと分けておかなければならないだろ!」
に対する反論は
「人間誰でもミスはするもんだろ!」
で終わりってことだな。
0191デフォルトの名無しさん
2012/08/05(日) 13:10:06.96プロジェクトで使っている
メソッド名一覧を作れって話?
0192デフォルトの名無しさん
2012/08/05(日) 13:10:36.28>>166の話も中途半端に終わったがそのミスってなんだ?
間違いならリファクタリングで直すだろ
0193デフォルトの名無しさん
2012/08/05(日) 13:11:25.70規約とレビューとリファクタリング
0194デフォルトの名無しさん
2012/08/05(日) 13:11:33.40その直す手間が
動的言語では大変だって話。
話ちゃんと理解してる?
なんで、直すだろ。で終わるんだよ。
0195デフォルトの名無しさん
2012/08/05(日) 13:12:05.01それをやりやすいのは静的型付け言語です。
0196デフォルトの名無しさん
2012/08/05(日) 13:13:51.89>>121に出てた話でしょ。
0197デフォルトの名無しさん
2012/08/05(日) 13:15:48.46・名前のリファクタリングが難しい→>>121
0198デフォルトの名無しさん
2012/08/05(日) 13:15:59.70この文字列をgrepで検索して使用している所が多く見つかったとする。
そしてconcatArrayの定義も複数見つかった。
なぜか複数のクラスで定義されている?
のちにこれは間違いだったとわかるのだが、
さて動的型付け言語で、この間違いを見つけるのにどれだけ時間がかかるだろうか。
ちなみに、静的型付け言語では、特定のクラスのconcatArrayだけを
検索できるので、間違いを見つけるのも修正するのも簡単です。
0199デフォルトの名無しさん
2012/08/05(日) 13:18:50.10Strings.appendをStrings.appendとArrays.appendに分離する
Strings.appendをStrings.appendとStrings.concatに分離する
appendStringをappendStringとappendArrayに分離する
appendStringをappendStringとconcatStringに分離する
問題はここから
全ソースの中から、すでに使用されているappendを調べあげ、
それがStringsに属するものかArraysに属するものか判断しないといけない。
data.append これをどちらに直せばいいのか
コードを読まないと判断できない。
0200デフォルトの名無しさん
2012/08/05(日) 13:20:34.67愚か者が多いってことだな。
使っている場所すべてを直さないといけないのに。
0201デフォルトの名無しさん
2012/08/05(日) 13:22:19.91>>49-56に出てた話だよね
動的型付なら複数異なる実装が間違って同じインターフェースを実装してんのと同じ話ってね
同じインタフェースを継承してる箇所は全部チェックするけど静的型だろうが
動的型だろうが手間は変わらない
0202201
2012/08/05(日) 13:24:21.42動的型付なら全て同じインターフェースを実装してるわけで
静的型付言語で言うなら複数異なる実装が間違って同じインターフェースを実装してんのと同じ話
0203デフォルトの名無しさん
2012/08/05(日) 13:24:23.96なんの手間かわかってないでしょw
直す手間がかかるのはどう考えても動的言語。
理由は>>198-199で述べられてる通り。
0204デフォルトの名無しさん
2012/08/05(日) 13:25:01.36同じインタフェースを継承してる箇所は全部チェックするけど静的型だと
インターフェースのメソッド名を選んで、検索するだけで
すぐに見つかるよねw
0205デフォルトの名無しさん
2012/08/05(日) 13:27:42.10> 静的型付言語で言うなら複数異なる実装が間違って同じインターフェースを実装してんのと同じ話
OK。間違ったとしよう。
静的型付け言語なら、インターフェースを実装する前に、
「○○インターフェースを実装します」と書いてあるはずだ。
class ×× implements ○○ みたいに。
ならそれをclass ×× implements △△ に変更すれば良い。
あとは、どのメソッドがおかしいかをコンピュータが教えてくれる。
静的型付け言語は、リファクタリングしやすい。
0206デフォルトの名無しさん
2012/08/05(日) 13:28:55.37data.appendはappendStringとappendArrayに分離する
Strings.appendをStrings.appendとArrays.appendに分離するのと
どう手間が違うんだい?Strings.appendもArrays.appendにしていいか全て調べないと行けない
>>121以前の話に戻りたいの?
0207デフォルトの名無しさん
2012/08/05(日) 13:29:11.00間違っているものを、直すまでが
リファクタリングです。
その直すまでの手間の話ですよ。
なんでリファクタリングの話してるのに
間違いを見つけただけで話を終わらせるの?
0208デフォルトの名無しさん
2012/08/05(日) 13:29:48.71の、問題はここから が本題なのに、
なんでそこ無視するんだよw
問題はここから
全ソースの中から、すでに使用されているappendを調べあげ、
それがStringsに属するものかArraysに属するものか判断しないといけない。
data.append これをどちらに直せばいいのか
コードを読まないと判断できない。
0209デフォルトの名無しさん
2012/08/05(日) 13:31:03.43> data.appendはappendStringとappendArrayに分離する
お前アホw
data.appendは定義じゃねーぞ。
func foo(data) {
data.appned
}
みたいな話だ。
分離するってなんの話をしてるんだよw
0210デフォルトの名無しさん
2012/08/05(日) 13:33:11.97198 名前:デフォルトの名無しさん[] 投稿日:2012/08/05(日) 13:15:59.70
たとえば、concatArrayとうメソッドがあったとする。
この文字列をgrepで検索して使用している所が多く見つかったとする。
そしてconcatArrayの定義も複数見つかった。
なぜか複数のクラスで定義されている?
のちにこれは間違いだったとわかるのだが、
さて動的型付け言語で、この間違いを見つけるのにどれだけ時間がかかるだろうか。
ちなみに、静的型付け言語では、特定のクラスのconcatArrayだけを
検索できるので、間違いを見つけるのも修正するのも簡単です。
0211デフォルトの名無しさん
2012/08/05(日) 13:34:15.60分離するのが大変。
0212デフォルトの名無しさん
2012/08/05(日) 13:34:20.69静的型でも読まなきゃ判断できないって書いたけど?
Arraysは置き換えてないんだから静的型付でも自動で調べようがないじゃん
0213デフォルトの名無しさん
2012/08/05(日) 13:34:48.49え? 調べようがあるけど?
0214デフォルトの名無しさん
2012/08/05(日) 13:36:01.60---before---
func foo(data) {
data.appned
}
func bar(data) {
data.appned
}
---after---
func foo(data) {
data.appnedString
}
func bar(data) {
data.appnedArray
}
0215デフォルトの名無しさん
2012/08/05(日) 13:36:32.44静的に決まってるんだから、自動で判断できるだろ。
もしかして、コンパイラを使う言語で
メソッド名を変更して、コンパイルエラーが起きた所を
直すってことやったことない?
コンパイラ使った開発してる人は、
普通にやったことあると思うんだどなぁ。
0216デフォルトの名無しさん
2012/08/05(日) 13:37:25.53じゃコード書いて、ここに自動チェックが入るとか示してみてよ
このままじゃ堂々巡りになりそう
0217デフォルトの名無しさん
2012/08/05(日) 13:37:31.19---before---
func foo(data) {
data.appned
}
func bar(data) {
data.appned
}
■ ここにかかる時間に着目しましょうwww ■
---after---
func foo(data) {
data.appnedString
}
func bar(data) {
data.appnedArray
}
0218デフォルトの名無しさん
2012/08/05(日) 13:39:41.67静的言語であればこうなってるはず
---before---
func foo(String data) {
data.appned
}
func bar(Array data) {
data.appned
}
■ ここにかかる時間に着目しましょうwww ■
・Stringクラスのappedを変更。
・Arrayクラスのappedを変更。
作業は本当にこれだけこれだけ
↓これはコンピュータが全部自動でやってくれる
---after---
func foo(String data) {
data.appnedString
}
func bar(Array data) {
data.appnedArray
}
0219デフォルトの名無しさん
2012/08/05(日) 13:40:13.85func foo(Arrays data) {
data.appned
}
func bar(Arrays data) {
data.appned
}
■ ここにかかる時間に着目しましょうwww ■
---after---
func foo(Strings data) {
data.appned
}
func bar(Arrays data) {
data.appned
}
0220デフォルトの名無しさん
2012/08/05(日) 13:41:15.52何が言いたいのか全くわからないw
0221デフォルトの名無しさん
2012/08/05(日) 13:41:28.09静的型だとそれやっても意味ないだろ
静的型だと>>219になる
0222デフォルトの名無しさん
2012/08/05(日) 13:42:36.37>>218の例では静的型付け言語のほうがやりやすい。
総合点は・・・静的型付け言語の勝ちですね
0223デフォルトの名無しさん
2012/08/05(日) 13:42:51.42動的型のインターフェースと静的型のインターフェースの関係がわからないんだねw
0224デフォルトの名無しさん
2012/08/05(日) 13:43:27.82意味がないの理由は?
0225デフォルトの名無しさん
2012/08/05(日) 13:44:26.12静的型付けならインターフェースの識別はクラス名になる
0227デフォルトの名無しさん
2012/08/05(日) 13:45:09.77>>225
0228デフォルトの名無しさん
2012/08/05(日) 13:50:53.21そんなことはどうでもよくて
変数に型情報がついているか(型付け)か
どうかが重要だよ。
静的型付け、動的型付けの話をしているのだから。
変数に型情報がついているから
その変数の型の宣言(定義)を変えると、
すべての変数を追跡可能になる。
つまり、obj.foo() のfooのを変更する、すなわちobjの型MyObjを
変更すると型情報から文字列比較ではなく意味的に関連がある
コードを見つけ出すことが出来る。
0229デフォルトの名無しさん
2012/08/05(日) 13:52:39.511つのインターフェース名動的型付けと静的型付で分離して比較する問題で
>>218では、静的型ではインタフェース名に当たらないメソッド名を変更してるからな
func foo(String data) {
data.appned
}
func bar(Array data) {
data.appned
}
動的型付げんごなら↑状態は
そもそも↓の状態だ
func foo(data) {
data.appnedString
}
func bar(data) {
data.appnedArray
}
0230デフォルトの名無しさん
2012/08/05(日) 13:53:13.72それじゃ、違いはないと勘違いするのもわかるねw
0231デフォルトの名無しさん
2012/08/05(日) 13:55:06.38どうでも良くはない
リファクタリングの比較にならんだろ
0232デフォルトの名無しさん
2012/08/05(日) 13:55:11.29話を戻すな。先に進めろ馬鹿。
動的型付け言語では、appendという名前が悪いって話だろ。
で、appendStringという名前に変えたいんだよ。
その名前を変える時の手間の話だ。
お前、なんもわかっとらんじゃないか。
0233デフォルトの名無しさん
2012/08/05(日) 13:56:57.46どうでもいいのは
> 動的型付ならインターフェースの識別はメソッド名に付く
> 静的型付けならインターフェースの識別はクラス名になる
これのこと。
リファクタリングに差があるのは、型付け。
つまり、変数名の型。
変数に入っているオブジェクトの識別は
動的型付け言語だと実行時に行われる。
だから実行前に行うリファクタリングと相性が悪い。
0234デフォルトの名無しさん
2012/08/05(日) 13:57:37.14正確にはこんな感じか
func foo(StringAppendable data) {
data.appned
}
func bar(ArrayAppendable data) {
data.appned
}
--------------------------
func foo(data) {
data.appnedString
}
func bar(data) {
data.appnedArray
}
0235デフォルトの名無しさん
2012/08/05(日) 13:58:52.11リファクタリングは定義を直せば終わりだって思ってる
愚か者が多いってことだな。
使っている場所すべてを直さないといけないのに。
0236デフォルトの名無しさん
2012/08/05(日) 14:00:01.00何が違う?静的型付のインターフェース名を分割するのと
動的型付のメソッド名を分割するのは同義だろ。
0237デフォルトの名無しさん
2012/08/05(日) 14:03:04.37data.appnedString
}
func bar(Array data) {
data.appnedArray
}
動的型付にこんなふうにインターフェース情報に更にインターフェース情報を
追加しなきゃいけないってな対になる概念はないからな
静的型付言語だけでよろしくやってくれよとしか言い様がないな
0238デフォルトの名無しさん
2012/08/05(日) 14:03:16.39だから、その作業を行う手間が違うって話だろ。
何度言えば理解できる?
0239デフォルトの名無しさん
2012/08/05(日) 14:06:15.73>>229 でどう変わる?
>>237 みたいなことを動的型言語でしたいならそりゃ手間も掛るんじゃね知らんけど
0240デフォルトの名無しさん
2012/08/05(日) 14:08:43.41お前卑怯だな。
他に大きく変わる例をわざと無視して、
変わらない例だけを持ちだしてきて
変わらないという結論にしようとしてるだろ
見え見えだ。
>>219の例では変更する手間は同じ
>>218の例では静的型付け言語のほうがやりやすい。
総合点は・・・静的型付け言語の勝ちですね
0241デフォルトの名無しさん
2012/08/05(日) 14:10:19.38>>218は静的型付言語の勝ちでいいんじゃない?
動的型付言語には対応するものが無いんだから不戦勝だよ
0242デフォルトの名無しさん
2012/08/05(日) 14:11:00.73コンパイラ技術を使って名前ではなく
確実に同じメソッドであると判明したものが
自動的に書き換わるという体験をしたことがないだろう?
ソースコードをテキストエディタで
ちまちま書き換えるだけじゃないんだよ。
0243デフォルトの名無しさん
2012/08/05(日) 14:11:07.740244デフォルトの名無しさん
2012/08/05(日) 14:12:23.64なんかアホっぽいよぉ・・・
0245デフォルトの名無しさん
2012/08/05(日) 14:12:37.47前提条件で、appendを
appendStringとappendArrayに書き換えるという話。
なぜなら、動的型付け言語にとっては、appendという名前は
おかしいから。
これを忘れてないか?
0246デフォルトの名無しさん
2012/08/05(日) 14:13:56.81アホだから何度言っても無理だよ
0247デフォルトの名無しさん
2012/08/05(日) 14:15:57.05動的型付言語の同じメソッドは、全てインターフェースを持ってるって事がすぐ頭から飛ぶよね
0248デフォルトの名無しさん
2012/08/05(日) 14:24:53.53例えばstringWithStringを検索したら
stringWithStringメソッドを実装したオブジェクト全ての呼び出しと考えられるけど。
あとXCodeでObjective-Cのリファクタリング機能使ってみたら?
0250デフォルトの名無しさん
2012/08/05(日) 15:03:16.77型云々インタフェース云々の事情を無視して
文字通りappendにStringとArrayを付けたいだけ
なら静的型付言語の方が楽なんじゃないかな
リファクタリングじゃなくて名前変えてるだけに見えるけど
0251デフォルトの名無しさん
2012/08/05(日) 15:35:55.25こんなにアホになるんだという見本だな。
ていうか、お前等暇人だな。こんなアホ相手に延々議論しちゃって。
0252デフォルトの名無しさん
2012/08/05(日) 16:58:48.78>Object.addObjectって冗長すぎだろwww
この辺のレスみると頭の硬さが滲み出てて面白いよなぁ
実際呼び出すときArray.addObjectかもしれないし
List.addObjectかもしれない。夏の匂いがする
■ このスレッドは過去ログ倉庫に格納されています