トップページ⇒tech
1001コメント370KB

リファクタリングがしやすいのは、静的型付け言語

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/06/10(日) 19:41:22.34
Eclipse JDT のリファクタリング機能を探る
http://www.ibm.com/developerworks/jp/opensource/library/os-eclipse-refactoring/

まあ、まずこれを読みましょう。

Eclipseが凄いだけ? 半分間違っています。
静的型付け言語が凄いから、Eclipseもここまで便利な機能を搭載できるのです。

いくらEclipseでも、動的型付け言語に同レベルの機能は搭載できません。
実際されてません。
0153デフォルトの名無しさん2012/08/05(日) 12:28:39.50
>>151
リファクタリングして解決
0154デフォルトの名無しさん2012/08/05(日) 12:29:54.13
>>150
リファクタリングの話をすれば、
concatStringとconcatArrayを定義していたとしても、
本当にconcatStringは自分だけが使っているものか?
という判断ができないから置換が難しいってことだな。

concatという名前をつけるのが間違っていたとして
同じようにconcatStringという間違った名前をつけているものが
他にもあるかもしれない。

どうやってもその保証ができない。
0155デフォルトの名無しさん2012/08/05(日) 12:30:26.13
>>151
2つのライブラリーでcomponentsJoinedByStringが定義されました
どう別々の仕様にできる?
0156デフォルトの名無しさん2012/08/05(日) 12:30:40.85
>>152
引数が2つの時はどうすんの?wwww
0157デフォルトの名無しさん2012/08/05(日) 12:32:41.39
>>155
名前空間とクラス名が違っていれば、
メソッド名が同じでも別々の仕様だろ?

静的言語なら、別々の仕様にできる以前に、
最初から別々の仕様になってる。
0158デフォルトの名無しさん2012/08/05(日) 12:34:31.33
名前空間が作られた目的を考えれば、
どうしても同じ名前はできてしまうってことだろ?
0159デフォルトの名無しさん2012/08/05(日) 12:35:12.99
>>156
全部Int型ならaddIntだろうし、違うなら[writeBytes:array, sizeInt:10 ]になるだろ
write$Byte[],intとなってんのを考えればすぐ判るんじゃない
0160デフォルトの名無しさん2012/08/05(日) 12:37:54.74
>>159
全部Int型ならaddIntだろうし、
Int型とString型とInt型だったら
addIntStringInt ってこと?

動的言語って欠陥あるなw
0161デフォルトの名無しさん2012/08/05(日) 12:38:14.82
>>157
クラスの実装はともかくとしてインターフェース側の仕様は統一できるように
しないといかんだろ
あとたらればじゃなくcomponentsJoinedByStringをどう別の仕様にするか具体的に書いてみて
0162デフォルトの名無しさん2012/08/05(日) 12:40:04.68
>>154
静的型付でも同じでしょ
正しいかどうか結局考えなきゃいけない
0163デフォルトの名無しさん2012/08/05(日) 12:40:11.05
>>144
どこに?
人には具体的にという割には、自分は全然具体的に書かないんだな。

>>145
「冗長」の意味わかってる?
Object.addObject なら、Object.add だけでいいだろ、追加するだけなんだから。

>>152
違うよ、計算機がやるかプログラマがやるか話。
プログラマは楽しようよ。
0164デフォルトの名無しさん2012/08/05(日) 12:41:49.92
>>160
Cとかメンバー関数の存在しない言語で大規模開発した経験とか無いと辛いだろうね
0165デフォルトの名無しさん2012/08/05(日) 12:41:58.81
>>162
いいや、静的に正しいかどうかは「計算機」が決められるから、プログラマは考える必要が無い。
0166デフォルトの名無しさん2012/08/05(日) 12:42:30.85
>>161
じゃあ、条件をはっきり提示しろ。

Aというクラスに、componentsJoinedByString があった。戻り値は数値だ
Bというクラスに、componentsJoinedByString があった。戻り値は配列だ。

これらは名前が同じだが、クラス名が違うので当然仕様は別だ。
同じにしたいなら、同じインターフェースを継承するだけのこと。

ここまではいいか?
0167デフォルトの名無しさん2012/08/05(日) 12:43:02.83
>>163
>>148に書いてあるし同じ内容がいままでずっと出てたろ
脳内フィルターもいい加減にしろよ
0168デフォルトの名無しさん2012/08/05(日) 12:43:36.04
>>164
昔話したいなら「昔のPC」板にでも行けよ。

て言うか、そんなもの持ち出さないといけなくなるほど、追い詰められたのか?(w
0169デフォルトの名無しさん2012/08/05(日) 12:44:50.22
>>166
戻り値ない名前なのに言語のコーディング規約違反じゃん
0170デフォルトの名無しさん2012/08/05(日) 12:45:14.11
>>164
> Cとかメンバー関数の存在しない言語で大規模開発した経験とか無いと辛いだろうね

したことがあればわかると思うけど、
たとえばGTKライブラリ。

gtk_window_new みたいに、
頭に、gtkというプリフィックスをつける。

当たり前だけど、addIntみたいに、型名をメソッド名に入れたりはしない。
0171デフォルトの名無しさん2012/08/05(日) 12:45:34.90
>>167

>>148
>> concatって同じ名前をつけるのが間違ってるって

これがフィルターだって言うの。
静的側から見たら、全然間違ってない。
0172デフォルトの名無しさん2012/08/05(日) 12:46:04.33
>>169
どこに戻り値ないと定義されているんだ?
0173デフォルトの名無しさん2012/08/05(日) 12:46:28.23
>>168
クラス名は名前空間省略できるけど重複したら限定名使って一意の名前にしないとダメっすねぇ〜
0174デフォルトの名無しさん2012/08/05(日) 12:47:16.04
>>173
だから一意の名前になっているから大丈夫ですよね?
0175デフォルトの名無しさん2012/08/05(日) 12:48:21.25
>>171
動的型のリファクタリングの話してる時におかしいだろうが
0176デフォルトの名無しさん2012/08/05(日) 12:49:01.48
>>172
戻り値の型を書いてないから
0177デフォルトの名無しさん2012/08/05(日) 12:49:20.77
C言語風に従えば、

Array.concat ・・・ 間違い
Array.concatArray ・・・ 間違い
Array.array_concat ・・・間違い
Array.array_concatArray ・・・正解

ってことか。

あ、動的言語の場合ね。
0178デフォルトの名無しさん2012/08/05(日) 12:51:53.01
>>170
一意になるように管理してるって話だろ?
0179デフォルトの名無しさん2012/08/05(日) 12:55:31.84
たとえば、動的言語で正しい名前の付け方は

var es = doc.getElementsByName(name)

こんなのだよ。名前を使って複数のエレメントを
返すってことが明確になっている。


これが静的言語ならこうなる。
Element[] es = doc.get(name)

getという短いメソッド名でありながら
代入先の変数の型から、getが何を返すのかわかるし、
引数の型を見てオーバーロードできる。
もちろん、型情報が存在するから間違ったコードは自動的に検出できる。
0180デフォルトの名無しさん2012/08/05(日) 12:56:52.88
>>175
動的と静的の比較なんだが、理解できてないのか?
0181デフォルトの名無しさん2012/08/05(日) 12:59:38.78
>>177
別のパラダイムなんだから当然でしょ。
静的型のメンバー関数な書き方から抜け出せないなら静的型を使う。
0182デフォルトの名無しさん2012/08/05(日) 13:02:23.33
>>180
リファクタリングの仕方の問題なんだから
それぞれの特徴に合わせた話をしないと行けないだろ
静的型付言語に動的型付言語のリファクタリングを強要してリファクタリングしづらいとか
動的型付言語に静的型付言語のリファクタリングを強要してリファクタリングしづらいとか
言ってもそりゃしづらいねで終わるわ
0183デフォルトの名無しさん2012/08/05(日) 13:04:14.45
>>182
リファクタリングというのは、間違ったコードを直すという面も大きい、
つまり、間違えることが前提になっているから
間違いしなければ大丈夫って発想じゃダメなんだよ。

そこわかってる?
0184デフォルトの名無しさん2012/08/05(日) 13:04:45.25
>>179
最初はフォームチェックぐらいしか想定してなかったから
Java風を取り入れた大規模に向かない名前が多かったけど
Javascriptもこういう名前の付け方増えてきたね
0185デフォルトの名無しさん2012/08/05(日) 13:05:17.16
まあ、将来性を考えたうえで、
汎用的なメソッドの名前にするか
そのクラス専用のメソッド名にするかなんて
決められるわけ無いよな。

未来のコトはどうなるかなんてわからんのだし。
0186デフォルトの名無しさん2012/08/05(日) 13:05:54.64
>>182
それを言い出したら、どっちもどっちでそれこそ終わりだろ。

すくなくとも、名前の被りをプログラマが気にしないといけない動的と、
計算機が管理してくれる静的を比べたら、静的のほうがマシだろ。

特に大規模を経験したことあれば、「人が管理できる」なんていうのは
幻想だとわかるはず。
0187デフォルトの名無しさん2012/08/05(日) 13:06:35.62
>>183
>>148の後半の話だな
0188デフォルトの名無しさん2012/08/05(日) 13:07:28.52
管理しているつもりで
ミスしているかもしれないしなw

ミスがあるのがわかったとしても、
ミスがないことを保証してくれないのだから
どんだけチェックしても不安は拭えない。

あ、動的言語の話。
0189デフォルトの名無しさん2012/08/05(日) 13:08:31.55
>>186
OSXは幻想か?
WindowsのWM_XXは幻想か?
派遣や短期雇用だらけとか管理体制が悪いだけじゃないの
0190デフォルトの名無しさん2012/08/05(日) 13:08:56.22
わかりやすく言えば、

「名前をちゃんと分けておかなければならないだろ!」

に対する反論は

「人間誰でもミスはするもんだろ!」

で終わりってことだな。
0191デフォルトの名無しさん2012/08/05(日) 13:10:06.96
>>189
プロジェクトで使っている
メソッド名一覧を作れって話?
0192デフォルトの名無しさん2012/08/05(日) 13:10:36.28
>>188
>>166の話も中途半端に終わったがそのミスってなんだ?
間違いならリファクタリングで直すだろ
0193デフォルトの名無しさん2012/08/05(日) 13:11:25.70
>>191
規約とレビューとリファクタリング
0194デフォルトの名無しさん2012/08/05(日) 13:11:33.40
> 間違いならリファクタリングで直すだろ

その直す手間が
動的言語では大変だって話。

話ちゃんと理解してる?
なんで、直すだろ。で終わるんだよ。
0195デフォルトの名無しさん2012/08/05(日) 13:12:05.01
> 規約とレビューとリファクタリング

それをやりやすいのは静的型付け言語です。
0196デフォルトの名無しさん2012/08/05(日) 13:13:51.89
>>194
>>121に出てた話でしょ。
0197デフォルトの名無しさん2012/08/05(日) 13:15:48.46
・名前を一貫できない→リファクタリングしろ
・名前のリファクタリングが難しい→>>121
0198デフォルトの名無しさん2012/08/05(日) 13:15:59.70
たとえば、concatArrayとうメソッドがあったとする。
この文字列をgrepで検索して使用している所が多く見つかったとする。

そしてconcatArrayの定義も複数見つかった。
なぜか複数のクラスで定義されている?

のちにこれは間違いだったとわかるのだが、

さて動的型付け言語で、この間違いを見つけるのにどれだけ時間がかかるだろうか。



ちなみに、静的型付け言語では、特定のクラスのconcatArrayだけを
検索できるので、間違いを見つけるのも修正するのも簡単です。
0199デフォルトの名無しさん2012/08/05(日) 13:18:50.10
>>196
Strings.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
>>198
>>49-56に出てた話だよね
動的型付なら複数異なる実装が間違って同じインターフェースを実装してんのと同じ話ってね
同じインタフェースを継承してる箇所は全部チェックするけど静的型だろうが
動的型だろうが手間は変わらない
02022012012/08/05(日) 13:24:21.42
間違えた。
動的型付なら全て同じインターフェースを実装してるわけで
静的型付言語で言うなら複数異なる実装が間違って同じインターフェースを実装してんのと同じ話
0203デフォルトの名無しさん2012/08/05(日) 13:24:23.96
>>201
なんの手間かわかってないでしょw

直す手間がかかるのはどう考えても動的言語。
理由は>>198-199で述べられてる通り。
0204デフォルトの名無しさん2012/08/05(日) 13:25:01.36
>>201
同じインタフェースを継承してる箇所は全部チェックするけど静的型だと
インターフェースのメソッド名を選んで、検索するだけで
すぐに見つかるよねw
0205デフォルトの名無しさん2012/08/05(日) 13:27:42.10
>>202
> 静的型付言語で言うなら複数異なる実装が間違って同じインターフェースを実装してんのと同じ話

OK。間違ったとしよう。
静的型付け言語なら、インターフェースを実装する前に、
「○○インターフェースを実装します」と書いてあるはずだ。

class ×× implements ○○ みたいに。

ならそれをclass ×× implements △△ に変更すれば良い。

あとは、どのメソッドがおかしいかをコンピュータが教えてくれる。


静的型付け言語は、リファクタリングしやすい。
0206デフォルトの名無しさん2012/08/05(日) 13:28:55.37
>>199
data.appendはappendStringとappendArrayに分離する
Strings.appendをStrings.appendとArrays.appendに分離するのと
どう手間が違うんだい?Strings.appendもArrays.appendにしていいか全て調べないと行けない
>>121以前の話に戻りたいの?
0207デフォルトの名無しさん2012/08/05(日) 13:29:11.00
>>202
間違っているものを、直すまでが
リファクタリングです。

その直すまでの手間の話ですよ。

なんでリファクタリングの話してるのに
間違いを見つけただけで話を終わらせるの?
0208デフォルトの名無しさん2012/08/05(日) 13:29:48.71
>199
の、問題はここから が本題なのに、
なんでそこ無視するんだよw

問題はここから

全ソースの中から、すでに使用されているappendを調べあげ、
それがStringsに属するものかArraysに属するものか判断しないといけない。

data.append これをどちらに直せばいいのか
コードを読まないと判断できない。
0209デフォルトの名無しさん2012/08/05(日) 13:31:03.43
>>206
> data.appendはappendStringとappendArrayに分離する

お前アホw

data.appendは定義じゃねーぞ。

func foo(data) {
  data.appned
}

みたいな話だ。
分離するってなんの話をしてるんだよw
0210デフォルトの名無しさん2012/08/05(日) 13:33:11.97
これがわかりやすい

198 名前:デフォルトの名無しさん[] 投稿日: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
>>208
静的型でも読まなきゃ判断できないって書いたけど?
Arraysは置き換えてないんだから静的型付でも自動で調べようがないじゃん
0213デフォルトの名無しさん2012/08/05(日) 13:34:48.49
>>212
え? 調べようがあるけど?
0214デフォルトの名無しさん2012/08/05(日) 13:36:01.60
>>209

---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
静的型付け言語なら、dataがStringかArrayかは
静的に決まってるんだから、自動で判断できるだろ。

もしかして、コンパイラを使う言語で
メソッド名を変更して、コンパイルエラーが起きた所を
直すってことやったことない?

コンパイラ使った開発してる人は、
普通にやったことあると思うんだどなぁ。
0216デフォルトの名無しさん2012/08/05(日) 13:37:25.53
>>213
じゃコード書いて、ここに自動チェックが入るとか示してみてよ
このままじゃ堂々巡りになりそう
0217デフォルトの名無しさん2012/08/05(日) 13:37:31.19
>>214
---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
>>216
静的言語であればこうなってるはず
---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.85
---before---
func 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
>>219
何が言いたいのか全くわからないw
0221デフォルトの名無しさん2012/08/05(日) 13:41:28.09
>>218
静的型だとそれやっても意味ないだろ

静的型だと>>219になる
0222デフォルトの名無しさん2012/08/05(日) 13:42:36.37
>>219の例では変更する手間は同じ
>>218の例では静的型付け言語のほうがやりやすい。

総合点は・・・静的型付け言語の勝ちですね
0223デフォルトの名無しさん2012/08/05(日) 13:42:51.42
>>220
動的型のインターフェースと静的型のインターフェースの関係がわからないんだねw
0224デフォルトの名無しさん2012/08/05(日) 13:43:27.82
>>221
意味がないの理由は?
0225デフォルトの名無しさん2012/08/05(日) 13:44:26.12
動的型付ならインターフェースの識別はメソッド名に付く
静的型付けならインターフェースの識別はクラス名になる
0226デフォルトの名無しさん2012/08/05(日) 13:45:07.50
>>223
今は手間の話をしてる。

>>218の意味がわからない人は来ないでください。
0227デフォルトの名無しさん2012/08/05(日) 13:45:09.77
>>224
>>225
0228デフォルトの名無しさん2012/08/05(日) 13:50:53.21
>>225
そんなことはどうでもよくて

変数に型情報がついているか(型付け)か
どうかが重要だよ。

静的型付け、動的型付けの話をしているのだから。

変数に型情報がついているから
その変数の型の宣言(定義)を変えると、
すべての変数を追跡可能になる。

つまり、obj.foo() のfooのを変更する、すなわちobjの型MyObjを
変更すると型情報から文字列比較ではなく意味的に関連がある
コードを見つけ出すことが出来る。
0229デフォルトの名無しさん2012/08/05(日) 13:52:39.51
>>226
1つのインターフェース名動的型付けと静的型付で分離して比較する問題で
>>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
>>225って型付けの意味がわかってないんじゃないか?
それじゃ、違いはないと勘違いするのもわかるねw
0231デフォルトの名無しさん2012/08/05(日) 13:55:06.38
>>228
どうでも良くはない
リファクタリングの比較にならんだろ
0232デフォルトの名無しさん2012/08/05(日) 13:55:11.29
>>229
話を戻すな。先に進めろ馬鹿。

動的型付け言語では、appendという名前が悪いって話だろ。
で、appendStringという名前に変えたいんだよ。

その名前を変える時の手間の話だ。

お前、なんもわかっとらんじゃないか。
0233デフォルトの名無しさん2012/08/05(日) 13:56:57.46
>>231
どうでもいいのは
> 動的型付ならインターフェースの識別はメソッド名に付く
> 静的型付けならインターフェースの識別はクラス名になる
これのこと。

リファクタリングに差があるのは、型付け。
つまり、変数名の型。

変数に入っているオブジェクトの識別は
動的型付け言語だと実行時に行われる。
だから実行前に行うリファクタリングと相性が悪い。
0234デフォルトの名無しさん2012/08/05(日) 13:57:37.14
>>229 はちょっと語弊があるな
正確にはこんな感じか

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
200 名前:デフォルトの名無しさん[] 投稿日:2012/08/05(日) 13:20:34.67
リファクタリングは定義を直せば終わりだって思ってる
愚か者が多いってことだな。

使っている場所すべてを直さないといけないのに。
0236デフォルトの名無しさん2012/08/05(日) 14:00:01.00
>>232
何が違う?静的型付のインターフェース名を分割するのと
動的型付のメソッド名を分割するのは同義だろ。
0237デフォルトの名無しさん2012/08/05(日) 14:03:04.37
func foo(String data) {
  data.appnedString
}
func bar(Array data) {
  data.appnedArray
}

動的型付にこんなふうにインターフェース情報に更にインターフェース情報を
追加しなきゃいけないってな対になる概念はないからな
静的型付言語だけでよろしくやってくれよとしか言い様がないな
0238デフォルトの名無しさん2012/08/05(日) 14:03:16.39
>>236
だから、その作業を行う手間が違うって話だろ。
何度言えば理解できる?
0239デフォルトの名無しさん2012/08/05(日) 14:06:15.73
>>238
>>229 でどう変わる?
>>237 みたいなことを動的型言語でしたいならそりゃ手間も掛るんじゃね知らんけど
0240デフォルトの名無しさん2012/08/05(日) 14:08:43.41
>>239
お前卑怯だな。

他に大きく変わる例をわざと無視して、
変わらない例だけを持ちだしてきて
変わらないという結論にしようとしてるだろ
見え見えだ。

>>219の例では変更する手間は同じ
>>218の例では静的型付け言語のほうがやりやすい。

総合点は・・・静的型付け言語の勝ちですね
0241デフォルトの名無しさん2012/08/05(日) 14:10:19.38
>>240
>>218は静的型付言語の勝ちでいいんじゃない?
動的型付言語には対応するものが無いんだから不戦勝だよ
0242デフォルトの名無しさん2012/08/05(日) 14:11:00.73
>>239はIDE使ったこと無いんじゃないか?

コンパイラ技術を使って名前ではなく
確実に同じメソッドであると判明したものが
自動的に書き換わるという体験をしたことがないだろう?

ソースコードをテキストエディタで
ちまちま書き換えるだけじゃないんだよ。
0243デフォルトの名無しさん2012/08/05(日) 14:11:07.74
まぁ意味ないしなw
0244デフォルトの名無しさん2012/08/05(日) 14:12:23.64
>>242
なんかアホっぽいよぉ・・・
0245デフォルトの名無しさん2012/08/05(日) 14:12:37.47
>>241
前提条件で、appendを
appendStringとappendArrayに書き換えるという話。
なぜなら、動的型付け言語にとっては、appendという名前は
おかしいから。

これを忘れてないか?
0246デフォルトの名無しさん2012/08/05(日) 14:13:56.81
>>245
アホだから何度言っても無理だよ
0247デフォルトの名無しさん2012/08/05(日) 14:15:57.05
>>242
動的型付言語の同じメソッドは、全てインターフェースを持ってるって事がすぐ頭から飛ぶよね
0248デフォルトの名無しさん2012/08/05(日) 14:24:53.53
>>242
例えばstringWithStringを検索したら
stringWithStringメソッドを実装したオブジェクト全ての呼び出しと考えられるけど。

あとXCodeでObjective-Cのリファクタリング機能使ってみたら?
02492462012/08/05(日) 14:31:09.53
>>242に言ってるのかと思った
まぁ、いいか
0250デフォルトの名無しさん2012/08/05(日) 15:03:16.77
>>245
型云々インタフェース云々の事情を無視して
文字通りappendにStringとArrayを付けたいだけ
なら静的型付言語の方が楽なんじゃないかな
リファクタリングじゃなくて名前変えてるだけに見えるけど
0251デフォルトの名無しさん2012/08/05(日) 15:35:55.25
nominalな静的型付け言語、例えばJavaとかに毒されると
こんなにアホになるんだという見本だな。

ていうか、お前等暇人だな。こんなアホ相手に延々議論しちゃって。
0252デフォルトの名無しさん2012/08/05(日) 16:58:48.78
>>137
>Object.addObjectって冗長すぎだろwww

この辺のレスみると頭の硬さが滲み出てて面白いよなぁ
実際呼び出すときArray.addObjectかもしれないし
List.addObjectかもしれない。夏の匂いがする
■ このスレッドは過去ログ倉庫に格納されています