リファクタリングがしやすいのは、静的型付け言語
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2012/06/10(日) 19:41:22.34http://www.ibm.com/developerworks/jp/opensource/library/os-eclipse-refactoring/
まあ、まずこれを読みましょう。
Eclipseが凄いだけ? 半分間違っています。
静的型付け言語が凄いから、Eclipseもここまで便利な機能を搭載できるのです。
いくらEclipseでも、動的型付け言語に同レベルの機能は搭載できません。
実際されてません。
0002デフォルトの名無しさん
2012/06/10(日) 21:47:55.800003デフォルトの名無しさん
2012/06/10(日) 22:36:10.48エディタで十分!説を披露してくれます
0004デフォルトの名無しさん
2012/06/10(日) 22:38:05.71エディタで充分とまでは言わんよ、Eclipseは実際に凄い環境なのだから
0005デフォルトの名無しさん
2012/06/10(日) 22:55:21.79エディタも不十分
詰んでるなw
0006デフォルトの名無しさん
2012/06/10(日) 23:00:06.37色つけるだけしかできないのなら、viやemacsで十分。
酷い言語は可哀想である。
0007デフォルトの名無しさん
2012/06/10(日) 23:00:10.490008デフォルトの名無しさん
2012/06/10(日) 23:02:08.12書いて捨てるだけ
0009デフォルトの名無しさん
2012/06/10(日) 23:02:29.60これからは純粋関数型言語でリファクタリングの時代ってことだね!
んなわきゃーない
0010デフォルトの名無しさん
2012/06/10(日) 23:29:38.76名前の変更も苦しそうjだし
0011デフォルトの名無しさん
2012/06/10(日) 23:44:24.99まあ、大変だろうね。開発者の苦労は知らないがこんなことが出来るらしい。
http://www.wholetomato.com/products/featureRefactoring.asp
Rename
Extract Method
Encapsulate Field
Change Signature
Move Implementation to Source File
Add Member
Add Similar Member
Document Method
Create Declaration
Create Implementation
Create from Usage
Implement Interface / Virtual Methods
0012デフォルトの名無しさん
2012/06/11(月) 00:52:46.62言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0013デフォルトの名無しさん
2012/06/11(月) 00:59:39.460014uy
2012/06/11(月) 16:04:52.350015uy
2012/06/11(月) 16:12:57.08これからはソースコードの最適化という単語を使っていく
勘違いなきよう
静的言語がそんなに大好きなら、勝手にやってろと思う
ただし、俺を巻き込むな
一人でやってろ
0016デフォルトの名無しさん
2012/06/11(月) 22:14:42.46バカ丸だし
0017uy
2012/06/12(火) 03:18:54.220018デフォルトの名無しさん
2012/06/12(火) 17:48:08.76家の増改築に当たると思う。
最初の想定外の増改築を行う時
既存の部分の補強が必ず必要。
そうしないと言え全体が壊れる。
この補強作業こそがリファクタリング。
リファクタリングはいわば将来への投資
最適化とは目的が違うな。
0019デフォルトの名無しさん
2012/06/12(火) 22:51:19.85これは頭が悪いなあ
0020デフォルトの名無しさん
2012/06/12(火) 23:37:57.15リファクタリングの必要性を説くべき相手は経営層
「会社の規模が大きくなったら組織化・体制づくりが必須」
みたいなたとえが合ってるんじゃないかな
最適化どころか形式ばったムダばかり生まれる
それでもたがいに足を引っ張り合う秩序崩壊よりはずっとマシ、と
0021uy
2012/06/13(水) 13:39:56.55勝手にやってろゴミ
0022uy
2012/06/13(水) 16:53:41.380023デフォルトの名無しさん
2012/06/15(金) 03:35:49.51まじでゴミカスになるぞ
0024uy
2012/06/15(金) 13:21:12.200025デフォルトの名無しさん
2012/06/16(土) 01:37:21.600026デフォルトの名無しさん
2012/06/16(土) 08:46:07.040027デフォルトの名無しさん
2012/06/16(土) 14:06:41.06まじでゴミカスになるぞ
0028uy
2012/06/16(土) 18:04:51.85綺麗な魚を、綺麗な鳥を、牛など、野菜を食べ、
そしてゴミを排出する
それが人だ、
だとすれば人はこんなことをやっている場合じゃない
綺麗なものを壊し続けているんだから
多くの命を奪い続けているんだから
せいぜい何かマシで綺麗なものを創作しろ
0029デフォルトの名無しさん
2012/06/21(木) 03:40:53.57>>11
のリストの機能も代替サポートされとるよ。
0030デフォルトの名無しさん
2012/06/21(木) 16:10:46.67全部リネームする(そうしないと壊れる)のを「代替機能がある」
と呼ぶなら、そうだね。
0031デフォルトの名無しさん
2012/06/23(土) 04:26:28.40静的型付け言語のほうが、RefactoringBrowserをもっと効率良く
安全に行えることが判明した。
0032デフォルトの名無しさん
2012/06/24(日) 20:10:17.331000 :uy ◆xVOGOO9ev6 :2012/06/23(土) 12:35:29.68
俺は動的言語の問題点をいくつあげてもwwwww
静的言語よりはマシだと確信してるわwwwwwwwwwwwwwwwww
静的言語の問題点をなぜ挙げないかって??
見放してるから、問題点を指摘さえしないってことだよwwwwwwwwwww
気づけバカwwwwwwwwwwwwwww
0033デフォルトの名無しさん
2012/07/24(火) 23:55:34.03明らかにクソだとわかってても直す気がなくなっていく
これが動的言語・・・・
0034デフォルトの名無しさん
2012/07/29(日) 13:11:21.82てか、ただのエディタでコード習性とか死ぬ
0035デフォルトの名無しさん
2012/08/02(木) 21:53:42.310036デフォルトの名無しさん
2012/08/03(金) 00:01:45.98リファクタリングとかある訳ないだろ
0037デフォルトの名無しさん
2012/08/04(土) 20:03:06.48関数名書き換えたいってなら、同じシグニチャの関数列挙して
ユーザーがOKを押せば随時置換してくれる用なもんで十分だけど
他に何か困ることがあるか?
0038デフォルトの名無しさん
2012/08/04(土) 20:26:16.87移動・・・動的型付でも可能(リファクタリング以前に統合開発環境なら大体できる)
ローカル変数の抽出・・・動的型付でも可能
定数の抽出・・・動的型付でも可能
ローカル変数をフィールドに変換・・・動的型付ならthisなり@なりつければ済むので不要
匿名クラスをネストに変換・・・Java以外の言語なら不要
メンバー・タイプをトップ・レベルに変換・・・動的型付でも可能
インターフェースの抽出・・・動的型付の場合大体は不要、ただしObjective-Cの様に存在する場合でも問題なく可能。
スーパークラスの抽出・・・可能であるが、多用すべきじゃない。
メソッドの抽出・・・動的型付でも可能
インライン化・・・動的型付でも可能
メソッド・シグニチャーの変更・・・同一シグニチャの関数を列挙し確認した上で変更することで可能
静的片付けでも変更可能不可を判断しなきゃ行けないんで手間は変わらない
むしろインターフェースの分離が必要なので静的型付の方がメンドイ
総称型引数の推測・・・不要
Eclipseの機能だとこんなもんか。てかEclipseのリファクタリング機能って
殆ど単なるマクロ系機能でリファクタリングじゃないよな
0039デフォルトの名無しさん
2012/08/04(土) 21:46:16.95お前、「リファクタリング」を知らないだろ。
そこに出ている名前は、リファクタリングの著名な本で
リファクタリングとして定義されている機能なんだが。
0040デフォルトの名無しさん
2012/08/04(土) 21:49:04.32その方法で、countっていう名前を
置換したら、バグだらけになったよw
0041デフォルトの名無しさん
2012/08/04(土) 21:58:23.69リファクタリングが「しやすい」って書いてあるのに
出来る出来ないの話に持って行こうとするんだろうね。
動的言語の場合は面倒だったり、人間の判断が多く必要だったり
修正完了までに時間がかかったり、バグを起こしやすいってだけで、
出来るか出来ないかで言えば、出来るに決まってるだろ。
それは、反論になっていない。
しにくいという事実を否定してないんだから。
0042デフォルトの名無しさん
2012/08/04(土) 21:58:45.86countのどこにシグニチャが出てくるのか詳しく
0043デフォルトの名無しさん
2012/08/04(土) 22:00:52.04具体的にどうしにくいの?。
>>38に出てる内容だと、動的静的関係あるのってメソッド名だけだよね。
それ以外リファクタリングツールがあれば何も変わらないよね。
0044デフォルトの名無しさん
2012/08/04(土) 22:02:43.47タダの置換じゃなくリファクタリングツールつかえよ
0045デフォルトの名無しさん
2012/08/04(土) 22:04:41.36Rubyしらないの?
countという名前のメソッド作れるんだが。
不要な()を書く必要はない。
0046デフォルトの名無しさん
2012/08/04(土) 22:09:15.63動的言語だと、実行時にしかわからない情報が多いから
静的なリファクタリングと相性が悪い。
一見修正できたように見えても、実行するとエラーが起きる。
リファクタリングってのは、動作を変えずにコードを変えることだが
静的言語だと、「動作を変えない」という保証を
リファクタリングツールが行えるのに対して、
動的言語だと、人間が保証しなければならない=時間がかかる。
静的言語・・・リファクタリング開始 → 終了(完璧に動く)
動的言語・・・リファクタリング開始 → テストコードを動かす → 完璧ではなかった → 人間が問題箇所を調べる → 修正する → 完璧になるまで繰り返し → 完璧って保障は誰がするの?
0047デフォルトの名無しさん
2012/08/04(土) 22:18:18.14()があるか無いか関係なくね。a.xxxとあれば列挙して名前を書き換えていいか確認したら
置換にOK指示をだせばいいだけじゃん
>>46
コンパイルエラーが発生する代わりに実行時にエラーがでるのはリファクタリングに限った話じゃない
結局テスト云々の問題になる。そもそも静的型付だって安易に関数名を変えられない。
簡単に書き換えられるのは仮想じゃない関数だけだ。関数名変えるなら継承元や
派生全てへの影響を考えて調整する必要がある。動的型と同じ最悪実行時エラーも招く。
(今までオーバーライドしてなかった関数をオーバーライドしてしまった等)
0048デフォルトの名無しさん
2012/08/04(土) 22:19:39.91ほらそれそれ、
人間がやる作業がある。
置換してOKか?すぐに分からない。
時間がかかる。
0049デフォルトの名無しさん
2012/08/04(土) 22:22:19.24動的言語だと、それが仮想関数かさえわからないよな?
関数名書き換えられないと自分で認めてるのに気づいた?
静的言語だと、ちゃんと仮想関数まで追尾してくれる。
継承元や派生すべての影響を考えて修正してくれるんだよ。
もちろん、今までオーバーライドしていなかった。ということも検知してくれるし、
新たにオーバーライドしてしまうようなリファクタリングをしようとしたら
ちゃんと教えてくれる。
0050デフォルトの名無しさん
2012/08/04(土) 22:27:54.63静的型でも同じじゃん
>>49
>関数名書き換えられないと自分で認めてるのに気づいた?
できるけど、静的型でも動的型でも同じ問題にぶつかるって書いてるよ。
>静的言語だと、ちゃんと仮想関数まで追尾してくれる。
>継承元や派生すべての影響を考えて修正してくれるんだよ。
置き換えて大丈夫かどうか調べにゃならんのは同じでしょ
0051デフォルトの名無しさん
2012/08/04(土) 22:30:39.50一応言うけど、動的型言語の場合シグニチャが同じなら
全て同じインターフェースの関数を利用してると同義なんだよ。
静的型付でもインターフェースの影響範囲を全部しらべるよね。
0052デフォルトの名無しさん
2012/08/04(土) 22:33:52.12メッセージとメソッド形式だからなぁ。切り口を変えれば手間も対して変わらんってのは
メンバー関数な人には理解しづらいんだろ
0053デフォルトの名無しさん
2012/08/04(土) 22:37:57.99>もちろん、今までオーバーライドしていなかった。ということも検知してくれるし、
>新たにオーバーライドしてしまうようなリファクタリングをしようとしたら
>ちゃんと教えてくれる。
動的型付なら同じメソッドもってりゃ全て派生みたいなもんだし
もし警告が出るようなツールがあっても全てのクラスに警告がでるから
そもそも意味がないでしょ
0054デフォルトの名無しさん
2012/08/04(土) 22:50:31.77> 置き換えて大丈夫かどうか調べにゃならんのは同じでしょ
なんで、意味的に一致する所を全部書き換えるのに
いちいち調べなきゃならんのだ。
0055デフォルトの名無しさん
2012/08/04(土) 22:51:14.92だから、そのさが静的言語のリファクタリングのしやすさに繋がってるの。
0056デフォルトの名無しさん
2012/08/04(土) 22:58:15.57addを2つのクラスなりプロトコルなりインターフェースなりから受け継いでて
片方をappendに変える事になったらもう片方にも影響するだろ
この時わざわざ名前を変えたのは"本来意味が違う"のに間違った名前をつけてたからだ
意味と名前がそぐわないから名前を変えるってのはリファクタリング理由の一つだろ?
0057デフォルトの名無しさん
2012/08/04(土) 23:01:46.76「だから」になってないよ。同じメソッドを持ってるクラスが全て同じインターフェースを実装してる場合と
何が違うのか一切反論になってないし
0058デフォルトの名無しさん
2012/08/04(土) 23:02:25.02その片方に影響するという事実が
静的言語なら検出可能になる。
実際にリファクタリングをしようとしたら
動的言語だと、人間が判断してやるしか無く、
ミスするのが目に見えているが、
静的言語だと、「このメソッドは他のクラスからも継承しているため
変更するのは危険です」と警告が出せるだろう。
0059デフォルトの名無しさん
2012/08/04(土) 23:04:07.30> 同じメソッドを持ってるクラスが全て同じインターフェースを実装してる場合
動的言語だと、本当に同じインターフェースを実装しているかが検出不可能。
メソッドを実行時に付け加えたり外したりするから、
どうやっても確実な情報が得られない。
0060デフォルトの名無しさん
2012/08/04(土) 23:06:26.12他でも出てるが動的型付なら全て同じインターフェースやプロトコルなんかを実装してるのと同じ。
警告出すんなら全部の同じメソッドを持ったメソッドに出さなきゃならんだけで警告自体意味がない。
0061デフォルトの名無しさん
2012/08/04(土) 23:07:35.89それはjavascriptとかプロトタイプベースの問題で
動的型付言語と別問題だろ
0062デフォルトの名無しさん
2012/08/04(土) 23:09:48.08静的型付言語に出来ない機能を引き合いに出してどうすんだよ。
0063デフォルトの名無しさん
2012/08/04(土) 23:13:34.15golangとかC++のsignature(gcc拡張)とかで静的型言語でも
実装できそうな機能じゃあるが、静的だと簡単になるか?
0064デフォルトの名無しさん
2012/08/04(土) 23:35:43.370065デフォルトの名無しさん
2012/08/05(日) 00:24:52.03動的言語は静的言語で出来ないことを出来るようにしたために
実行前に判断できていたことをできなくしてしまった。
実行時にメソッドを変更するとか、ほとんど必要とされない機能。
なぜなら、ほとんどのことは実行前に静的に変更すること、
つまり何らかのメタ情報を元にコードを自動生成する機能で対応可能だから。
>>64
シグネチャの変更やクラス構造の変更までくると
動的言語は太刀打ち出来ないからね。
この話をすると、静的言語の圧勝になる。
0066デフォルトの名無しさん
2012/08/05(日) 00:26:37.83「データベース定義を元に実行時にメソッドを生成する機能」なんかは
データベース定義を元にクラスを生成するコードジェネレータを使えば、
実行前にメソッドを生成することが可能。
0067デフォルトの名無しさん
2012/08/05(日) 00:34:13.66プロトタイプの問題で動的型付け関係ないよね
0068デフォルトの名無しさん
2012/08/05(日) 00:37:05.07静的型付け言語でメソッド差し替えできた場合は楽にリファクタリングできるの?
0069デフォルトの名無しさん
2012/08/05(日) 00:46:39.58メソッド差し替えは目的ではない。
なぜそんなことをするのかから
話を聞こうか。
0070デフォルトの名無しさん
2012/08/05(日) 00:57:35.82差し替えのメリットは無効化かな、静的型付言語の場合はデリゲート用。
静的型付言語でのメソッド追加のメリットは型を合わせられる点。
var a Prototype
var b Concept
b = a // Conceptに必要なメンバーが足りないのでコンパイルエラー
a.Example := func( _ Prototype )(){}
b = a // Conceptに必要なメンバーが足りているのでコンパイルが通る。
0071デフォルトの名無しさん
2012/08/05(日) 00:59:09.80意味不明
0072デフォルトの名無しさん
2012/08/05(日) 01:00:12.59> a.Example := func( _ Prototype )(){}
> b = a // Conceptに必要なメンバーが足りているのでコンパイルが通る。
こんなもん、実行前にやればいいだけの話だな。
0073デフォルトの名無しさん
2012/08/05(日) 01:02:39.96外したりするのは間違いなんだよ。
どうせ実行時に付け加えたメソッドを
使っているコードをあらかじめ書いてるんだ?
つまり、実行前にわかっていることなんだよ。
コード見れば実行前にわかっていることを
実行時に行うのはおかしい。
0074デフォルトの名無しさん
2012/08/05(日) 01:05:54.20空の動作を与えれば実行したくない動作をしなくなる
応用すれば、使い捨てのスタブオブジェクトを作れる
>>72
静的言語の話だから当然実行前だよ
0075デフォルトの名無しさん
2012/08/05(日) 01:07:23.430076デフォルトの名無しさん
2012/08/05(日) 01:13:40.55実行前に
> b = a // Conceptに必要なメンバーが足りないのでコンパイルエラー
> a.Example := func( _ Prototype )(){}
> b = a // Conceptに必要なメンバーが足りているのでコンパイルが通る。
こんな、実行文のような書き方で
クラス定義をする言語を知らないのだが?
擬似言語ならこんな感じがいいでしょう。
class Concept { ... }
partial class Concept {
func partial Example() {}
}
C#っぽく書いたが、静的言語でクラス定義をコンパイル時に拡張する方法の提案。
動的言語はアセンブラと同じようなもので、実行時に自分自身を書き換えることで
いろんなことができるけど、それは応急処置みたいなもので、その先に進化の道はない。
本当に実行時にやらなくてはいけないことなんて、すごく少なくて、
それを無くすことで、リファクタリングはより一層便利なものになる。
0077デフォルトの名無しさん
2012/08/05(日) 01:16:33.30ぶっちゃけメソッドのつけ外しがメリットが大きなメリットだとは思ってない
静的型言語でも可能だから動的型固有の問題じゃないといいたかっただけ
0078デフォルトの名無しさん
2012/08/05(日) 01:18:23.66golangの様な言語じゃないと無理だよ。
C#方式じゃインターフェースとクラスの結合が必須だから実現できない。
0079デフォルトの名無しさん
2012/08/05(日) 01:20:19.17実行時か実行前かは関係ないんだっつうの
0080デフォルトの名無しさん
2012/08/05(日) 01:25:52.06大有りだってw
実行前に決まっていることというのは、
コンピュータがすべてを把握できる。
実行しないとわからないこと、つまり未来はコンピュータにはわからない。
リファクタリングは実行前に行う作業だ。
リファクタリング以前に情報がわかるのとわからないのとでは
できることに大きな差がある。
0081デフォルトの名無しさん
2012/08/05(日) 01:27:11.06> 静的型言語でも可能だから動的型固有の問題じゃないといいたかっただけ
そりゃメソッドの追加とか可能だろう。
だけど、それが実行前に行われるってところが重要。
それがリファクタリングのしさすさに影響してくくる。
0082デフォルトの名無しさん
2012/08/05(日) 01:27:31.45Concept b = new Concept()
{
Prototype prototype = new Prototype();
int function()
{
prototype.function();
}
void example(){色々}
}
0083デフォルトの名無しさん
2012/08/05(日) 01:29:18.210084デフォルトの名無しさん
2012/08/05(日) 01:31:24.69質問が意味不明。
アメリカに行くのに、船で行くのか、飛行機で行くのかと
聞いているようなものだ。
具体的に変わるもの? 手間と時間だろ。
0085デフォルトの名無しさん
2012/08/05(日) 01:35:24.91例えば>>82と動的型言語で等価なコードを書いてた場合どう変わる?
メソッドを追加するという行為に対して結局どっちもリファクタリングの手間は変わらないじゃん。
0086デフォルトの名無しさん
2012/08/05(日) 01:38:35.24リファクタリングではない。単なる機能追加だ。
0087デフォルトの名無しさん
2012/08/05(日) 01:40:08.89動的型言語ならexampleというインターフェースのexampleというメソッド全てを書き換える。
結局手間は変わらない。
0088デフォルトの名無しさん
2012/08/05(日) 01:40:56.01国語ができないなら書き込むなよ
0089デフォルトの名無しさん
2012/08/05(日) 01:43:09.54伴う問題に、静的型付け言語のメリットは存在するぞ。
あるクラスAにfooというメソッドを追加するとき
Aを継承したクラスBですでにfooというメソッドを定義していた。
こういう場合は予期せぬバグになるだろうから
実行前に検出するのがベターだ。
つまりJavaのoverrideアノテーション機能の話だよ。
0090デフォルトの名無しさん
2012/08/05(日) 01:45:15.74メソッド追加をリファクタリングか議論してるんじゃなくて
メソッド追加があるものをリファクタリングするのは難しいって話してるんだよ〜
わかるぅぼくぅ?
0091デフォルトの名無しさん
2012/08/05(日) 01:45:55.96意図的に手間がかかる部分を省略しないように。
Conceptというインターフェースのexampleメソッド全てを書き換える。
書き換えた場合に、Conceptというインターフェースそのものではなく、
そのexampleメソッドを使っているコードすべてを書き換えないといけない。
ここ、ここが一番手間がかかる部分で
お前が意図的に省略したところだよ。
これ、全て自動でやってくれるんですよ。
静的型付け言語のリファクタリング機能なら。
0092デフォルトの名無しさん
2012/08/05(日) 01:46:30.81うん凄くどうでもいい
0093デフォルトの名無しさん
2012/08/05(日) 01:47:18.27ならレスしないように
0094デフォルトの名無しさん
2012/08/05(日) 01:48:58.08なるほど、たしかにそれはそのとおりだ。
exampleすべてを置換するわけにもいかない。
exampleが該当クラスのexampleであるかは
obj.exampleのobjが該当クラスかどうかの情報が必要になる。
つまり変数の型情報が必要になる。
0095デフォルトの名無しさん
2012/08/05(日) 01:50:32.69動的片付けなら同一シグニチャのexample全てを書き換える
明示的にインターフェースを分離したいなら最初から
conceptExampleの用にインターフェース名が名前に含まれる訳で結局変わらんよ
0096デフォルトの名無しさん
2012/08/05(日) 01:51:22.56同一シグニチャでも、全く関係ないメソッドはどうする?
0097デフォルトの名無しさん
2012/08/05(日) 01:53:46.23メッセージ名が同じなら同じインターフェース。メッセージ名が違うなら違うインターフェース。
0098デフォルトの名無しさん
2012/08/05(日) 01:54:12.44関係ないのに同一シグニチャになる可能性が多いんだよな。
0099デフォルトの名無しさん
2012/08/05(日) 01:55:24.28動的型付言語の流儀として最初から作っちゃいかんだろ
もし有ったらそれこそリファクタリングして別名に分けなきゃ
0100デフォルトの名無しさん
2012/08/05(日) 01:55:45.56getなんてメソッドを使ったらいけないってこと?w
0101デフォルトの名無しさん
2012/08/05(日) 01:57:20.300102デフォルトの名無しさん
2012/08/05(日) 01:57:36.66君、もしかして今、動的型付け言語の場合は
名前空間が違っていても、クラス名が違っていても
同一のメソッド名を作ったらいけないって言ったの?
置換するときに、間違って置換してしまうから。
0103デフォルトの名無しさん
2012/08/05(日) 02:00:36.19動的言語の場合だと、名前被らないようにしないといけないんだw
0104デフォルトの名無しさん
2012/08/05(日) 02:01:28.52同じメソッドを再利用するためだろ
例えばtoString()を全然別の仕様で作っていいと思ってる?
それなら何も言わないけど
0105デフォルトの名無しさん
2012/08/05(日) 02:02:01.17toStringに限った話なんかするな。
0106デフォルトの名無しさん
2012/08/05(日) 02:03:03.74メソッドの仕様に関してはそうだよ。そのおかげで再利用性が高まる。
0107デフォルトの名無しさん
2012/08/05(日) 02:03:30.05HTTP通信のsendじゃ
名前一緒でも別に仕様だろうに。
0108デフォルトの名無しさん
2012/08/05(日) 02:04:33.07再利用できないものを
再利用する意味は何ですか?
0109デフォルトの名無しさん
2012/08/05(日) 02:04:45.09なんでもいいけど、じゃconcatで。
0110デフォルトの名無しさん
2012/08/05(日) 02:06:16.78配列をconcatするのと
文字列をconcatするのは
別の仕様であるべきですよ。
0111デフォルトの名無しさん
2012/08/05(日) 02:06:53.26違うなら別名にすべきでしょ。
同じ名前にするなら同じにしなきゃ。
余談だけど、HTTPのsendとメールのsendは同じでいいと思う。
>>108
具体的にどういうケースを言ってんのかわかんない
0112デフォルトの名無しさん
2012/08/05(日) 02:08:58.15Array.concat (実際にActipnScriptに存在する)と
String.concat というメソッドがある。
Array.concatなんて名前が変だろ!
ということで、Array.joinに変更しようと思った。
String.concatまでString.joinにしていいのか?
0113デフォルトの名無しさん
2012/08/05(日) 02:09:13.65受け取る型が違うならconcatArrayとconcatStringでいいでしょ
ただ、型を除けば違う仕様にしちゃダメだよね。ちなみに仕様ってのは
入りと出の事ね。中身がどうなっていようが問題はないから。
0114デフォルトの名無しさん
2012/08/05(日) 02:10:18.78え? 動的型付け言語に型なんてないよ?
0115デフォルトの名無しさん
2012/08/05(日) 02:12:04.10Array.concatArray
String.concatString
にしろということらしいw
Mail.sendMail
HTTP.sendData
かねぇw
0116デフォルトの名無しさん
2012/08/05(日) 02:14:21.13ActionScriptって型付きじゃん
C#みたいに動的型もできるハイブリッドじゃあるけど
0117デフォルトの名無しさん
2012/08/05(日) 02:15:31.13名前を変えるときは、全部変えちまえっていうのは
やっぱりだめだな。
名前が同じでも、違う人っているんだよ。
0118デフォルトの名無しさん
2012/08/05(日) 02:17:54.63そうだよ。ほれ。
てかリファクタリングから話しそらしてないか。
// 結合
NSMutableString * string = [NSMutableString stringWithString:@"aaa"];
NSString *joined = [string appendString:@"bbb"];
// 配列で結合
NSArray *array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];
NSString *joined = [array componentsJoinedByString:@","];
//配列に分割
NSString * string = [NSMutableString stringWithString:@"aaa,bbb,ccc"];
NSArray *record = [string componentsSeparatedByString:@","];
0119デフォルトの名無しさん
2012/08/05(日) 02:37:08.11同じ仕様でよくね
var mail = new Main( "[email protected]" );
mail.setSMTPHost( "smt.example.com", 1234 );
mail.setText( contet.text );
var post = new HTTP( "www.example.com", "POST" );
post.setPair( "text", contet.text );
<input type="radio" onClick="sender=mail"/>
<input type="radio" onClick="sender=http"/>
<input type="button" onClick="sender.send();" />
0120デフォルトの名無しさん
2012/08/05(日) 07:59:10.65100歩譲って「動的言語の場合だと、名前被らないようにしないといけない」のを受け入れた
として、人間、特に複数人で開発していると間違ってかぶってしまうのは避けられないよ。
その時に、間違いを修正するために「リファクタリング」するんだが、理解してるか?
0121デフォルトの名無しさん
2012/08/05(日) 08:33:28.11Strings.appendをStrings.appendとStrings.concatに分離する
appendStringをappendStringとappendArrayに分離する
appendStringをappendStringとconcatStringに分離する
(このconcatとかArrayへの分離に意味があるのかは置いといて)
手法としては結局変わらないな。シグニチャを見て適切な名前か確認したり
周りの処理を見て適切な名前か判断したり。動的型か静的型でも同じ手間だね。
0122デフォルトの名無しさん
2012/08/05(日) 08:42:57.95appendをappendObjectとappendStringとappendArrayに分離する
0123デフォルトの名無しさん
2012/08/05(日) 08:44:15.310124デフォルトの名無しさん
2012/08/05(日) 10:38:16.24・一部concatStringメソッドを実装していながらStringという仕様要件を必須としないメソッドが現れた
・それらの要件仕様をByteSequenceという要件仕様で切り出す事にした
・ByteSequence用にconcatByteSequenceメッセージを新たに定義
・Stringが要件としてどうしても必要なのかByteSequenceで十分なのか確認しつつ
各メッセージの書き換えとメソッドの移譲を定義していく
よくあるシナリオだとこんな感じだな
0125デフォルトの名無しさん
2012/08/05(日) 10:43:21.97バッドノウハウでしか無いな。
やはり、リファクタリングしやすいのは静的言語ってことだな。
0126デフォルトの名無しさん
2012/08/05(日) 11:14:10.51被らないようにするのは今に始まった話じゃない
WindowsでもUnixでも内部で一意になるよう管理してる
どこがバッドノウハウなんだ?
0127デフォルトの名無しさん
2012/08/05(日) 11:18:24.44メッセージはプログラムの空間に属するもの、メソッドはオブジェクトに属するもの
そもそもそういう考えもない人が動的型ガーって言ってるんだから、そういう人にはリファクタリングは無理だわ
0128デフォルトの名無しさん
2012/08/05(日) 11:24:58.57多分動的型付でGUIがあるような規模の開発したことすら無いんだろうな。
引き出し(ノウハウ)が少なすぎる。
0129デフォルトの名無しさん
2012/08/05(日) 11:27:49.590130デフォルトの名無しさん
2012/08/05(日) 11:34:40.30>静的型付信者は今のところまともな反論一つ出来てない。
フィルターかかった目で見るとそうなんだろうな…、チーン
0131デフォルトの名無しさん
2012/08/05(日) 11:41:03.30>>112みたいに具体的に踏み込んだ話をだせればもっと追い込めるのにね
0132デフォルトの名無しさん
2012/08/05(日) 11:49:35.78そのうえ頭の中は>>130みたいにフィルターが掛かってせいだと思いたいらしい
フィルター掛かってると思うならどこのレスがフィルターに消えたか示したらいい
どうせ机上の空論しか出てこないだろ
0133デフォルトの名無しさん
2012/08/05(日) 11:54:14.69大変なことだってわかる。
開発人数多いし、他人が作ったライブラリ使うし。
で、それがわからんのは、実戦経験がないから、
実戦経験があるとしたら、いつも1000行未満の
使い捨ての小さいプログラムを書いてるだけの人だろう。
動的言語が大規模アプリには向かないと言われるのはそのため。
0134デフォルトの名無しさん
2012/08/05(日) 11:56:28.844人〜7人レベルの開発ならレビューで指摘があって
リファクタリングすることになるが?
COBOL開発してた所で働いてんの?
0135デフォルトの名無しさん
2012/08/05(日) 11:58:21.70経験から具体例を上げてくれるか?
まさかいろんな型の引数をaddObjectとか作らずadd一つで
対処してるような派遣だらけの現場じゃあるまいな
0136デフォルトの名無しさん
2012/08/05(日) 12:00:04.63コーディングルールとか教育とかしてないの?
C++つかってたらテンプレートはダメ
JavaならJava5以降の機能は使うなって環境?
0137デフォルトの名無しさん
2012/08/05(日) 12:09:27.42Object.addObjectって冗長すぎだろwww
0138デフォルトの名無しさん
2012/08/05(日) 12:11:40.65ここで話していた、ダメなメソッド名
ばっかり見つかるよな。
0139デフォルトの名無しさん
2012/08/05(日) 12:11:57.65冗長だと思うんなら静的型付言語だけ使ってなさい
0140デフォルトの名無しさん
2012/08/05(日) 12:13:54.88リファクタリングするのは当たり前。
リファクタリングがやりやすいかどうかの話。
動的言語だと、リファクタリングがうんざりする
http://ja.wikipedia.org/wiki/Objective-C
> 型付け 弱い静的型付け
0141デフォルトの名無しさん
2012/08/05(日) 12:15:10.67>>112 の回答書いてから言えよ。(w
そういうのを無視するから、フィルターとか言われてるんだろ。
0142デフォルトの名無しさん
2012/08/05(日) 12:17:23.110143デフォルトの名無しさん
2012/08/05(日) 12:17:30.19結構いろんなライブラリに >>137 みたいな名前の奴があって、何でこんな冗長なんだ?
と常々思っていたけど、世の中こんなアホが結構居るんだな。
まあ、作った人は賢くてこの手のアホが混乱しないように配慮してるだけかもしれないが。
0144デフォルトの名無しさん
2012/08/05(日) 12:18:18.22長々とその話出てたろ
0145デフォルトの名無しさん
2012/08/05(日) 12:19:14.29利口だと思うやり方書いて
0146デフォルトの名無しさん
2012/08/05(日) 12:19:37.57メソッド名は被らないようにしないといけない。
0147デフォルトの名無しさん
2012/08/05(日) 12:20:40.25ダメなメソッド名の一例だね。
0148デフォルトの名無しさん
2012/08/05(日) 12:22:54.14concatStringとconcatArrayをまず定義するから
そういう事にはならないし受け取るものが違うのに
concatって同じ名前をつけるのが間違ってるって
話でしょ。そういう場合はconcatリファクタリングして
分けると。
0149デフォルトの名無しさん
2012/08/05(日) 12:24:53.68オーバーロードって知ってる?
受け取るものが違うけど、
同じ名前をつける時に使う機能。
0150デフォルトの名無しさん
2012/08/05(日) 12:25:56.410151デフォルトの名無しさん
2012/08/05(日) 12:27:36.29ライブラリを作ったとしよう。
当然メソッド名も似ているものができてしまう。
しかし、この2つのライブラリには
互換性がない。すなわち交換可能じゃない。
ならば、交換可能ではないと、
検知できたほうがいいだろう?
0152デフォルトの名無しさん
2012/08/05(日) 12:28:04.54add(Object object)
add$Object
add(String object)
add$String
マングリングされると結局同じだよね
暗黙的にやってるか明示的にやってるかだけの話で
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かもしれない。夏の匂いがする
0253デフォルトの名無しさん
2012/08/05(日) 17:18:39.81>実際呼び出すときArray.addObjectかもしれないし
>List.addObjectかもしれない。
これが静的 (リファクタリング時) にわかるかどうかだろ。
Array.addObject だけ変更したい時に、静的なら IDE にお任せすることが出来るけど、
動的だとどうやるんだい?
0254uy
2012/08/05(日) 19:11:23.560255uy
2012/08/05(日) 19:14:41.08書籍「リファクタリング―プログラムの体質改善テクニック」から
抜粋してやるからしっかりと理解するように。
http://d.hatena.ne.jp/tbpg/20120316/1331922781
リファクタリングする理由
設計の向上
バグの発見
開発スピードの向上
可読性の向上
品質の向上
リファクタリング自体は新たな機能を追加するものではないので、
開発スピードの向上というと矛盾しているように聞こえるかもしれません。
長期的にみれば、よりよい設計が維持されているソースコードは追加・修正の
工数が下がるためトータルで費やす工数は減ることになります。
障害対応の工数も減りますし。
0256uy
2012/08/05(日) 19:15:37.66リファクタリングの定義
http://martinfowler.com/bliki/DefinitionOfRefactoring.html
リファクタリング本のなかで、リファクタリングの定義を記しました。
リファクタリング(名詞)
外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変更させること。
リファクタリング(動詞)
一連のリファクタリングを行って、外部から見た振る舞いの変更なしに、ソフトウェアを再構築すること。
0257uy
2012/08/05(日) 19:16:54.96書籍 リファクタリング−プログラマーの体質改善 | メソッドの構成
リファクタリング
パンくず
リファクタリング-プログラマーの体質改善テクニック
メソッドの構成
内容
メソッドの構成
リファクタリング名 対象 対応
・メソッドの抽出 1つにまとめられるコードの断片がある コードの断片をメソッドにして、その目的を説明する名前をつける
・メソッドのインライン化 メソッドの本体が名前と同じくらいわかりやすい メソッドの本体を呼び出し元の本体に組み込み、メソッドを削除する
・一時変数のインライン化 単純な式で1度だけ代入されている一時変数があり、その一時変数が他のリファクタリングの邪魔になっている
その一時変数に対するすべての参照を取り除き、式にする
・問い合わせによる一時変数の置き換え 一時変数を使って式の結果を保存している 式をメソッドにする。一時変数のすべての参照箇所を式に置き換える。
新しいメソッドは他のメソッドからも使える
・説明用変数の導入 複雑な式がある 処理の目的を説明するような名前を持つ一時変数に式、または式の一部の結果を代入する
・一時変数の分離 ループ変数でも計算結果の蓄積用の変数でもないのに、複数回代入される一時変数がある 代入ごとに別々の一時変数を用意する
・パラメータへの代入の除去 コードが引数に代入を行っている 代わりに一時変数を使う
・メソッドオブジェクトによるメソッドの置き換え 「メソッドの抽出」を適用できないようなローカル変数の使い方をしている長いメソッドがある
メソッドを独自のオブジェクトに変え、すべてのローカル変数がそのオブジェクトのインスタンス変数になるようにする。こうすれば、メソッドを分解して、
同じオブジェクトの別のメソッドにすることが可能になる
・アルゴリズムの取り替え アルゴリズムをもっとわかりやすいものにしたい メソッド本体を新しいアルゴリズムで書き換える
0258uy
2012/08/05(日) 19:17:50.05リファクタリング名 対象 対応
メソッドの移動 メソッドが、自分のクラスよりも他クラスの機能を使ったり、他クラスから利用されたりする。
今はそうでなくても、そうなりつつある。 メソッドをもっともよく使っているクラスに同じ内容の新メソッドを作る。
古いメソッドは、このメソッドに処理を委ねるか、完全に取り除く。
フィールドの移動 メソッドが、自分のクラスよりも他クラスの機能を使ったり、他クラスから利用されたりする。
今はそうでなくても、そうなりつつある。 ターゲットクラスに新しい属性リーダーを作り、フィールドを使っているコードを書き換える。
クラスの抽出 2つのクラスで行うべき仕事をしている1個のクラスがある。 新しいクラスを作成し、
関連フィールド、メソッドを旧クラスから新クラスに移す。
クラスのインライン化 クラスが大した仕事をしていない。 すべての機能を他のクラスに移して、クラスを削除する。
委譲の隠蔽 サーバに委譲を隠すためのメソッドを作る クライアント側がサーバー側のパラメータについて知っていると両者の依存度が高くなります。
サーバー側のオブジェくトを返却する小さい委譲メソッドを用意することで、この依存を無くすことが出来ます。
仲介人の除去 クラスが単純な委譲をやり過ぎている。 クライアントに委譲オブジェクトを直接呼び出させる。
外部メソッドの導入 利用中のサーバクラスにメソッドを追加する必要があるが、そのクラスを変更できない クライアントクラスに、
サーバクラスのインスタンスを第一引数に取るメソッドを作る
局所的拡張の導入 利用中のサーバクラスにメソッドをいくつか追加する必要があるが、クラスを変更できない
それらの追加されるメソッドを備えた新たなクラスを作る。この拡張クラスは元のクラスのサブクラスまたはラッパーである
0259uy
2012/08/05(日) 19:19:31.64リファクタリング名 対象 対応
自己カプセル化フィールド
オブジェクトによるデータ値の置き換え
値から参照への変更
参照から値への変更
オブジェクトによる配列の置き換え
観察されるデータの複製
単方向関連の双方向への変更
双方向関連の単方向への変更
シンボリック定数によるマジックナンバーの置き換え
フィールドのカプセル化
コレクションのカプセル化
データクラスによるレコードの置き換え
クラスによるタイプコードの置き換え
サブクラスによるタイプコードの置き換え
State・Strategyによるタイプコードの置き換え
フィールドによるサブクラスの置き換え
0260uy
2012/08/05(日) 19:20:21.11条件記述の統合 同じ結果になる条件テストが複数並んでいる それらを1つの条件式にまとめ、メソッドとして抽出する
重複した条件記述の断片の統合 条件式のすべての分岐に同じコード片が含まれている その部分を式の外に出す
制御フラグの削除 一連の論理式で使われる制御フラグとして機能している変数がある 代わりにbreakやreturnを使う
ガード節による入れ子条件記述の置き換え 正常な実行経路がはっきりしないような条件分岐を持つメソッドがある すべての特殊条件をガード節で処理する
ポリフォーフィズムによる条件記述の置き換え オブジェクトのタイプによってふるまいを変える条件文がある 条件文の分岐先をポリモーフィックに呼び出せるオブジェクトのメソッドに移す
ヌルオブジェクトの導入 コードの中でnull(nil)値のチェックを繰り返している null(nil)値の代わりにnullオブジェクトを導入する
表明の導入 プログラムの状態について何らかの条件を前提としているコードがある アサーションによって、前提条件を明確に表現する
0261uy
2012/08/05(日) 19:20:54.96リファクタリング名 対象 対応
メソッド名の変更 メソッドの名前がその目的を正しく表現できていない メソッド名の変更
引数の追加 あるメソッドが、呼び出し元からより多くの情報を必要としている その情報を渡すために引数を追加する
引数の削除 ある引数が、もはやメソッド本体から使われていない。 引数を削除する
問い合わせと更新の分離 1つのメソッドが値を返すと同時にオブジェクトの状態を変更している 問い合わせようと更新用の2つのメソッドをそれぞれ作成する
メソッドのパラメータ化 複数のメソッドが、異なる値に対してよく似た振る舞いをしている。 その異なる値を一つの引数として受け取るメソッドと作成する
明示的なメソッド群による引数の置き換え 引数の特定の値によって異なるコードが実行されるメソッドがある 引数の値に対応する別々のメソッドを作成する
オブジェクトそのものの受け渡し あるオブジェクトから複数の値を取得し、それらの値をメソッド呼び出しの引数として渡している 代わりにオブジェクトそのものを渡す
メソッドによる引数の置き換え あるオブジェクトがメソッドを呼び出し、その戻り値を別のメソッドの引数として渡している。受信側は、そのメソッドを呼び出させる 引数を削除し、
受信側にそのメソッドを呼び出させる
引数オブジェクトの導入 本来まとめて扱うべき一覧の引数がある それらをオブジェクトに置き換える
setメソッドの削除 フィールドの値が生成時に設定され、決して変更されない そのフィールドに対するすべてのsetメソッドを削除する
メソッドの隠蔽 メソッドが自分の定義されているクラス意外からまったく使用されていない そのメソッドを非公開にする
Factory Methodによるコンストラクタの置き換え オブジェクトを生成する際に、単純な生成以上のことをしたい ファクトリメソッドを使って、コンストラクタを置き換える
ダウンキャストのカプセル化 メソッドが返すオブジェクトが、呼び出し側によってダウンキャストされる必要がある。 そのダウンキャストをメソッド内に移動する
例外によるエラーコードの置き換え メソッドがエラーを示す特別なコードをリターンしている 代わりに例外を発生される。
条件判定による例外の置き換え
0262uy
2012/08/05(日) 19:21:36.05リファクタリング名 対象 対応
フィールドの引き上げ 2つのサブクラスが同じフィールドを持っている。 そのフィールドをスーパークラスに移動する。
メソッドの引き上げ どのサブクラスでも同じ結果になるメソッドがある。 メソッドをスーパークラスに移す。
コンストラクタ本体の引き上げ 複数のサブクラスに内容がほとんど同一のコンストラクタがある。 スーパークラスのコンストラクタを作成して、サブクラスから呼び出す。
メソッドの引き下げ スーパークラスのふるまいが、一部のサブクラスでしか使われない。 メソッドをサブクラスに移す。
フィールドの引き下げ スーパークラスのふるまいが、一部のサブクラスでしか使われない。 フィールドをサブクラスに移す。
サブクラスの抽出 クラスが一部のインスタンスだけしか使わないメンバを持っている。 それらのメンバのためにサブクラスを作る。
スーパークラスの抽出 同じような機能を持つ2つのクラスがある。 片方のクラスをスーパークラスにして、共通するメンバをスーパークラスに移す。
インタフェースの抽出 複数のクライアントが、あるクラスのひとまとまりのインタフェースを使っている。または2つのクラス間でインタフェースの一部が共通である
その共通部分をインタフェースとして抽出する
階層の平坦化 スーパークラスとサブクラス(またはモジュールとそのモジュールをインクルードするクラス)に大差がない 両者を1つに統合する
Template Methodの形成 サブクラスがスーパークラスのインターフェイスの一部しか使っていない、あるいはデータの継承を望まない
スーパークラスのためのフィールドを作り、スーパークラスに処理を委譲するようにメソッドを調整してから、継承構造を解消する
委譲による継承の置き換え サブクラスがスーパークラスの一部のインターフェースだけを使っている。あるいはデータを継承したくない
スーパークラス用のフィ0ルドを作成して、メソッドをスーパークラスに委譲するように変更し、継承をやめる
継承による委譲の置き換え 委譲を使っているが、インターフェイス全体のために多数の委譲メソッドを書いている
委譲先のクラスをモジュールにして、委譲元のクラスでインクルードする
0263uy
2012/08/05(日) 19:22:09.39リファクタリング名 対象 対応
継承の分割 同時に2つの仕事をしている継承階層がある 2つの階層を作り、片方からもう片方を実行するには委譲を使う
手続き的な設計からオブジェクトへの変換 手続き型のスタイルで書かれたコードがある データレコードをオブジェクトに書き換え、ふるまいを分解してオブジェクトに移す
※詳細記事なし
プレゼンテーションとドメイン分離 ドメインロジックを含んでいるビュー、コントローラクラスがある ドメインロジックはモデルに移す
※詳細記事なし
階層の抽出
0264デフォルトの名無しさん
2012/08/05(日) 21:30:13.82Eclipseで名前変更した時みたいになる
0266uy
2012/08/05(日) 21:33:52.78静的型付け言語ほど、正しい変更は行なってくれないよ。
0267デフォルトの名無しさん
2012/08/05(日) 21:44:50.57>Array.addObject だけ変更したい時に、静的なら IDE にお任せすることが出来るけど、
どこにそんな素敵なIDEがあるんだろ
Eclipseなんかはインターフェース共有してたらまるごと変更されるし
NetBeansか他の環境かな?
0268uy
2012/08/05(日) 21:46:26.53最初っから、インターフェース共有してない場合の話だよ?
その場合、どうなる?
0269デフォルトの名無しさん
2012/08/05(日) 22:08:08.52Eclipseでjava.util.Listを実装してるクラスのメンバーを個別に置き換えられないように無理だよ。
全て同じインターフェース実装してるようなもんだから。
同じインターフェース継承してるクラスのメンバー名書き換えと動作は同じ。
0271uy
2012/08/05(日) 22:15:47.91一個一個変えて行かないといけないのは同じだろう?
0272uy
2012/08/05(日) 22:24:13.50同じ名前で違うものを除いて、
全て自動でに変えてくれる。
0273デフォルトの名無しさん
2012/08/05(日) 22:54:55.78{
ObjectHolder addObject( Object object );
}
これを実装してるクラスのaddObjectを個別に名前変更するにはどうしたらいいか
それを議論したほうが有用だな。動的型付言語にも応用が効くだろう
0274uy
2012/08/05(日) 23:51:36.48個別に実行するのはなんのため?
リファクタリング = 動作を変えない変更
ってことは当然知っているよね?
0275デフォルトの名無しさん
2012/08/07(火) 16:20:47.56RubyとRailsのプロジェクトが数千行の規模を超え、チームに新しいメンバーを追加したときに、
動的言語の問題が明らかになって来ました。私たちは、コーディングの時間の半分をテスト作成の
費やさなければならなかったのです。
Railsによって得られた生産性の向上は、テスト作成の作業に失われてしまいました。
作成したテストの多くは、Javaであれば不必要なものでした。テストの大半は、
リファクタリングによってメソッド名やパラメータの数を変更した際に、
呼び出し元が正しく変更されているかを確認するためのものでした。
0276デフォルトの名無しさん
2012/08/07(火) 17:51:37.74このソースは「型推論を備えた関数型言語」であるScalaの優位性を
説明するのには適しているけど、単なる静的型付け言語の優位性を
説明できていないよね
なぜって、Rubyから移行したのは「Javaではなく」Scalaなのだから....
この書籍の著者は、なぜ「型推論の無い手続き型言語」であるJavaへ
移行しなかったんだろねwww
結論は「Ruby(静的型付け) >> Java(動的型付け)」だろ
つまり型推論の無い静的型付け言語はゴミってことさ
0277276
2012/08/07(火) 17:53:15.39訂正する
>>276
X: >結論は「Ruby(静的型付け) >> Java(動的型付け)」だろ
O: >結論は「Ruby(動的型付け) >> Java(静的型付け)」だろ
0278デフォルトの名無しさん
2012/08/07(火) 19:04:06.02Scala(静的型付け,型推論) >> Java(静的型付け) >> Ruby(動的型付け)
0279デフォルトの名無しさん
2012/08/07(火) 20:21:51.370280デフォルトの名無しさん
2012/08/07(火) 20:38:16.01シェアも下がって来てるし完全にオワコン
0281デフォルトの名無しさん
2012/08/07(火) 20:40:01.70>テストの大半は、リファクタリングによって
0282デフォルトの名無しさん
2012/08/08(水) 07:00:01.06Androidもそのうちnaclベースになるだろうし衰退が加速してるな
0283デフォルトの名無しさん
2012/08/09(木) 11:15:46.46プログラミング言語は使用ユーザー数
ライブラリ数
つまり、宗教
優秀な人材集めての少人数や、一人で何かを開発するならば自分らが最も使いやすい言語、
普通それは"動的言語"になる。 確実にね
いっておくが、本当に速度が必要になるケース以外で
そこんところにC#だのJAVAだの来るってのは大抵何かを間違ってるか
ただ環境を整えられる知識がないだけ
実は速度の問題に関しても、問題になる部分のみをCでかいてライブラリ化して動的言語から扱うのが一番良い
技術さえあるなら動的言語1択
0284デフォルトの名無しさん
2012/08/09(木) 11:35:24.32いいえ
0285デフォルトの名無しさん
2012/08/09(木) 13:23:14.620286デフォルトの名無しさん
2012/08/09(木) 15:02:37.990287デフォルトの名無しさん
2012/08/09(木) 17:15:11.98適正無さすぎだから論じるに値しない
0288デフォルトの名無しさん
2012/08/09(木) 20:03:19.10ドカタより下は残念ながら存在しません
あなた方が最底辺なのです
0289デフォルトの名無しさん
2012/08/09(木) 21:01:47.59動的言語というとlispやRoot上でのC++か。
0291uy
2012/08/09(木) 21:31:49.31コードに書くべき情報を省略できる言語。
書くべき情報ってのは型情報なわけだが。
省略できるから一見開発効率がいいように思えるかもしれないが、
静的型付け言語ならコードを見ればわかった情報がわからないということでもある。
自分一人で書いたようなコードなら、情報が欠落していても、
覚えてるかもしれないが、他人が書いたコードを読むときは困る。
コード全体を探索して変数に何が入りうるか
調べないといけないし、それがわかってコメントに、
「この変数は○型です」なんてかこうものなら
静的型付け言語使えよという話になる。
0292デフォルトの名無しさん
2012/08/09(木) 22:30:02.83動的言語は1人 or 少人数(優秀) での開発に限ると
逆に1人で開発するにもかかわらず、静的言語で開発するメリットはない
自分で書いたコードの型情報なんて流石に覚えてるだろう
ただ覚えきっている情報を常に見て書いて間違わないように組み立てなきゃいけなくなるだけ
妥協しても、せめて型推論が強い言語だろう
1人での開発において 動的 or 型推論 以外はありえない ただのあふぉ
0293デフォルトの名無しさん
2012/08/09(木) 22:38:34.430294デフォルトの名無しさん
2012/08/09(木) 22:57:29.53誰だよこんなコード書いたの。先月までの俺とは別人だぜ。
0295デフォルトの名無しさん
2012/08/09(木) 23:06:07.38>間違わないように組み立てなきゃいけなくなるだけ
0296デフォルトの名無しさん
2012/08/10(金) 00:37:39.180297デフォルトの名無しさん
2012/08/10(金) 00:46:25.89しかし動的言語での開発でおこりえる難題については実際にやらないとわからない
そう、わからないはずで上辺しか知らないはずなんだよ
知ったかすぎる
0298デフォルトの名無しさん
2012/08/10(金) 21:39:49.050299uy
2012/08/11(土) 01:29:35.80それはリファクタリングじゃないとかいうやつがでてくるからな。
正直うざい。
リファクタリングの定義。
>>255-263
少なくともこれらはリファクタリングで間違いない。
0300デフォルトの名無しさん
2012/08/11(土) 21:03:44.340301デフォルトの名無しさん
2012/08/12(日) 16:04:35.470302デフォルトの名無しさん
2012/08/12(日) 20:42:48.540303デフォルトの名無しさん
2012/08/14(火) 00:53:20.50type2_obj.add();
type2_obj.add1();
この時、type1型のadd1をaddにリファクタリングしようとすると・・・
type2のadd1までaddに書き換わってメソッド名が重複する。
うわぁ。
0304デフォルトの名無しさん
2012/08/14(火) 08:57:06.70そういうしょぼい { 環境 | 言語 | 知能 } 使ってる人は、マ辞めた方がいい。
0305デフォルトの名無しさん
2012/08/14(火) 09:52:37.570306デフォルトの名無しさん
2012/08/14(火) 10:16:57.410307デフォルトの名無しさん
2012/08/14(火) 10:30:51.97リファクタリングには向いて無いわ。
0308デフォルトの名無しさん
2012/08/14(火) 22:19:04.89変わっちゃ困るなら始めから同じ名前にするな
Objective-CやPharo系の様にリファクタリングして重複しないよう管理しろ
0309uy
2012/08/15(水) 01:14:58.46そういう奴らは少なくともスキルは低くない
0310uy
2012/08/15(水) 02:01:44.57そういう奴らは少なくともスキルは低くない
0311デフォルトの名無しさん
2012/08/15(水) 07:02:26.84type1とtype2がまったく関係なく
それぞれ違う人が書いてたらどうすんの?
それとも一人で作るのが前提なのか?
0312デフォルトの名無しさん
2012/08/16(木) 06:10:46.24リファクタリングして統一
サードのライブラリーなら別リンケージに置いて隔離
また言語標準を無視してるものは避ける
0313デフォルトの名無しさん
2012/08/16(木) 06:12:55.43>サードのライブラリーなら別リンケージに置いて隔離
>また言語標準を無視してるものは避ける
サードのライブラリーなら言語標準を無視してるものは避ける
どうしても必要なら別リンケージに置いて隔離
0314uy
2012/08/16(木) 21:23:44.02だから最初は少し必要以上に長く名前を付けてどこともかぶらないようにする
あとからよく設計を考えて使いやすい名前にailiasする
って感じのことを俺はやってる
0315デフォルトの名無しさん
2012/09/13(木) 00:46:52.09SenderやらImplementerボタン一発でメソッドに依存するメッセージや
メッセージ送りつけてるクラスを列挙してくれる
インタプリターが使える言語もインタプリター自体に
リファクタリング機能搭載すりゃコンパイラー向け言語とは
比べ物にならん恩恵を得られるんだろうにな
0316デフォルトの名無しさん
2012/09/13(木) 14:09:52.35スタックフレームがファーストクラスオブジェクトなのがサイコー。
おかげで、デバッガで実行中メソッドのソース修正してそのまま続行とか楽勝なのがイイッ!
0317uy
2012/09/13(木) 20:33:49.390318デフォルトの名無しさん
2012/09/13(木) 20:41:09.28プロジェクトの規模が大きくなるほど幾何級数的に効率が落ちていくのは自明だと分かりそうなもんだけど。
ちゃんとTDDすればいい(キリッ じゃねーだろ。解決になってねーから。
計算機科学の知見も完璧無視だしさー
なんなんですかね、この最近の動的言語ブーム。
やはり悪の権化JavaScriptが間違って覇権言語になっちまったせいですか?
0319デフォルトの名無しさん
2012/09/13(木) 23:04:27.25型付きでできることだけに頓着してりゃ安全なのは当たり前だってそろそろ気づけよ。
逆に動的型で静的型と同じ制限された事しかしないならどうやったって非効率
0320デフォルトの名無しさん
2012/09/13(木) 23:14:11.690321デフォルトの名無しさん
2012/09/13(木) 23:14:42.22そこら辺に書いたソースの切れ端をdo itで即座に実行できるじゃん
あれって特にコンパイル単位ってきまってないんじゃないか?
0322デフォルトの名無しさん
2012/09/13(木) 23:17:34.44処理系自体がリファクタリング機能をもった環境つかってみな。
コンテキストを処理系自体が理解してるってのは大きく違う
一度でも使ったことがあるならそんな発言しなくなるだろう
0323デフォルトの名無しさん
2012/09/14(金) 00:04:41.83do it とか print it っていうのは、評価対象のコードをメソッドとして
コンパイルして、そのコンテキストの self のクラスに DoIt というメソッドとして
追加して、あらためて self に対して DoIt というメッセージを送るということを
やっていたりします。
0324デフォルトの名無しさん
2012/09/14(金) 00:42:15.470325デフォルトの名無しさん
2012/09/14(金) 01:53:14.430326デフォルトの名無しさん
2012/09/14(金) 01:57:25.370327デフォルトの名無しさん
2012/09/14(金) 02:26:03.100328デフォルトの名無しさん
2012/09/14(金) 02:32:23.31処理はすべてメソッドってんならわかるんだけど、あえてブロックと言い換えた
理由がちょっと分からなくて。メソッドと書くつもりでブロックと書いてしまったとか?
0329デフォルトの名無しさん
2012/09/14(金) 05:52:34.44ほんとに妄想ひどいよね君
0330デフォルトの名無しさん
2012/09/14(金) 22:19:32.46アセンブリレベルで考えたら何でも処理ブロック単位じゃん。
実装レベルで堀下げて行けば結局〇〇でしょってパターンになるよねって言いたかったの。
高レベル、概念的なレベル、人間が知覚してるレベルで言えばソースの切れ端が
コンパイル&実行されてる感覚じゃない?
0331デフォルトの名無しさん
2012/09/15(土) 00:50:48.81> ソースの切れ端がコンパイル&実行されてる感覚
んーと。君の考えるSmalltalkにおいて、ソースの切れ端(do itされるコード片?)は
メソッドオブジェクト(CompiledMethodのインスタンス。実体はバイト列)以外の何に
“コンパイル”された後に実行される感覚が高レベル、概念的なレベル、人間が知覚してる
レベルで自然なのかを教えてもらえたりできる?
0332デフォルトの名無しさん
2012/09/30(日) 00:09:25.65高レベル、概念的なレベル、人間が知覚してるレベルで自然だと思うよ
どう実装されてるか低レベルな部分なんてどうでもいいしね
低レベルな実装はライブラリーによって変わるし
もしかしたら、インタプリター実行する実装もあるかもしれない
ましてや、SqueakやPharoとか自分で書き換えられるわけで
低レベルの実装なんてどうでもいいじゃん
0333デフォルトの名無しさん
2012/09/30(日) 00:43:27.17そんなイメージってこと?
0334デフォルトの名無しさん
2012/09/30(日) 01:22:05.210335デフォルトの名無しさん
2012/09/30(日) 09:12:01.04書き換えてどんどん変化させられるという特性は、処理系を可能なかぎり低レベルまで
Smalltalk自身で表現することで、ユーザーがそれを積極的に学べるようにする工夫の結果ゆえ
http://bit.ly/aOCyGy なので、「低レベルとか実装なんてどうでもいいじゃん、
言語処理なんかアセンブルレベルの処理ブロックに帰結できるし、実際にもそういう
イメージで十分だし不都合は感じない」ってスタンスで処理系に接している人には
>>316みたいのをメリットとして共感や実感はされにくいだろうなと分かった
0336デフォルトの名無しさん
2012/09/30(日) 09:21:36.410337デフォルトの名無しさん
2012/09/30(日) 10:11:36.41後に生まれた言語では「あえて」外されてる
Gotoがあったら便利、とか言ってるアホと同じ
0338デフォルトの名無しさん
2012/09/30(日) 11:20:06.73そもそも、リファクタリングのアイデアやそれをサポートする機能は
Smalltalkにおいて、処理系の特性や仕組みを理解し自分の手でどんどん改善したり、
ソースはもちろんコンパイルされたコードもオブジェクトとして扱える環境があって
育まれえたわけで、いちがいにSmalltalk独自の動的性というのは害悪ばかりではないよ
0339デフォルトの名無しさん
2012/09/30(日) 11:24:51.26可読性を下げる
0340デフォルトの名無しさん
2012/09/30(日) 11:49:01.84言語のユーザーに徹するスタンスからはそうなんだろうけど、
一方で、せっかく動的でリフレクティブな性格をそこそこ備えた
PythonやRubyとかの言語であっても、あるいは静的型だけどオブジェクトの動的性は
Smalltalkに非常に似たものを持っているJavaなどの言語でも、
Smalltalk程度のリファクタリング機能やデバッグ機能の実装が必要以上に複雑になったり
そもそも実現自体が困難になってしまっているという残念感もある。
0341デフォルトの名無しさん
2012/09/30(日) 12:30:41.82多分俺とは視点が違うね。
オブジェクトに対しメッセージを送るとき、そのオブジェクトは何者であるかあまり期待しない。
俺はそれの延長線として低レベルはどうでもいいと思ってる。
あと、インタープリターといったのは処理系自身というより、Smalltalk上でインタープリターと
して実現されてたらという話。機械語レベルの話は例として出してただけでそっちに執着してるわけじゃない。
重要なのは実装はどうでもいいってとこ。
君は、Smalltalkがライブラリーで物理的に実装してる事をいいたいんだろう。
んで、実際の実装はメソッドを使ってる事が多いからメソッド単位でコンパイルされてると
理解するのが当然だといいたいんだろ。そんで、その処理方法は公開されてるから誰でも見られる。
単に、今のライブラリーの実装・未変更な状態の実装なら確かにそうだろう。
ただ、オブジェクトにメッセージ doIt )を送る側としてはどうでもいいのよ。
0342デフォルトの名無しさん
2012/09/30(日) 12:46:42.09ソースの書き換えの話をしてるならマクロとは全然違うぞ
Linuxのソースを修正するのと変わらん
0343デフォルトの名無しさん
2012/09/30(日) 13:37:35.23そんなもんの上で動かしたコードがバグったとき
どこがオカシイか調べるのが大変なのは馬鹿でも分かる
0344デフォルトの名無しさん
2012/09/30(日) 13:51:51.330345デフォルトの名無しさん
2012/09/30(日) 13:55:59.07玩具はいろいろ弄れた方が楽しいだろ?
0346デフォルトの名無しさん
2012/09/30(日) 14:08:00.06http://smalltalk.cincom.jp/main/successes/government/
0347デフォルトの名無しさん
2012/09/30(日) 14:17:39.15とはいえ、国際色の強い企業に限られてる感じだが
http://www.cincomsmalltalk.com/main/wp-content/uploads/2009/12/Success-Graphic.jpg
http://www.cincomsmalltalk.com/main/successes/
0348デフォルトの名無しさん
2012/09/30(日) 14:20:42.910349デフォルトの名無しさん
2012/09/30(日) 14:24:54.430350デフォルトの名無しさん
2012/09/30(日) 14:25:11.21英語圏の人間ならSmalltalk環境起動さえしてしまえば、使えるから殆どマニュアルは要らん
なのでマニュアル類自体も少ない、
0351デフォルトの名無しさん
2012/09/30(日) 14:30:11.26あれはCincom SmalltalkとGemStone/SでやろうってったところにIBMが自社製品の
VisualAge Smalltalkをごり押ししてきてめちゃくちゃにした結果で、VBは漁夫の利。
0352デフォルトの名無しさん
2012/09/30(日) 14:34:08.12あんなに揉めてたのが驚き
0353デフォルトの名無しさん
2012/09/30(日) 14:35:21.030354デフォルトの名無しさん
2012/09/30(日) 14:38:26.040355デフォルトの名無しさん
2012/09/30(日) 14:41:01.47火消しでVBごときで済ませたモノと、当初の予定が同じだと思っちゃうオツムの弱さに驚き
0356デフォルトの名無しさん
2012/09/30(日) 14:42:44.61Amberとかしらんの?
0357デフォルトの名無しさん
2012/09/30(日) 14:43:54.77普及させるには何か一歩足りないよな
0358デフォルトの名無しさん
2012/09/30(日) 14:44:55.82AIDA/Webとかしらんの?
0359デフォルトの名無しさん
2012/09/30(日) 14:47:43.800360デフォルトの名無しさん
2012/09/30(日) 14:48:51.72とにかくオブジェクト指向技術で作りたかったんですよね
オブジェクト指向技術で作る事にメリットがあるとか、そういう理由じゃなくて
0361デフォルトの名無しさん
2012/09/30(日) 14:50:21.85Smalltalkはゴミだった、ってことだよね
0362デフォルトの名無しさん
2012/09/30(日) 14:50:34.800363デフォルトの名無しさん
2012/09/30(日) 14:54:19.63こういうのは滅びない程度に秘密兵器的に使われてTraitsとかClassboxesとか
ときたまその中の頭のいい人が新機軸を打ち出してくれるのがいいのであって
0364デフォルトの名無しさん
2012/09/30(日) 14:55:35.34違うよ。火消しの頃にはもうオブジェクト指向とかどうでもよくなってて、
DBのフロントエンドをVBで書いただけ。
0365デフォルトの名無しさん
2012/09/30(日) 14:58:48.770366デフォルトの名無しさん
2012/09/30(日) 15:01:24.69ケント・ベックがなんやかや偉そうなことを言ってても、
けっきょくCOBOLをSmalltalkで置き換えられなかった話しのほうが
Smalltalkダメダメじゃん的エピソードとしてパンチがあると思うんだがなぁ…
0367デフォルトの名無しさん
2012/09/30(日) 15:02:52.820368デフォルトの名無しさん
2012/09/30(日) 15:09:01.50どんな言語でも完全に置き換えられてないと思うが。
それは別としてその話どこに書いてある?どんな見解か読みたい。
あと、VB vs Smalltalkな話も読んで見たいんで誰かソース教えて。
0369デフォルトの名無しさん
2012/09/30(日) 15:14:07.89http://d.hatena.ne.jp/kwatch/20080702/1215014534
0370デフォルトの名無しさん
2012/09/30(日) 15:20:21.800371デフォルトの名無しさん
2012/09/30(日) 16:24:29.60そしてRubyとかPHPとかあたりがありがたくパクるというエコシステム
0372デフォルトの名無しさん
2012/09/30(日) 16:34:58.83thanx
0373デフォルトの名無しさん
2012/09/30(日) 17:19:52.57> 企業(日本IBM)の根幹にかかわる問題のため」と説明した。関係者によると,契約の条文に
> 「(システムのユーザーなどが)何らかの理由でジェムストーンを訴えた場合,
> メイン・コントラクタ(主契約者:もし日本IBMがジェムストーンと契約を結ぶ場合には日本IBM)
> がすべての法的な対応を行わなければならない」という内容が含まれており,日本IBMがそれに納得できなかったためという。
> 料金面でも折り合わなかったようだ。ジェムストーンのコンサルタントが九大病院に滞在したのは3カ月だが,
> コンサルタント8人の経費やソフト・ライセンス料などで,数億円近くを要求したとされる。
カス過ぎワロタ
0374デフォルトの名無しさん
2012/10/13(土) 14:37:20.05滅びて本当に良かった
0375デフォルトの名無しさん
2012/10/13(土) 14:58:03.410376デフォルトの名無しさん
2012/10/13(土) 15:18:58.18VisualWorksのチュートリアルにすら辿り着けてない奴だよきっと
0377デフォルトの名無しさん
2012/10/13(土) 16:44:44.94他言語と比べてあまりにもゴミだったから使われなくなったと
そういうことですね、分かります
0378デフォルトの名無しさん
2012/10/13(土) 18:33:04.510379デフォルトの名無しさん
2012/10/13(土) 18:46:14.21http://redmonk.com/sogrady/2012/09/12/language-rankings-9-12/
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
0380デフォルトの名無しさん
2012/10/13(土) 18:57:50.94検索回数とWeb上の記事数とかで出した値を真に受けるとか高校生かよ
0381デフォルトの名無しさん
2012/10/13(土) 19:01:03.480382デフォルトの名無しさん
2012/10/13(土) 19:07:49.17よく話に出てるのは、Smalltalk系ツールの中で使われてるスクリプト用?言語(むしろシェル?)。
言語じゃなくPharoとかVisualWorks、Squeakなんかが出てくる資料で調べないと意味がない。
bashとかzshで調べるよなもんだ。
0383デフォルトの名無しさん
2012/10/13(土) 19:10:28.14Smalltalk系はソースコードで管理してないからGitHub使えんだろ
極一部例外としてGNU Smalltalkってマイナー環境があるけどマイナーすぎる
0384デフォルトの名無しさん
2012/10/13(土) 19:14:16.32https://github.com/search?q=VisualWorks
https://github.com/search?q=Squeak
https://github.com/search?q=Pharo
wwwwwwwwwwww
0385デフォルトの名無しさん
2012/10/13(土) 19:36:16.73Smalltalk系はイメージで管理する独自のリポジトリーがあるからな
普通そっち使うわ
0386デフォルトの名無しさん
2012/10/13(土) 19:39:06.14http://map.squeak.org/
wwwwwwwwwwwwwww
0387デフォルトの名無しさん
2012/10/13(土) 19:47:38.240388デフォルトの名無しさん
2012/10/13(土) 19:48:11.160389デフォルトの名無しさん
2012/10/13(土) 19:54:09.95古いゴミばっかりだけど
0390デフォルトの名無しさん
2012/10/13(土) 19:59:27.32独自仕様で囲い込みに走るのは
ヘボい技術全般の特徴
0391デフォルトの名無しさん
2012/10/13(土) 20:10:56.14やっぱ企業ゴリ押しかUnix likeな言語じゃないと流行らんのだろうな
0392デフォルトの名無しさん
2012/10/13(土) 21:45:11.88msの悪口はそこまでだ。
0393デフォルトの名無しさん
2012/10/14(日) 16:38:20.44動作が変わっていないことを、
確かめるツールがあるといいのに。
0394デフォルトの名無しさん
2012/10/14(日) 16:59:49.630395デフォルトの名無しさん
2012/10/14(日) 17:04:52.35それは人間がやらないといけないからコストがかかる。
コードの動作が同じであることは、
理論的には推論で求められるはず。
例えばコンパイラの最適化技術で、
コードの順番を入れ替えることがある。
これは順番を入れ替えても違いがないことを推論しているから。
なら逆に順番が入れ替わったコードを見て、
コードの動作が同じであることを推論できるはず。
つまり、コンピュータにさせることが可能。
0396デフォルトの名無しさん
2012/10/14(日) 17:46:28.60この手の論文でも読んどけ。
http://ci.nii.ac.jp/naid/110004662808
0397デフォルトの名無しさん
2012/10/14(日) 17:57:36.95やっぱりJavaか・・・。
動的言語じゃ不可能なんだろうね。
0398デフォルトの名無しさん
2012/10/14(日) 23:10:54.37> なら逆に順番が入れ替わったコードを見て、
> コードの動作が同じであることを推論できるはず。
素数の積が計算できるから
素因数分解もできるはず、レベルの暴言ですね
0399デフォルトの名無しさん
2012/10/14(日) 23:34:35.21単純な名前の変更とかも結構あるでしょ?
0400デフォルトの名無しさん
2012/11/05(月) 20:19:50.36javaだけの方が正しい
0401デフォルトの名無しさん
2012/11/05(月) 20:33:59.10名前変更とかメソッドの移動なんかの
機械的にできるしょうもないリファクタリングがメインになる
0402デフォルトの名無しさん
2012/11/14(水) 00:27:14.28手動でやるのはバカだと思うよw
0403デフォルトの名無しさん
2012/11/14(水) 09:18:19.070404デフォルトの名無しさん
2012/11/14(水) 21:22:20.450405デフォルトの名無しさん
2012/11/14(水) 21:26:21.31コンパイラが検出してくれるような部分までテスト書いてんのか?
そりゃ馬鹿らしい、というか馬鹿だわ
0406デフォルトの名無しさん
2012/11/14(水) 22:04:53.69これでいいか?
コンパイラが勝手にテストしてくれるのに、わざわざ人間がテストを実行するのって馬鹿らしいよな
0407デフォルトの名無しさん
2012/11/15(木) 14:33:21.120408デフォルトの名無しさん
2013/01/26(土) 19:33:35.21そのプログラマー馬鹿すぎw
0409デフォルトの名無しさん
2013/01/26(土) 19:36:01.14機械的にできるしょうもない作業を手動でやってたのが静的型土方w
一方、動的型使いはリファクタリング技術をつくって静的型土方に与えてやったw
0410デフォルトの名無しさん
2013/02/20(水) 18:48:21.49クラスの継承みたいなのがない
これはメリットにもなるがデメリットにもなる
人間だもの、間違いだって起こすさ
ソース中で誤って違う型の変数を渡したりしていても分かりにくい
0411デフォルトの名無しさん
2013/02/20(水) 18:50:36.10そんなミスはしないとか、
テストツールを作ればいいとか言うが本当にそうかね
0412デフォルトの名無しさん
2013/02/20(水) 18:52:39.71初めから静的型付け言語で開発すればいいじゃない
実行時コンパイラ - Wikipedia
http://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9#JavaScript.E3.81.AEJIT.E3.82.B3.E3.83.B3.E3.83.91.E3.82.A4.E3.83.A9
0413デフォルトの名無しさん
2013/02/20(水) 20:06:13.93これ有り難がってる低能もマジうんこ
0414デフォルトの名無しさん
2013/02/20(水) 20:30:44.120415デフォルトの名無しさん
2013/02/20(水) 20:48:43.16それが分からない低能だけが継承を有り難がる
0416デフォルトの名無しさん
2013/02/20(水) 20:57:38.88それが既存のツールで出来るのなら問題ないが
みんな自分で作ってんの?
いくら継承要らずで書きやすいって言ってもね〜
0417デフォルトの名無しさん
2013/02/20(水) 21:11:17.950418デフォルトの名無しさん
2013/02/20(水) 21:12:07.57単体試験で渡す時のStab型に最低限の関数を持たせとけば良い。
0419デフォルトの名無しさん
2013/02/20(水) 21:14:00.02静的型付でもgoを始め、継承のない言語は存在するぞ。
C++も継承はかなり避けられる。
0420デフォルトの名無しさん
2013/02/20(水) 21:29:45.32単体試験に問題がない
(テストケースを全て網羅している)
という証明はどうすればいいの?
0421デフォルトの名無しさん
2013/02/20(水) 21:44:56.40静的型付でも検査項目に漏れが発生するのは同じでしょ
意図が判らん。あと静的型付でもどのみち試験しなきゃならん。
0422デフォルトの名無しさん
2013/02/20(水) 22:00:20.47そうだよ。
だから「テストを使ったリファクタリングのリグレッションテスト」は
信用出来ないわけ。
つまり、テストを使わないでリファクタリングの
修正の安全性を担保する方法が必要になる。
そこででてくるのが、コンピュータによる静的解析で
修正の安全性を担保するリファクタリングブラウザ。
0423デフォルトの名無しさん
2013/02/20(水) 22:04:45.21例えば関数の引数を一つ増やした時に
コンパイルすれば、修正が必要な箇所がわかる。
0424デフォルトの名無しさん
2013/02/20(水) 22:07:43.12テストだけ
VS
テスト + リファクタリングブラウザ + コンパイラ
たとえばテストが漏れていてリファクタリング結果に問題がるのにOKになってしまった。
こういうことは起こるわけで、
そんな状態であっても、リファクタリングブラウザやコンパイラを使ってれば問題を回避できる可能性が高い
0425デフォルトの名無しさん
2013/02/20(水) 22:24:08.62Twitter社の中心プログラマーのスキルが低いとは思えないけど。
0426デフォルトの名無しさん
2013/02/20(水) 22:25:36.49静的解析なら動的型付言語でもできるじゃん。
ちょっと動的型付と言うには違和感あるけどSmalltalkとかね。
>コンパイルすれば、修正が必要な箇所がわかる。
試験実行すれば修正が必要な箇所が解るよ。
そもそも試験してない項目は仕様外だし。
例えば、開いていないStreamに対してRead messageを送ったけど何も読み込めなかった。
これは仕様外。負の値を受け付けない関数に負の値を渡した。これも仕様外。
0427デフォルトの名無しさん
2013/02/20(水) 22:33:55.51出来るできないの話じゃなく、
どれだけ正確にできるかって話
動的型付け言語と静的型付け言語の
間には乗り越えられない大きな壁がある。
0428デフォルトの名無しさん
2013/02/20(水) 22:35:23.19その後デバッグするんだろう?w
テストでエラーに成った。エラーに成ったがその原因はわからない。
いまから何が起きたのか、デバッグを行う。
静的型付け言語であれば、しなくてもいいものをする必要があるんだよな。
0429デフォルトの名無しさん
2013/02/20(水) 22:37:24.25試験してない理由が、
試験漏れということもある。
試験方法が間違っている場合もある。
テストが完璧である保証は何処にもない。
100%完璧なものはないが、
より完璧に近い方法というものは存在する。
0430デフォルトの名無しさん
2013/02/20(水) 22:38:07.60そもそもRefactorするときにSignatureを頻繁に変更するもんじゃないよ。
するなら同じMessageを受け取るClass全てを変更する必要がある。
単にひとつのClassのSignatureを変更するというならそれはRefactorじゃない。
ただの開発だ。
0431デフォルトの名無しさん
2013/02/20(水) 22:40:36.68批判的根拠はあるの?どこかに動的型付から静的型付に変えたら
不具合がこれだけ減ったって統計が出てた?単に主観じゃないの?
0432デフォルトの名無しさん
2013/02/20(水) 22:43:57.52> そもそもRefactorするときにSignatureを頻繁に変更するもんじゃないよ。
リファクタリングには名前が付いている。
名前が付いているものは確実にリファクタリング。
つまり、これらはリファクタリングだ
http://www.hyuki.com/ref/#contents
http://hamasyou.com/archives/000199
メソッドの抽出
メソッドの移動
クラスの分割
ポリモーフィズムによる条件記述の置き換え
ヌルオブジェクトの導入
メソッドに関して
メソッドの名前変更
引数オブジェクトの導入
Factoryメソッドによるコンストラクタの置き換え
メソッドの引き上げ
君はリファクタリングの一部しか知らない。
だから、その一部にしか通用しないテストを過信しているんだ。
0433デフォルトの名無しさん
2013/02/20(水) 22:44:33.65不具合が減るんじゃなくて
リファクタリングにかかる時間が減るんだよ。
0434デフォルトの名無しさん
2013/02/20(水) 22:49:00.42Java厨のための劣化Refactorじゃん。
そもそもRefactorはSmalltalkから始まり動的型付言語を中心に
醸成された概念だぞ。そんな劣化したRefactorじゃなく
本家のRefactorを根拠にしてくれないか。
0435デフォルトの名無しさん
2013/02/20(水) 22:50:00.14なにいってんの?
Smalltalkのリファクタリングブラウザに
すでにこれらの機能があるんだが?
0436デフォルトの名無しさん
2013/02/20(水) 22:52:25.52部分的にMethodやMessageを変更するRefactorなんてねぇよ。
Pharoとか本物のSmalltalkの処理系使ったことないだろ。
0437デフォルトの名無しさん
2013/02/20(水) 22:57:21.39http://c2.com/cgi/wiki?RefactoringBrowser
The RefactoringBrowser is a tool that automates some ReFactorings for Smalltalk.
・ExtractMethod -- make a submethod out of the selected text. If there is already an equivalent method, optionally invoke that instead.
・Inline method -- put the invoked code in place of the invocation. This even works for methods in other classes.
・Move to component -- move the code for a method to another class and invoke it
・These three together are extremely powerful. For example, if I notice.
・Add parameter -- add a parameter to every implementor of a message, and to every invocation of the message (with a Default value)
・Remove parameter -- if no implementor of the message uses the parameter, remove it from the methods and the invocations
・Cross referencing from inside the source code -- select any program element in the text and you get a choice of several specialized browsers - senders/implementors of a message, readers/writers of a variable
・Rename -- you can rename classes, variables (all types), and messages
・Abstract/concrete instance variables -- make all references to an instance variable go through a message, or make all references direct
0438デフォルトの名無しさん
2013/02/20(水) 22:57:24.19引数を増やすとか抽象的な話じゃなく、
具体的に例を出すとどういう場合?
0439デフォルトの名無しさん
2013/02/20(水) 22:58:53.62やっぱりSmalltalk使ったことないだろw
書いてることはEclipseなんかと似てても実際の動作は違うんだよ。
0440デフォルトの名無しさん
2013/02/20(水) 22:59:17.28> 引数を増やすとか抽象的な話じゃなく、
それ具体的じゃね?w
0441デフォルトの名無しさん
2013/02/20(水) 22:59:59.90使ったことがあるのなら「実際の動作が違う」ということを
具体的にかけるはずだよ。
ほら、書いて証明してみせてよw
0442デフォルトの名無しさん
2013/02/20(水) 23:00:04.19なんでも疎結合とかいってコストかけるだけの設計なら楽でいいな。そんなの実装するような土方にはなりたくないけど。
0443デフォルトの名無しさん
2013/02/20(水) 23:01:55.51↓
・Add parameter -- add a parameter to every implementor of a message, and to every invocation of the message (with a Default value)
・Remove parameter -- if no implementor of the message uses the parameter, remove it from the methods and the invocations
↓
似てても実際の動作は違うんだよ。
↓
今からSmallTalk版のAdd parameter, Remove parameterの
説明をしてくれるそうです
0444デフォルトの名無しさん
2013/02/20(水) 23:06:18.92コンパイラでの型チェックを積極的に使ってるよね
0445デフォルトの名無しさん
2013/02/20(水) 23:07:41.15文字列を受け取るMethodに範囲を引数として追加する必要が発生したとか。
>>441
既に書いたじゃん。部分的な変更は出来ない。全体で変更する。
もっと具体的に言うともうひとつの方法として、変更加えるClassのみ変更するってのがある。
引数や戻り値で受け取ったobjectに対するMessageは全てのClassのobjectが受け取る可能性があるからね。
0447デフォルトの名無しさん
2013/02/20(水) 23:11:24.71どういうこと?
Eclipseが部分的な変更だっていうの?
「Smalltalkが全体で変更する」で「動きが違う」ってことは
Eclipseは部分的な変更しか出来ないってことになるが?
部分的な変更ってなんだよ。
お前にしかわからない用語を使わないで
ちゃんと説明しろ。
0448デフォルトの名無しさん
2013/02/20(水) 23:14:10.83> そもそもRefactorするときにSignatureを頻繁に変更するもんじゃないよ。
結局、SmalltalkでもSignatureを変更するんじゃん。
0449デフォルトの名無しさん
2013/02/20(水) 23:24:09.11object := something selector:arg.
object example.
例えば、上みたいなどの型でobjectが得られるかわからない状態だと、
exampleに引数を追加してはいけない。もしexampleに引数を追加するなら全てのclassに対し引数を修正する必要がある。
だから、部分的な修正というのはない。修正せず新しくSomethingの戻り値を使用するMethodを追加する。
もうひとつの方法として説明したのは、あるobjectはあるClassのinstanceであると解る場合。
object := Type new.
object example.
この場合は、Refactoring Browserで自動で修正できる。
0450デフォルトの名無しさん
2013/02/20(水) 23:26:31.99矛盾はしてないでしょ。頻繁にはしない。影響範囲が大きくなりがちだから。
0451デフォルトの名無しさん
2013/02/20(水) 23:29:00.49影響範囲が把握できるなら
何の問題もないでしょ?
それに影響範囲が大きくても
やらなきゃいけないわけで。
0452デフォルトの名無しさん
2013/02/20(水) 23:29:52.51そう安易にSignatureの変更できない事なんて解ると思うけどな。
0453デフォルトの名無しさん
2013/02/20(水) 23:31:07.20それは単に、関数の作成者と
使用者が違うからだよ。
0454デフォルトの名無しさん
2013/02/20(水) 23:32:04.950455デフォルトの名無しさん
2013/02/20(水) 23:37:17.03そもそも、その修正はそこまで重要か?Smalltalkなんかの巨大なLibraryだとあくまで、
Methodの追加で済ませるのが定石。Signatureを修正するのは最後の手段だぞ。
0456デフォルトの名無しさん
2013/02/21(木) 00:00:33.07動的型付言語なんだからやっぱりリファクタリングツールも動的になる。
0457デフォルトの名無しさん
2013/02/21(木) 04:00:33.99プロジェクトローカルでないものって意味だよ。
ようは使ってる人が把握できないから
古い関数を残す。
誰も使っていないとわかれば
それは必要ない。
0458デフォルトの名無しさん
2013/02/21(木) 04:02:42.31> それは別としても30箇所以上で使用しているClassのMethodなんかを安易に変更するか?
数は関係ない。(変更前のものを)誰も使っていないとわかればそれは要らない関数消していい。
誰も使っていないことを把握してからやるから、これは安易な変更ではない。
どうやって(動的型付け言語で)誰も使ってないことを証明するんだよ?と
聞かれれば、そりゃ静的型付け言語の方がリファクタリングしやすいって話だからねぇ。
ということになる。
0459デフォルトの名無しさん
2013/02/21(木) 07:23:38.64引数増やしたら便利だなーってなったら(当然、増やさなくても動く。リファクタリングなんだから)
ソースコード全部を変更して廻るんだよ
クローズドな小規模開発なら、それでもいいかもね
0460デフォルトの名無しさん
2013/02/21(木) 20:07:39.61静的型で可能なリファクタリングと
動的型で可能なリファクタリング、
どっちが種類が豊富だと思う?
0461デフォルトの名無しさん
2013/02/21(木) 21:11:23.32そもそも何で関数消しまくったりするハメになるの?
ちなみに、動的型付言語でも誰も使ってない関数を消すことは簡単だけど。
呼び出しを変更するのは難しいけどね。
0462デフォルトの名無しさん
2013/02/21(木) 21:22:35.94誰も使ってないinterfaceのメンバー関数を消すのは簡単でしょ。
動的型付言語でも呼び出しの一切ないメソッドやらメンバー関数を消すのは簡単。
メッセージ送信が存在しないことを調べりゃいいだけだもんね。
そうでなくても、全ての制御経路を走査して使用していないメソッドやらメンバー関数を
見つける動的リファクタリングツールなんてのもある。
0463デフォルトの名無しさん
2013/02/21(木) 21:48:13.21クラスがない言語であれば
メソッドの引き上げなどがないから
言語仕様が多いほど種類は増える。
だけどその場合メソッドの引き上げじゃなくて、
メソッドの移動という名前になるだけで
本質的に違いはない。
動的と静的で変わるのは、リファクタリング
するときにかかる時間。これが大きく違う。
0464デフォルトの名無しさん
2013/02/21(木) 21:53:06.860465デフォルトの名無しさん
2013/02/21(木) 21:53:40.69> 動的型付言語でも呼び出しの一切ないメソッドやらメンバー関数を消すのは簡単。
問題は「呼び出しの一切ないメソッドやらメンバー関数」を
どうやって探すかだよ。
Javaであれば、コンソールに使用されていない変数などが表示される。
コンパイラの力を借りれば、使用されていないかどうかがわかるという仕組み。
仮に使用しているメソッドを削除したら、コンパイル時にエラーが出る。
これと同じ事が動的言語で出来るのかといえば、
できなくはないが、時間が大きくかかる。
0466デフォルトの名無しさん
2013/02/21(木) 21:55:40.33> どちらもリファクタリングツールを使った場合どれぐらい時間が変わるんだい?
例えばSmalltalkであれば、実行して該当行に来ないと
リファクタリングツールは利用できないことがある。
ツールを使ってからの時間であれば、どちらも大差ないが、
そのツールが利用できるようになるまでの時間が違う。
さらにツールが利用できない場合すらある。
それが動的言語だと顕著に多い
0467デフォルトの名無しさん
2013/02/21(木) 22:12:13.56プロジェクトローカルなら、セレクターとメソッド一括置換すりゃええんちゃうの?
外部ライブラリーと仕様が異なるなら、そのメソッドは外部ライブラリーと違う名前にリファクタリングしときゃえんちゃうの?
後で外部ライブラリー追加してセレクターの名前が重複しそうになった時も、外部ライブラリーのセレクター記述する前に、
プロジェクトローカルなセレクターとメソッドの名前を重複しない名前にリファクタリングしときゃええんちゃうの。
0468デフォルトの名無しさん
2013/02/21(木) 22:15:08.26全く同じスペルだけど意味が違うものがあったらどうするんだ?
スペルが同じ=全く同じもの。という言語は少ないだろ?
例えばgetとかいうメソッドを全部get_by_nameに置き換えていいと思う?
コメントも入れれば更に大変なことになるだろうし。
0469デフォルトの名無しさん
2013/02/21(木) 22:18:10.10自前のコードは一意に管理しとけば十分でしょ。
リファクタリングの都合以前に、動的型付言語でOOを活かすなら
常に、一意になるように管理しとかなきゃいけない。
それがリファクタリングが必要な理由の一つでしょ。
0470デフォルトの名無しさん
2013/02/21(木) 22:18:20.98間違った設計を正すのがリファクタリングだからな。
だからリファクタリング前の前提として、今の状態が間違っている。というのがある。
間違いだから、どんな間違いだって犯すさ。
0471470
2013/02/21(木) 22:19:40.52一意になるように管理しとかなきゃいけない?
そうだとしても、間違えてしまったんだからしょうがないだろ。
間違ってるのを直すのがリファクタリングだ。
0472デフォルトの名無しさん
2013/02/21(木) 22:30:54.89それまでの間にいくら間違っても問題ないよ。
それと外部ライブラリーとの干渉のチェックぐらいは自動化させときゃいい。
そもそも、ある程度なれたプログラマーならそういうチェックは習慣になってなきゃ。
そうじゃないと、OOを上手く生かせない。
0473デフォルトの名無しさん
2013/02/21(木) 22:41:26.73名前付きインポートなしで、オーバーライド不可な言語なら、外部ライブラリとの名前衝突は常に調べとかないと
静的型付でもgoやC++みたいな言語でもある程度同じ事を考えとく必要があるしね。
0474デフォルトの名無しさん
2013/02/21(木) 22:54:30.93書く前に直せるのは、書く前に気づいた場合のみ。
気づいてないから間違えた。
気づいていないものをどうやって書く前に直すのか?
0475デフォルトの名無しさん
2013/02/21(木) 22:56:19.11名前空間があるのは、
クラス名だけじゃ衝突するからだぞ?
わかってるのか?
常に名前空間省略するなというのかよ。
0476デフォルトの名無しさん
2013/02/21(木) 22:56:31.55ライブラリーのバージョン上がった時に基底クラスのメンバーを勝手にオーバーライドしたり、
新しく導入した外部のライブラリーを継承しようとしたら基底クラスのメンバーを気づかずオーバーライドしてたりとか。
0477デフォルトの名無しさん
2013/02/21(木) 23:00:37.69名前空間が使えない言語ではって書いてるのに何がいいたんだろうね。
ぶっちゃけ名前空間が必要なのは、ライブラリー作者だけでしょ。
末端の利用者は自分で名前変えりゃいい。
0478デフォルトの名無しさん
2013/02/21(木) 23:02:26.76他人が作ったBというライブラリで
メソッド名がかぶっていたらどうするの?
0479デフォルトの名無しさん
2013/02/21(木) 23:03:36.21> ライブラリーのバージョン上がった時に基底クラスのメンバーを勝手にオーバーライドしたり、
> 新しく導入した外部のライブラリーを継承しようとしたら基底クラスのメンバーを気づかずオーバーライドしてたりとか。
はい、当然それを検出するための機能がJavaにはあります。
0480デフォルトの名無しさん
2013/02/21(木) 23:05:08.10防ぎようがないんだよ。
だから、被っても問題が出ないように
言語仕様を作るわけ。
かぶったらお手上げだー
かぶらないように気をつけなきゃー
といってる時点で劣ってるよ。
0481デフォルトの名無しさん
2013/02/21(木) 23:08:54.83そうですか。ありましたか。それ以前に検出できるかどうかは問題ではないんですが。
0482デフォルトの名無しさん
2013/02/21(木) 23:12:35.09言語機能で衝突を検出する→名前を変える
ツールで衝突を検出する→名前を変える
0483デフォルトの名無しさん
2013/02/21(木) 23:22:45.57そんな言語PL/Iぐらいしか無いだろ
名前空間のある言語は名前空間ぶつかるし。
0484デフォルトの名無しさん
2013/02/21(木) 23:31:52.19もうちょっと具体的な話していい?
これは実際にあったPythonでの開発の話なんですけど、
幾つかの関数でメモ化を使ってるのが見つかったので、
リファクタリングしてデコレータで共通化したんですよ。
@memorize
def f(x, y):
って感じで、@memorizeを付けるだけで関数がメモ化されるように。
こういうリファクタリングって需要あると思うんだけど、
他の言語ではどうやって書いてるのか興味あるので教えてください。マクロ?
0485デフォルトの名無しさん
2013/02/21(木) 23:40:05.49PharoとかObjective-Cとか。
0486デフォルトの名無しさん
2013/02/21(木) 23:47:13.700487デフォルトの名無しさん
2013/02/21(木) 23:48:33.97Javaならアノテーションだな。
http://d.hatena.ne.jp/bellbind/20050903/p2
0488デフォルトの名無しさん
2013/02/21(木) 23:49:31.52具体的にはどうするの?
0489デフォルトの名無しさん
2013/02/21(木) 23:50:46.37低レベルというが、基本的な機能ほど
よく使うんだぞ。
そういうところに時間がかからない言語のほうが
優れてる。
つまらないことほど、はやく終わらせたいだろ?
それともソース全部みるか?
0490デフォルトの名無しさん
2013/02/22(金) 00:09:57.21使用例
| memoizedObject |
memoizedObject := Memoizer allWith: TargetType new. "TargetTypeの全てをmemoizeする場合"
memoizedObject := Memoizer selectWith TargetType new selectSelectors: #(#method1 #method2) "TargetTypeの一部をmemoizeする場合"
memoizedObject exampleSelector.
全てをmemoizeする場合のMemoizerの実装側はこんな感じ
doesNotUnderstand: aMessage
| result |
cache having: aMessage
ifTrue:
[
^cache at: aMessage, "前の記憶した内容結果を返す"
]
ifElse:
[
"新しい結果を採取する"
result := aMessage sendTo: target.
cache put: aMessage with: result.
^result.
].
0491デフォルトの名無しさん
2013/02/22(金) 00:16:24.29| memoizedObject |
memoizedObject := Memoizer allWith: TargetType new. "TargetTypeの全てをmemoizeする場合"
memoizedObject := Memoizer selectWith TargetType new selectSelectors: #(#exampleSelector #otherSelector) "TargetTypeの一部をmemoizeする場合"
memoizedObject exampleSelector:10. "MessageであるexampleSelector:10がMemoizeされる"
0492デフォルトの名無しさん
2013/02/22(金) 00:40:13.95| memoizedObject |
memoizedObject := Memoizer allWith: TargetType new. "TargetTypeの全てをmemoizeする場合"
memoizedObject := Memoizer selectWith: TargetType new selectSelectors: #(#exampleSelector: #otherSelector:) "TargetTypeの一部をmemoizeする場合"
memoizedObject exampleSelector:10. "MessageであるexampleSelector:10がMemoizeされる"
doesNotUnderstand: aMessage
| result |
( cache having: aMessage )
ifTrue:
[
^cache at: aMessage, "前の記憶した内容結果を返す"
]
ifElse:
[
"新しい結果を採取する"
result := aMessage sendTo: target.
cache put: aMessage with: result.
^result.
].
0493デフォルトの名無しさん
2013/02/22(金) 01:29:34.54せっかく親切に書いてくれたのに申し訳ないのだけど、よくわかんなかった。
たとえばその方法で Integer>>#factorial をメモワイズしたい場合はどういうふうにするの?
あと、PythonのデコレーターみたいにSmalltalkならPragmaを使って実現できないのかな。
Integer >> factorial
"Answer the factorial of the receiver."
<memoize>
self = 0 ifTrue: [^ 1].
self > 0 ifTrue: [^ self * (self - 1) factorial].
self error: 'Not valid for negative integers'
といった感じで元ある定義に <memoize> を書き足すだけでいいとか。
0494デフォルトの名無しさん
2013/02/22(金) 04:57:51.46システムの問題点を解決する行為なのに。
http://builder.japan.zdnet.com/db-sql/35027895/
ストレージエンジン「InnoDB」の性能も強化されている。
リファクタリングすることで、ボトルネックを最小化している。
負荷の高いオンライントランザクション処理の並行実行性能が改善され、
トランザクションと読み取りの両方のワークロードのスループットが改善しているという。
0495デフォルトの名無しさん
2013/02/22(金) 05:48:34.26Javaでリファレンス調べるのと同等レベルの
「呼び出しの一切ないメソッドやらメンバー関数」
ぐらい、Smalltalkでも一発でわかるけど、
一体いつの時代のSmalltalkの話をしている?70年代?
0496デフォルトの名無しさん
2013/02/22(金) 05:52:23.59まずは静的/動的と、クラスの有無は直交した概念だということを理解してくれ。
あと、静的型では型整合のためにできない変形も
動的型では許容されるものがあることも理解してくれ。
静的型ではこれができるが動的型ではできない、というものは原理的にない。
逆に、動的型ではできる変形が、静的型では許されない、というものはある。
0497デフォルトの名無しさん
2013/02/22(金) 07:04:39.66名前変更の手間なんて結局動的型付だろうが、静的型付だろうが
普通に運用してりゃ手間は変わらんって話が出たろうに。いつまでも粘着すんな。
0498デフォルトの名無しさん
2013/02/22(金) 22:28:43.87> 普通に運用してりゃ手間は変わらんって話が出たろうに。いつまでも粘着すんな。
手間は変わるぞ?
まず、名前の単語を選んで変換するだけで
正確に変更できるるやり方を教えてくれ。
困ってるんだ。PHPとJavaScriptとRubyで。
あるクラスのgetを違う名前に置き換えたいんだ。
でも、data.get()のdataがなんのクラスかわからないから
この場合のgetを置き換えていいかどうかわからないんだ。
0499デフォルトの名無しさん
2013/02/22(金) 22:33:18.66基本的なリファクタリングすらしてこなかったのかよ救いようがねぇな
0500デフォルトの名無しさん
2013/02/22(金) 22:35:33.03get全て変えればいいんじゃね。同じ名前ってことは同じ仕様って事だろw
0501デフォルトの名無しさん
2013/02/22(金) 22:37:20.490502デフォルトの名無しさん
2013/02/22(金) 22:38:07.420503デフォルトの名無しさん
2013/02/22(金) 22:42:00.49糞だからリファクタリングで直すんだろw
お前ちょっとわかってない。
0504デフォルトの名無しさん
2013/02/22(金) 22:42:18.80あら大変、名前を変えてみたら既にいくつかの
派生クラスが同じメソッド名つかってたわ!
なんてことでしょう!?
0505デフォルトの名無しさん
2013/02/22(金) 22:43:12.82↓
(まじだ手間が変わる。話題をすり替えないと!)
↓
そんな基本的なことも出来ないやつがバーカーバーカ
ガキかw
0506デフォルトの名無しさん
2013/02/22(金) 22:45:46.71そういうとき、動的言語だとどうするの?
静的型付け言語だと、静的に型がわかるので
data.get()とかかていても、
あー、dataは○型だね。○型のはインターフェースAを使ってるね。
インターフェースのAを変えたってことは、この箇所のdataのget()も
書き換えないといけないねって
高度な推論が可能なのに!
0507デフォルトの名無しさん
2013/02/22(金) 22:48:04.13保守しやすくするのと、OOを最大限活かすためだが。
例えば、メソッドの名前変更。同じSignatureで意味の異なるメソッドが
存在する状態になると多態性を生かした既存のメソッドの再利用ができなくなる。
継続的に、ソースの柔軟性を保つために動的型付言語で発展してきた技術だ。
0508デフォルトの名無しさん
2013/02/22(金) 22:49:34.80そういう状態に陥らないようにリファクタリングしとくんじゃん
0509デフォルトの名無しさん
2013/02/22(金) 22:51:05.67どうやって?
名前を変える前に、既にいくつかの派生クラスが
同じメソッドを使っていたかどうかを
調べる方法を答えなさい。
なお、他人が作ったもので、すでに
名前がかぶっているなど、
起こり得ることは全て起こるのが前提です。
0510デフォルトの名無しさん
2013/02/22(金) 22:53:43.33> 例えば、メソッドの名前変更。同じSignatureで意味の異なるメソッドが
> 存在する状態になると多態性を生かした既存のメソッドの再利用ができなくなる。
そうならないように、どうするの?
メソッド作るたびに、同じ名前にならないように全部チェックするの?
将来使うライブラリで、名前が被らないようにするには
どうすればいいの?
大変だね。名前がかぶっても問題ない言語もあるのに。
0511デフォルトの名無しさん
2013/02/22(金) 22:54:51.87徐行して通りました。
だから安全です。
みたいな事言ってる奴がいるなw
0512デフォルトの名無しさん
2013/02/22(金) 22:59:28.01既に崩壊してる状態とかなにいってんの?
あと、他人が同じプロジェクトで開発してるなら、常にリファクタリングさせるし、
他人がまったく別の組織ならそのソースには手を付けないわ。その場合は、
その他人とこっちの管理下のソースのメソッドが仕様が異なるのに名前が同じにならないよう
リファクタリングを行なっておくがね。
0513デフォルトの名無しさん
2013/02/22(金) 23:02:24.69動的言語だと大変なんだよね。
名前がかぶってもわからないぐらいだし。
0514デフォルトの名無しさん
2013/02/22(金) 23:02:29.85Gtagsとかそれ関連のツールつかっとけばいいよ。
そういうツールつかうなってなら、静的型言語もツール使わず
リファクタリングするのかいって話になるけど。
>将来使うライブラリで、名前が被らないようにするには
>どうすればいいの?
何が言いたいのか判らん
0515デフォルトの名無しさん
2013/02/22(金) 23:04:30.180516デフォルトの名無しさん
2013/02/22(金) 23:12:49.59セレクターの入力補完とか使えば簡単じゃん
新規にライブラリーを追加する場合・・・ライブラリーを追加して外部のセレクターを書こうとした際、
入力補完にプロジェクト内のセレクターの名前が出てきたら
即リファクタリング
今使っているライブラリーと新規に ・・・入力補完でセレクター名が出てくる、仕様が同じなら同じメソッド名を使い
追加したメソッド名が重複しそうな場合 異なるなら、まだ未使用の別の名前を付ける。
0517デフォルトの名無しさん
2013/02/22(金) 23:17:29.46そうじゃないプログラムの時はどうしようもない。
0518デフォルトの名無しさん
2013/02/22(金) 23:30:04.180519デフォルトの名無しさん
2013/02/23(土) 00:30:51.34>たとえばその方法で Integer>>#factorial をメモワイズしたい場合はどういうふうにするの?
| value integer result |
interger := 3.
value := Memoizer selectWith: integer selectSelectors: #(#factorial:)
iresult := value factorial:2.
こんな感じ。今回のやり方だとobject生成の際にMemoizerのobjectでIntergerのobjectを明示的に包んでいるが、
Memoizerを継承してInterger風に振る舞うclassを作ればobject生成の際にMemoizerで包む処理を明示的に
記述する必要が無くなる。
ちなみにSmalltalkの機能を存分に活かすと、methodを入れ替える事ができるんで、Memoize用に既存の
methodをwrapしてclassに再代入し直すようなclassを用意すれば更に少ない記述量でMemoizeできるようになる。
ただ、そっちの実装は長くなるんでココに書く気力はない。
0520デフォルトの名無しさん
2013/02/23(土) 07:28:56.92> 名前がかぶってもわからないぐらいだし。
それは動的型言語のせいじゃない。
おまえがツールの使い方を知らないだけ。
アウストラロピテクスからやり直せ。
0521デフォルトの名無しさん
2013/02/23(土) 07:34:07.12>data.get()とかかていても、
>あー、dataは○型だね。○型のはインターフェースAを使ってるね。
>インターフェースのAを変えたってことは、この箇所のdataのget()も
>書き換えないといけないねって
>高度な推論が可能なのに!
…そうか、そんな簡単な作業すら静的厨には「高度な推論」なのか…
「がんばれ」
0522デフォルトの名無しさん
2013/02/23(土) 09:35:34.49ひょっとして、人間がやるとでも思ってるのか? (w
0523デフォルトの名無しさん
2013/02/23(土) 09:40:27.19え?そもそも>>506に書いてあることは
「推論」と呼ぶに値しないほど簡単な「作業」に過ぎない
と指摘されていることも理解できないの?
もちろん、「作業」を人間がやる必要ないよねw
0524デフォルトの名無しさん
2013/02/23(土) 11:51:32.20>「推論」と呼ぶに値しないほど簡単な「作業」に過ぎない
静的型付け言語ならね。
で、動的ならどうするの?
と指摘されていることも理解できないの?
> もちろん、「作業」を人間がやる必要ないよねw
そうだよ、全て IDE なりがやってくれるから。
静的型付け言語ならね。
0525デフォルトの名無しさん
2013/02/23(土) 12:10:43.03基底クラスのメソッドを変える場合
1.変えたいメソッド名でgrepする
2.そのメソッドが属するオブジェクトを見つける
3.そのオブジェクトが基底クラスもしくはそのサブクラスであればメソッドを書き換える。
オブジェクトの型はコード見てもわからないので、newされた場所まで遡る
4.この作業をgrepで見つかった全て行で行う。
という作業をやる。間違っている所ある?
0526デフォルトの名無しさん
2013/02/23(土) 12:22:05.44アホには別のプログラミングパラダイムがある事が理解できないんだね
0527デフォルトの名無しさん
2013/02/23(土) 12:22:39.64関係ない話はしないでください。
0528デフォルトの名無しさん
2013/02/23(土) 12:26:46.930529デフォルトの名無しさん
2013/02/23(土) 12:27:16.290530デフォルトの名無しさん
2013/02/23(土) 12:28:29.96その方法じゃ、テストができないからだめだね。
テストコードっていうのは、リファクタリング前後で
全く同じ物を使わないと意味が無い。
だからメソッドを変えたいとして
それが違う名前のメソッドになるとしたら
A.新しいメソッドを作る
B.古いメソッドから新しいメソッドに処理を移譲させる
C.テストを実行する
D.テストコード以外のgrepで見つかったメソッドの変更をすべて行う
>>525の1〜4の内容
E.テストコード以外のメソッドの変更が終わったら、次はテストコードも同様にメソッドの変更を行う
F.全て終わったら古いメソッドを削除する
という工程が更に必要になる。
そう動的型付け言語ならね。
0531デフォルトの名無しさん
2013/02/23(土) 12:32:03.27動的型付け言語はリファクタリングが
難しくなっている。
0532デフォルトの名無しさん
2013/02/23(土) 12:40:15.220533デフォルトの名無しさん
2013/02/23(土) 12:45:05.12引数変更したくても出来ないから、どんどん増えて行ったり。
0534デフォルトの名無しさん
2013/02/23(土) 12:46:42.54基底クラスというものがない
言語ってあったっけ?
0535デフォルトの名無しさん
2013/02/23(土) 12:47:54.04増える分には問題無いだろ
grepで引っかかったものを
一つ一つ、目視で判断していけばいい。
0536デフォルトの名無しさん
2013/02/23(土) 12:48:59.72今は”メッセージ"がない言語の話をしています。
言い換えるとRuby、PHP、Perl、Pythonなどです。
だって、よく使われてる言語で話さないと机上の空論になるからね。
0537デフォルトの名無しさん
2013/02/23(土) 12:54:35.57メソッドオーバーロード出来ないのもキツイな。
0538デフォルトの名無しさん
2013/02/23(土) 12:57:53.34やっぱり動的型付け言語は
リファクタリングをするのに
時間がかかるね。
0539デフォルトの名無しさん
2013/02/23(土) 12:59:07.55そもそも何で基底クラスのメソッド名変えるんだっけ?
あと、別に基底クラスの派生云々関係なく全部のメソッドと
メッセージ送信変更してしまえばええんちゃうん。
メッセージの要件が、クラスごとに異なる状態ってマズイだろ。
0540デフォルトの名無しさん
2013/02/23(土) 13:04:21.00適切な名前じゃないことが、後で明らかになったから。
0541デフォルトの名無しさん
2013/02/23(土) 13:05:32.16Ruby、PHP、Perl、Pythonの用語に
変更して言ってください。
Smalltalkの話は禁止します。
(あれは他の言事は違う独立した世界だから)
0542デフォルトの名無しさん
2013/02/23(土) 13:11:12.950543デフォルトの名無しさん
2013/02/23(土) 13:12:13.580544デフォルトの名無しさん
2013/02/23(土) 13:14:00.65> という作業をやる。間違っている所ある?
間違ってるところは無い。
想像通り面倒な「作業」頑張って下さい、としか言いようが無い。
0545デフォルトの名無しさん
2013/02/23(土) 13:14:05.270546デフォルトの名無しさん
2013/02/23(土) 13:14:53.20なんで適切な名前じゃないことが後で明らかになったの?
0547デフォルトの名無しさん
2013/02/23(土) 13:15:55.52最初っから正しい道を選べるわけがないだろ?
最初から最後までずっと間違わないでプログラミングできるとでも?
0548デフォルトの名無しさん
2013/02/23(土) 13:16:35.990549デフォルトの名無しさん
2013/02/23(土) 13:17:20.78具体例を聞いてるんだけど
0550デフォルトの名無しさん
2013/02/23(土) 13:23:35.09・Python
message = MessageCapture.selector( arg1, arg2, arg3 )
message.sendTo( target )
・Ruby
message = MessageCapture.selector( arg1, arg2, arg3 )
message.sendTo( target )
・Smalltak( Squeak, Pharo )
| capture message |
capture := MessageCapture new.
message := capture selectorWith: arg1 With:arg2 With arg3.
message.sendTo: target.
・Objective-C
NSInvocation *message;
message := [MessageCapture selectorWith: arg1 With:arg2 With arg3];
[message.sendTo: target ];
0551デフォルトの名無しさん
2013/02/23(土) 13:24:33.15具体例って何の?
面倒くさいからtypoでいい?
無いとはいえないよなぁ
0552デフォルトの名無しさん
2013/02/23(土) 13:25:06.620553デフォルトの名無しさん
2013/02/23(土) 13:25:58.47一般化すると
obj = Factory.create( arg1, arg2, arg3 )
obj.foo( arg )
っていうこと?
0554デフォルトの名無しさん
2013/02/23(土) 13:27:32.00だめだよ。すでにあるメソッド名にtypoしたから。
0555デフォルトの名無しさん
2013/02/23(土) 13:28:31.10違う。
・Ruby
message = MessageCapture.selector( arg1, arg2, arg3 )
message.sendTo( target )
例えば、上記の例からmessageの抽出を外すと
tareget.selector( arg1, arg2, arg3 )
になる。>>550の例は、メッセージ送信をMessageCaptureによって遅延している。
0556デフォルトの名無しさん
2013/02/23(土) 13:30:05.17何が問題なの?
0557デフォルトの名無しさん
2013/02/23(土) 13:52:17.90統合開発環境とかエディターの入力支援とかリファクタリングツールで気づくだろ
0558デフォルトの名無しさん
2013/02/23(土) 14:04:29.40腐れ左翼の言い分に近いよなあ。
そりゃ世の中の人間全てがお前みたいな考え方してれば
世の中もちゃんと回るかもしれないけど、
そうでない人間が1人いるだけでうまくいかないのは明らか、
ということに気づいていない点が。
0559デフォルトの名無しさん
2013/02/23(土) 14:09:10.69CやらアセンブリみたいなLLの世界は大変なんだな
0560デフォルトの名無しさん
2013/02/23(土) 14:15:24.56もしかしたら、ある日を境に物を投げたらそのまま止まる日が来るかもしれない
もしかしたら、その人は特別な訓練をしていて死なないかもしれない。
そんな特別な状況なんて重視する必要なんて無い。
他のプロジェクトがどんなに無様な状況に陥っていようと、
自分が関わるプロジェクトで同じ状況に巻き込まれなければそれで十分。
0561デフォルトの名無しさん
2013/02/23(土) 14:32:41.21メッセージの概念を覚えておくと便利だぞ。C++やJavaみたいなメンバー関数型の言語じゃ
考えられないような事が色々出来る。オブジェクトに送られるメッセージを全て無視したり、
必要なメッセージだけを捕まえて他を無視。継承代わりにメッセージ転送を使うことで、
基底クラスを実行時に入れ替え。ネットワークやプロセス越しにメッセージ送信
ファイルにメッセージ保存して再生等など。
0562デフォルトの名無しさん
2013/02/23(土) 14:49:18.20Refactoring Browserでポチっとな、で終わりだけど何か?
0563デフォルトの名無しさん
2013/02/23(土) 14:52:01.20その程度の「作業」も一瞬で終わらないほど遅いマシン使ってるの?
え?まさか人間がやると思ってたの?バカ?
0564デフォルトの名無しさん
2013/02/23(土) 14:52:07.25では、知っている言語とツール名を
”すべて” 教えてください。
Smalltalk用以外の物は無いと思ってますんで。
0565デフォルトの名無しさん
2013/02/23(土) 14:53:43.72クレクレする前に、お前が知ってる言語とツール名を
「すべて」挙げろよww
さあ、今すぐ。
0566デフォルトの名無しさん
2013/02/23(土) 14:54:55.43プログラマなら普通自分用のリファクタリグツールは自分で作るだろ…
0567デフォルトの名無しさん
2013/02/23(土) 14:58:19.15Eclipse、Visual Studio、NetBeans
次はお前の版だね。
0568デフォルトの名無しさん
2013/02/23(土) 14:58:32.50Vim系ならGtags系と補完系を組みあわせるとTIBOに載るような言語は対応できるぞ
0569デフォルトの名無しさん
2013/02/23(土) 14:59:51.690570デフォルトの名無しさん
2013/02/23(土) 15:00:44.65使ってみたけど、制度低かった。
一つのファイルでしか出来なかったり
無関係のものを書き換えたら、
書き換えるべきものを書き換えられなかったり。
だから、補完系とか曖昧な言葉ではなく
具体的な名前でいってください。
0571デフォルトの名無しさん
2013/02/23(土) 15:02:02.22リファクタリング箇所が膨大になりやすい。
メッセージ&メソッド系はそこまで肥大しないのに。
0572デフォルトの名無しさん
2013/02/23(土) 15:03:31.96(人間が)一箇所だけ名前変更 → (コンピュータが)関連する箇所全て変換
してくれるレベルのもので、
候補を表示するだけで、一箇所一箇所
人間がコード読んで判断するようなものは除外です。
0573デフォルトの名無しさん
2013/02/23(土) 15:03:39.13嘘をつけ。実際使ってたならタグ生成したソースファイル全部に対して補完や修正できたのを見たはずだ。
0574デフォルトの名無しさん
2013/02/23(土) 15:04:49.79単語ベースだから
無関係のものまで表示するんだよな。
0575565
2013/02/23(土) 15:05:07.79BASIC, FORTRAN, PASCAL, Ada, Modula-2, Modula-3,
i8080アセンブリ, x86アセンブリ, K&R C, ANSI-C, C++, Objective-C,
Common LISP, elisp, SML, OCaml, Haskell, Clean, Prolog,
Smalltalk, R, Python, Ruby, Perl, PHP, Java, Scala, JavaScript
ぐらいか。
環境は、それこそedlinやviからemacs, eclipse, 独自IDEまで色々。
全部挙げろと言われてもな。
静的型付、動的型付、型無し、いろいろ使ったけど、
動的型付はリファクタリングしやすいなんてことはないな。
0576デフォルトの名無しさん
2013/02/23(土) 15:05:14.07じゃEclipseの置き換えもダメじゃね。
同じ意味で同じ継承ツリーに異なる関数がある場合は目視になる。
そうでなくとも、引数を増やす場合は全て手動になる。そもそも引数変わっとるからな。
0577デフォルトの名無しさん
2013/02/23(土) 15:06:03.98Omni Compleate系だと単語単位じゃない。Omni補完って知らんのか?
0578デフォルトの名無しさん
2013/02/23(土) 15:06:56.95お前日本語読めないのか?
Refactoring Browserの話だろw
まともな(>>572レベルの)Refactoring Browserが
ある言語と、そのリファクタリングツール名を聞いてるんだよ。
なんかわざとボケて話そらそうとしてる気がする。
もう無理だよ。一旦答えたんだから
最後まで答えてね。
0579565
2013/02/23(土) 15:08:00.78静的型付のほうがリファクタリングしやすいと思うのは、動的型付を使いこなせてないから。
逆も然り。
0580デフォルトの名無しさん
2013/02/23(土) 15:09:15.72困ることはねぇよ
0581デフォルトの名無しさん
2013/02/23(土) 15:09:32.05人の話ちゃんときこうよ
>>572は名前変換程度の簡単な作業の話
引数の追加の場合は、一箇所引数を追加したら
それに関する変更の必要がある場所全てを
列挙してくれる機能がほしいね。
これはリファクタリングブラウザじゃなくて
コンパイラの機能でできること。
動的型付け言語では無理だけどさ。
0582デフォルトの名無しさん
2013/02/23(土) 15:10:30.52ここまでの話を聞くと
大差あるようにしか見えないよ
動的型付け言語でも頑張れば大丈夫!って結論だから
あぁ、頑張らないと無理なのかって。
0583565
2013/02/23(土) 15:11:24.73あのさあ、君のプログラマなら、
開発環境の機能を使うだけで解ったようなこと言ってるんじゃないよ。
標準のリファクタリング機能だけ使っているエンドユーザーのくせに
言語機能とリファクタリングしやすさの何がわかるというんだい?
0584デフォルトの名無しさん
2013/02/23(土) 15:11:41.99はい、Tom。基底クラスに追加したメンバーが派生したクラスのメンバーと
重複していて、メンバー同士の仕様が異なるか同じかわからない状態で
自動修正できるのですか?
0586デフォルトの名無しさん
2013/02/23(土) 15:12:43.67静的型付程頑張る必要ないぞ
0587デフォルトの名無しさん
2013/02/23(土) 15:15:07.770588デフォルトの名無しさん
2013/02/23(土) 15:17:05.740589デフォルトの名無しさん
2013/02/23(土) 15:17:28.58静的型の場合、修正候補を型により区別しなきゃならないが、
動的型の場合は区別する必要なく全部修正すればいい。
全部修正されちゃ困る事情があるのなら、
同じ基準を適用すれば静的型でも自動的に変更されては困ることになる。
0590デフォルトの名無しさん
2013/02/23(土) 15:19:19.51動的型を攻撃しているレスを書いているのは静的型しか使った経験がなく、
動的型を擁護しているレスを書いているのは静的型も使った経験がある
ということだな。
0591デフォルトの名無しさん
2013/02/23(土) 15:20:29.71> 動的型の場合は区別する必要なく全部修正すればいい。
その結果、バグが発生するわけだがw
0592デフォルトの名無しさん
2013/02/23(土) 15:21:25.57> 同じ基準を適用すれば静的型でも自動的に変更されては困ることになる。
静的型なら、ちゃんと「エラー」が発生してくれるから
バグにはならない。
「エラー」を直した後、修正すれば良い。
そしてエラーを直す作業も簡単。
名前を変える程度だから、自動でできる。
0593デフォルトの名無しさん
2013/02/23(土) 15:21:31.63C++:
template<class type> void Alpha(type object)
{
object.Member();
}
Go 及びいくつかの言語の拡張( gccとか ):
func Alpha( object interface{ Member() } ) {
object.Member();
}
0594デフォルトの名無しさん
2013/02/23(土) 15:21:34.32動的型はリファクタリングに向いてない、と言ってるアホは
動的型をまともに使ったこともなければ
静的型すらIDE標準機能程度しか使ったことない
0595デフォルトの名無しさん
2013/02/23(土) 15:22:07.560596デフォルトの名無しさん
2013/02/23(土) 15:22:15.45全部修正したらバグは発生しないよ。取りこぼすとバグが発生するかもな。
バカ?
0597デフォルトの名無しさん
2013/02/23(土) 15:22:17.80したことないわぁ lol
0598デフォルトの名無しさん
2013/02/23(土) 15:23:24.09なんで同じ仕様のメソッドが名前変えただけでバグを発生させるだけなんですかねぇ(迫真)
0600デフォルトの名無しさん
2013/02/23(土) 15:24:14.77まさかIDE使ったことないのか?
0601デフォルトの名無しさん
2013/02/23(土) 15:25:10.460602デフォルトの名無しさん
2013/02/23(土) 15:27:05.68今まで代表的なものにGtags系やtags系があったけど、最近はclangにツリーを生成させるってのもある。
0603デフォルトの名無しさん
2013/02/23(土) 15:27:37.90動的型か静的型かの話と関数あるいはメソッドのディスパッチの話を
混ぜるから話がかみ合ってないよね
0604デフォルトの名無しさん
2013/02/23(土) 15:28:10.41Eclipseでもアウトなんだから。
0605デフォルトの名無しさん
2013/02/23(土) 15:29:52.04> なんで同じ仕様のメソッドが名前変えただけでバグを発生させるだけなんですかねぇ(迫真)
同じ仕様であるという保証をする方法がないからでは?
多人数で作っていれば、たまたまメソッド名がかぶることがある。
別の人が作った、Aというライブラリと、Bというライブラリでかぶること
そして、言語にそれを検出する方法がなければ、
”気づかすに”そのまま使ってしまうこともある。
これは、「人間が気をつける」という仕組みでは
どうしようもないことだよ。
0606デフォルトの名無しさん
2013/02/23(土) 15:30:29.750607デフォルトの名無しさん
2013/02/23(土) 15:30:53.710608デフォルトの名無しさん
2013/02/23(土) 15:31:05.23言語は肝心じゃねーよw
質問はリファクタリングツールの名前で
それをお前は答えられてないじゃん。
逃げんのかよw
0609デフォルトの名無しさん
2013/02/23(土) 15:32:42.460610デフォルトの名無しさん
2013/02/23(土) 15:33:33.56これは動的型付け言語でも同じ話で。
0611デフォルトの名無しさん
2013/02/23(土) 15:35:12.27だーかーらー、
Aで定義しているxというメソッドもBで定義しているxというメソッドも
両方ともyに置き換えてもバグにならないの。
別の言い方をすれば、AのxもBのxも両方ともyに置き換える操作が、
静的型での置き換え操作と同じセマンティクスになるの。
0612デフォルトの名無しさん
2013/02/23(土) 15:35:51.89↓
あー、わかったわかった、メソッド名が同じなら仕様も同じね。じゃあ、それをどうやって保証するの?
↓
人間がおなじになるように頑張るんだよ!
↓
メソッド名が同じでも、仕様が違うもの扱えるように型やインターフェース型で区別すればよくね?
そして、コンピュータがそれを理解できるの。
そうすれば、様々な開発サポート機能が搭載できるよ。
↓
なくても人間が頑張ればいいだろ!
0614デフォルトの名無しさん
2013/02/23(土) 15:37:10.25動的静的に関わらず、仕様が違う( 入出力に互換性がない )なら別の名前になるようにせにゃならんだろうけどな。
C++でテンプレート関数使うときに困るし、テンプレート関数に仕様を合わせてないと、
テンプレート関数を再利用できない。
0615デフォルトの名無しさん
2013/02/23(土) 15:37:47.550616デフォルトの名無しさん
2013/02/23(土) 15:37:52.62> Aで定義しているxというメソッドもBで定義しているxというメソッドも
> 両方ともyに置き換えてもバグにならないの。
Aで定義しているxというメソッド(XMLファイルへの書き出し)も
Bで定義しているxというメソッド(CSVファイルへの書き出し)も
両方ともy(saveAsXML)に置き換えてもバグにならないの。
あぁ、バグにはならないな。
Bで定義しているCSVファイルへの書き出しが、saveAsXMLになるだけだからな。
0617デフォルトの名無しさん
2013/02/23(土) 15:38:34.12へー、君にはここでの議論がそう解釈しているんだ?
悪いこといわんから、勉強して出直してきな。
0618デフォルトの名無しさん
2013/02/23(土) 15:39:14.34>人間がおなじになるように頑張るんだよ!
↓
>メソッド名が同じでも、仕様が違うもの扱えるように型やインターフェース型で区別すればよくね?
>そして、コンピュータがそれを理解できるの。
>そうすれば、様々な開発サポート機能が搭載できるよ。
↓
>なくても人間が頑張ればいいだろ!
だから、ここVimや統合開発環境の機能で自動化できるって書いてんじゃん。
不都合は目に入らないのか?民主党かよ。
0619デフォルトの名無しさん
2013/02/23(土) 15:40:38.21おまえはどうしようもないバカだな。
具体的に、saveAsXMLにする前のxの名前を書いてみろよ。
自分が言ってることがどれだけマヌケかよくわかるから。
0620デフォルトの名無しさん
2013/02/23(土) 15:41:41.05Bで定義しているsave()というメソッド(CSVファイルへの書き出し)がありました。
あるときAにXML形式ではなく、HTML形式への出力が必要になりました。
Aで定義しているsave()ではどちらへの書き出しかわかりません。
それで、既存のsave()をsaveAsXML()に名前変更することに決めました。
そこでsave()を全部置換すると、なんと
Bで定義しているsave()というメソッド(CSVファイルへの書き出し)まで
saveAsXMLに書き換わってしまいました。
さあ、困りましたね。
0621デフォルトの名無しさん
2013/02/23(土) 15:42:28.360622デフォルトの名無しさん
2013/02/23(土) 15:43:07.48自動化出来ねーよ。
同じ単語を、全部変えることしかできないから。
それじゃ問題大有りなんだよね。
ちゃんとコンテキストを読み取って
書き換えるべきところだけ書き換えないと。
0623デフォルトの名無しさん
2013/02/23(土) 15:44:22.00バカだなあ。
そういう時には、「バカな静的厨がAとBを使って書いているC」を出さなきゃ意味ないじゃないかw
0624デフォルトの名無しさん
2013/02/23(土) 15:44:52.14じゃあ、お前がそれを出して反論しろよ。このチキンが。
0625デフォルトの名無しさん
2013/02/23(土) 15:44:59.76Omini系のスクリプト入れりゃコンテキスト読み取るつってんだろタコ。
0626デフォルトの名無しさん
2013/02/23(土) 15:45:49.95型がないとコンテキスト読み取れねーよ。
func foo(obj) {
objは何型だよ!?
}
0627デフォルトの名無しさん
2013/02/23(土) 15:45:55.410628デフォルトの名無しさん
2013/02/23(土) 15:46:14.48動的型付のスクリプト言語なら、IDEで環境整えるよりも、Vimでさっさと書き始めた方がいいんじゃない。
0629デフォルトの名無しさん
2013/02/23(土) 15:46:31.96ちゃんと解説してくれます。
もしくは逃げます。
0630デフォルトの名無しさん
2013/02/23(土) 15:47:30.00OO的にゃXMLだろうがHTMLだろうがsaveであるべきだろ
セレクターに出力形式なんて紐付けんなよ
0631デフォルトの名無しさん
2013/02/23(土) 15:47:33.94>6
反論もなにも、状況設定として完結してないっつってんだよカス。
AとBは別人が書いてるんだろ?
おまえは何を書いてるんだよ。それを書かなきゃ意味ないっての。
ここまで親切に教えてやってもまだ理解できないのか?
0632デフォルトの名無しさん
2013/02/23(土) 15:48:19.83C++:
template<class type> void Alpha(type object)
{
object.Member();
}
Go 及びいくつかの言語の拡張( gccとか ):
func Alpha( object interface{ Member() } ) {
object.Member();
}
これとおんなじ問題だろ
0633デフォルトの名無しさん
2013/02/23(土) 15:48:26.58メソッドの実装とコメント情報が合ってないとか。
0634デフォルトの名無しさん
2013/02/23(土) 15:48:37.370635デフォルトの名無しさん
2013/02/23(土) 15:49:36.27つまんね。
0636デフォルトの名無しさん
2013/02/23(土) 15:51:23.36それはぜんぜん違うぞw
テンプレートはもともと”型を考慮しなくていい”ロジックを
まとめたものであるから、テンプレートがOKでも
テンプレートじゃないものはNGなんだ。
0637デフォルトの名無しさん
2013/02/23(土) 15:51:36.97「こんなこと動的型付言語だったら出来ないだろエッヘン(ドやぁ」か
リファクタリングツールがかわいそう
0638デフォルトの名無しさん
2013/02/23(土) 15:52:38.49ダックタイプってのは全て
>”型を考慮しなくていい”ロジックをまとめたものであるから
だぞ
0639デフォルトの名無しさん
2013/02/23(土) 15:54:59.28ランダムイテレータ―しか受け付けないテンプレートに
単方向イテレータ―入れたらアウトだぞ。
0640デフォルトの名無しさん
2013/02/23(土) 15:55:21.42全てが、型を考慮しなくていいロジックじゃねーぞ?
たとえば、
foo(obj) {
obj.bar()
}
というコードは、bar()という一つのメソッドを持った
インターフェースを持っている方で無くてはならない。
0641デフォルトの名無しさん
2013/02/23(土) 15:56:38.56?
template<class type> void Alpha(type object)
{
object.Bar();
}
0642デフォルトの名無しさん
2013/02/23(土) 15:57:58.80その場合、objectはBarを持っていないと
そのテンプレートを適用したクラスを作ると
コンパイルエラーになるね。
0643デフォルトの名無しさん
2013/02/23(土) 15:58:44.720644デフォルトの名無しさん
2013/02/23(土) 15:59:09.90テンプレートが展開された後で
改めて型チェックがされる。
0645デフォルトの名無しさん
2013/02/23(土) 15:59:27.99何の話してたか覚えてないの?
ここでBarを変えたら、どっちもコンパイル時ないし実行時にエラーが起きる。
0646デフォルトの名無しさん
2013/02/23(土) 16:00:25.18入力補完のはなししてなかったか
0647デフォルトの名無しさん
2013/02/23(土) 16:00:25.46え? メソッドが同じでも意味が違うものがあるから、
単純に同じ名前だからって置換したらだめだよって話だろ?
0648デフォルトの名無しさん
2013/02/23(土) 16:01:36.25まずそうい状態にしちゃいかんよな。テンプレート使うときに困るし。
0649デフォルトの名無しさん
2013/02/23(土) 16:02:39.53これは何の処理をするのかってわからないからなぁ。
0650デフォルトの名無しさん
2013/02/23(土) 16:03:28.22いかんよなぁ。じゃなくてなってしまうんだよ。
作る人は一人じゃないんだから。
他人が自分の知らないところで作ってしまうことがある。
0651デフォルトの名無しさん
2013/02/23(土) 16:04:47.39vimとかemacsとかのスクリプトつかって。
0652デフォルトの名無しさん
2013/02/23(土) 16:05:37.39複数人で作ったんならマージするときに直せば済むじゃん。
コミュ症で周りと会話できないの?
0653デフォルトの名無しさん
2013/02/23(土) 16:08:09.94レビューとかしないのかよ。学生さん?
0654デフォルトの名無しさん
2013/02/23(土) 16:10:20.83Javaに限った話になるが、基底クラスに勝手に派生と同じ関数定義されてたらどうすんの?
いままで散々出てるがそれと同じ話なんだけどな。
0655デフォルトの名無しさん
2013/02/23(土) 16:14:25.82> LL厨の言い分って理想論というか性善説というか
> 腐れ左翼の言い分に近いよなあ。
>
> そりゃ世の中の人間全てがお前みたいな考え方してれば
> 世の中もちゃんと回るかもしれないけど、
> そうでない人間が1人いるだけでうまくいかないのは明らか、
> ということに気づいていない点が。
左翼って表現上手いな。確かにそうだな。
0656デフォルトの名無しさん
2013/02/23(土) 16:25:39.05性悪説ということでオッケーでしょうか?
0657デフォルトの名無しさん
2013/02/23(土) 16:35:34.72> Javaに限った話になるが、基底クラスに勝手に派生と同じ関数定義されてたらどうすんの?
基底クラスにはないメソッドを派生クラスに定義するとき、
つまりオーバーライドしないときは
派生クラスに@Overrideアノテーションは当然不要。
基底クラスに勝手にメソッドが追加されたら
@Overrideが無いという警告が出るからすぐに認知できる。
動的型付け言語みたいに”気づかなかった"は起こらない。
0658デフォルトの名無しさん
2013/02/23(土) 16:36:25.05誰か言語のリストを要求したっけ?
リファクタリングブラウザの名前を要求したのに
それを出さなかった話しなら知ってるが。
0659デフォルトの名無しさん
2013/02/23(土) 16:40:15.63出せなかったんだ。
0660デフォルトの名無しさん
2013/02/23(土) 16:40:16.20継承ならvimやemacsとかのプラグインで警告出せるよ
0661デフォルトの名無しさん
2013/02/23(土) 16:41:36.38なるほどね。動的言語にも@Overrideみたいなのが欲しいところだけど、
動的言語故に、実行時にメソッドが追加されたり削除されたり
することがあるから、静的にコンパイルチェックすることは不可能だろうね。
0662デフォルトの名無しさん
2013/02/23(土) 16:42:12.98なんてプラグイン?
0663デフォルトの名無しさん
2013/02/23(土) 16:47:44.210664デフォルトの名無しさん
2013/02/23(土) 16:49:17.62pythonならpython.vimとか
0665デフォルトの名無しさん
2013/02/23(土) 16:53:28.02564 2 名前: デフォルトの名無しさん Mail: sage 投稿日: 2013/02/23(土) 14:52:07.25
>>562
では、知っている言語とツール名を
”すべて” 教えてください。
Smalltalk用以外の物は無いと思ってますんで。
565 7 名前: デフォルトの名無しさん Mail: age 投稿日: 2013/02/23(土) 14:53:43.72
>>564
クレクレする前に、お前が知ってる言語とツール名を
「すべて」挙げろよww
さあ、今すぐ。
0666デフォルトの名無しさん
2013/02/23(土) 16:58:44.35たぶんpythonのデコレータでできるよ。
def overrides(klass):
def overriding_method(base_method):
assert(base_method.__name__ in dir(klass))
return base_method
return overriding_method
こんな感じ。
0667デフォルトの名無しさん
2013/02/23(土) 16:58:44.82警告でたあとじゃ遅いだろうに
0668デフォルトの名無しさん
2013/02/23(土) 17:04:04.93へー、なんでそこで要求されている
リファクタリングブラウザ名はでなかったの?
おかしいよね?
0669デフォルトの名無しさん
2013/02/23(土) 17:04:44.74> 警告でたあとじゃ遅いだろうに
え? コンパイル時の警告じゃ遅い? どういう理屈で?
0670デフォルトの名無しさん
2013/02/23(土) 17:05:17.27実行された時に出るんだぜ。
遅すぎるだろw
0671デフォルトの名無しさん
2013/02/23(土) 17:05:17.81vimやemacsでもリファクタリングできるじゃん、というのが答えだったのが読めないわけ?
ふーん…
0672デフォルトの名無しさん
2013/02/23(土) 17:05:53.68できるけど、時間がかかって大変だって話でしょ?
0673デフォルトの名無しさん
2013/02/23(土) 17:05:59.57666のコードだと、いつ警告が出るかわかるか?ニヤニヤ
0674デフォルトの名無しさん
2013/02/23(土) 17:07:02.165行も必要なんですか!?
あらかじめそれやってないと
警告でないってことですよね?
0675デフォルトの名無しさん
2013/02/23(土) 17:07:07.60どうしてvimやemacsでは時間がかかると思うわけ?
0676デフォルトの名無しさん
2013/02/23(土) 17:07:12.33マージの際に警告でたんなら意味がない
マージ以前ならもともと関係ない
0677デフォルトの名無しさん
2013/02/23(土) 17:07:54.830678デフォルトの名無しさん
2013/02/23(土) 17:11:15.67人間がやる作業が多いからです。
0679デフォルトの名無しさん
2013/02/23(土) 17:12:25.63それは?屁理屈?
実行前に警告出てれば遅くないよね?
実行前の警告が遅い理由を聞いてるんだけど?
0680デフォルトの名無しさん
2013/02/23(土) 17:15:41.82実行前に警告というか問題点をツールで見つけ出すんならこのスレで散々でた方法で対応できる。
問題は他人がいらんことしたソースとマージするときの話だったろ。
0681デフォルトの名無しさん
2013/02/23(土) 17:22:56.06C++ の template はまさに「そこがわかりづらい!」
ってことで Concept の導入が検討されてただろ。
議論不足ということで先送りになったが。
0682デフォルトの名無しさん
2013/02/23(土) 17:26:19.03具体的に、人間がどれをやると思っているわけ?
どうして全部ツールがやってくれると思わないわけ?
vimやemacsを標準のまま使うという制約がどこかから湧いて出てきたわけ?
0683デフォルトの名無しさん
2013/02/23(土) 17:28:13.08ねえ、もしかして、デコレータって言葉がわからないの?
だから>>666のコードを毎回書くとか勘違いしちゃったの?
いつになったら静的型厨の言語歴リストを晒すの?
0684デフォルトの名無しさん
2013/02/23(土) 17:30:05.98メッセージングの概念が無い言語、
委譲支援機能が無い言語は、継承から
委譲への変更が圧倒的にメンドイ。
例え、委譲だけする関数を自動生成させたとしても、
元のクラスに関数が増える度に追加しなきゃならんからかったるすぎる
0685デフォルトの名無しさん
2013/02/23(土) 17:30:08.58どうやらemacsもvimも使ったことないようだ。
彼は一体何を根拠に動的型はリファクタリングできないと思い込んでいるのだろう?
0686デフォルトの名無しさん
2013/02/23(土) 17:33:29.18君が使える言語のリスト、まだ?
このままじゃ君はただのバカだよ?
0687デフォルトの名無しさん
2013/02/23(土) 17:34:52.54君が使える言語のリスト、まだ?
このままじゃ君はただのバカだよ?
0688デフォルトの名無しさん
2013/02/23(土) 17:39:14.95なぜそう思うかは簡単。
お前が一向に、ツールの名前を言わんからだ。
0689デフォルトの名無しさん
2013/02/23(土) 17:39:53.09言わないのはなんでなんだろうね。
0690デフォルトの名無しさん
2013/02/23(土) 17:41:06.07python.vimとかPySonarとかGtagsとかは具体的なツールじゃないんですかねぇ
0691デフォルトの名無しさん
2013/02/23(土) 17:42:03.580692デフォルトの名無しさん
2013/02/23(土) 17:50:22.55ん? もしかしてお前、リファクタリングの意味がわかってない?
Java以外で継承から委譲へのリファクタリングをやってみてよ。
0693デフォルトの名無しさん
2013/02/23(土) 17:52:47.3720個あったら20個追加。リファクタリングツール使ってもかったるいわ〜
委譲を自動化できる言語なら委譲先クラス一個にメンバー追加するだけで済むんだけどなぁー
C++ですらテンプレート使えばある程度対応できるのになぁ〜
0694デフォルトの名無しさん
2013/02/23(土) 17:56:09.33既に一杯出ているのに?
いつになったら言語リストを晒すんだ?
単にバカなだけでなく、卑劣な人?
0695デフォルトの名無しさん
2013/02/23(土) 18:02:11.00end
から
class Derived
def initialize( guest )
@base = guest #あるいは@base = Base.new
end
def method_missing( selector, *args )
@base.send( selector, *args )
end
end
へ変更。委譲先メンバーが増えた所で委譲元には追加修正不要
0696デフォルトの名無しさん
2013/02/23(土) 18:02:18.69> Javaみたいな言語でどうやったら継承から委譲へのリファクタリングが楽になるんですかねぇ〜
ステップ1 extends HogeとなってるクラスにHoge型の持ったプライベート変数を作る
public class Hage extends Hoge {
private Hoge hoge; ← 追加
略
}
ステップ2 右クリックメニューより「委譲メソッドの作成」を行う。
全てのメソッドであれば特に設定項目はない。OKを押すだけ。
これで委譲メソッドが何十個あろうと生成される。
ステップ3 extends Hogeを削除する
ステップ4 Hoge hogeをnewするコードを書く
委譲だけに以上!w
0697デフォルトの名無しさん
2013/02/23(土) 18:02:52.26お前恥ずかしいな。>>696を見ろ。
0698デフォルトの名無しさん
2013/02/23(土) 18:05:31.32委譲先が二つ以上あったらどうすんの?って所かな。
0699デフォルトの名無しさん
2013/02/23(土) 18:10:21.57(A allSelectors reject: [ :s | B allSelectors includes: s]) do: [ :selector | B compile: selector, String cr, '^ a ', selector classified: 'delegation' notifying: nil ]
の1行でAにはあるがBにはない全てのメソッドを委譲するメソッドを自動生成できる。
もちろん移譲先が複数あっても問題ない。
0700デフォルトの名無しさん
2013/02/23(土) 18:11:44.96キーワードメッセージありだともうちょい長くなる。
どのみち一行で済むけどね。
0701デフォルトの名無しさん
2013/02/23(土) 18:14:20.210702デフォルトの名無しさん
2013/02/23(土) 18:14:56.460703デフォルトの名無しさん
2013/02/23(土) 18:21:40.80委譲先A、B両方に、同じメソッドがあったらどうすんの?
0704デフォルトの名無しさん
2013/02/23(土) 18:22:38.43ツール名は? 中途半端に上げるのも卑怯
0705デフォルトの名無しさん
2013/02/23(土) 18:25:28.72選べばいいんじゃね?Javaだって複数の移譲先があったら選択するんだろが。
0706デフォルトの名無しさん
2013/02/23(土) 18:26:19.11ツール名は既に沢山挙っているが?
挙ってないと嘘ばかり言ってるのは君だけだよ。
さあ、君が使う言語のリストを挙げなさい。
0707デフォルトの名無しさん
2013/02/23(土) 18:27:40.56リファクタリングツールだよ。
一番使われている動的言語であるRubyに
限っては一個も出てないし。
0708デフォルトの名無しさん
2013/02/23(土) 18:28:14.25でもそれだと、気づかないってことがあるだろう?
0709デフォルトの名無しさん
2013/02/23(土) 18:28:41.74裏切って悪いけど、俺ならこれで済ませるわ
doesNotUnderstand: aMessage
aMessage sendTo: target.
>>703
Javaでも同じだろ。ただ、移譲先が1つの場合は自動移譲出来る方がリファクタリング回数が少なくて楽。
そもそも、単一継承してる言語で、継承を移譲に変えると移譲先が2個に増えるなんて無いから。
0710デフォルトの名無しさん
2013/02/23(土) 18:29:04.57動的型言語をまともに使ったこともないのに
動的型言語ではリファクタリングできないなどと
デマを流すのはやめろ。
お前がバカであることを自ら晒すのは自由だが、
デマを信じて広めるバカが出るのが迷惑なんだよ。
せめて>>666ぐらい一目で読めるぐらいに勉強してから出直してこい。
0711デフォルトの名無しさん
2013/02/23(土) 18:29:43.84リファクタリング用と書いてある専用ツールを使う必要はない。
ruby.vimなんてもんでも十分。
0712デフォルトの名無しさん
2013/02/23(土) 18:30:46.27移譲先に共通するセレクタを列挙するコードでも貼ればいいか?
ものすごく簡単だが?
0713デフォルトの名無しさん
2013/02/23(土) 18:31:21.66> そもそも、単一継承してる言語で、継承を移譲に変えると移譲先が2個に増えるなんて無いから。
すでに委譲していた → 継承をやめたから委譲先が2個になった
0714デフォルトの名無しさん
2013/02/23(土) 18:33:44.83doesNotUnderstand:を使うとsendersやimplementorsにかからなくなる。
あと、実行時のオーバーヘッドも無視できん。
>>699なら通常のメソッドと同様に扱える。
委譲したくないセレクタがあっても対処できる。
などなど、>>699にもメリットが多いぞ。
0715デフォルトの名無しさん
2013/02/23(土) 18:43:23.65委譲する前に何かしらの処理を挟んだり
するもんじゃねーの?
継承関係がない無関係のクラスに
同じメソッドをもたせる事例が
思いつかないんだが。
0716デフォルトの名無しさん
2013/02/23(土) 18:53:17.820717デフォルトの名無しさん
2013/02/23(土) 19:23:14.180718デフォルトの名無しさん
2013/02/23(土) 20:51:44.660719デフォルトの名無しさん
2013/02/23(土) 20:59:51.84多くのコードをEclipseが生成してくれるけど、
そうやって自動生成に頼ってるおかげで
どんどんコードが膨らんで可読性が落ちるんだよねー
可読性を高めるためのリファクタリングなのに、
冗長すぎて可読性がウンコって問題あると思うよ
0720デフォルトの名無しさん
2013/02/23(土) 21:10:18.350721デフォルトの名無しさん
2013/02/23(土) 23:02:05.89Eclipseが自動生成するコードってどんなもののことを言っている?
0722デフォルトの名無しさん
2013/02/24(日) 06:06:55.480723デフォルトの名無しさん
2013/02/24(日) 06:13:02.07こんな時間まで粘着してたのか?
ストーカーかよ
0724デフォルトの名無しさん
2013/02/24(日) 06:16:50.32ツールが自動的にやってくれるのに
どうして面倒で間違えやすいと思い込んじゃったの?
Javaしか書いたことないから?
Eclipseしか使ったことないから?
バカだから?
0725デフォルトの名無しさん
2013/02/24(日) 06:17:25.88で、言語リストまだ?
0726デフォルトの名無しさん
2013/02/24(日) 06:18:38.92こんな所だな。
0727デフォルトの名無しさん
2013/02/24(日) 06:55:33.88どうこう言える経験はない、ということか。
0728デフォルトの名無しさん
2013/02/24(日) 06:56:24.630729デフォルトの名無しさん
2013/02/24(日) 06:57:20.04動的型言語が一つも含まれてないからさ
0730デフォルトの名無しさん
2013/02/24(日) 06:59:15.160731デフォルトの名無しさん
2013/02/24(日) 07:03:00.27>Java、C、C++、JavaScript、VB、C#、PHP、Perl、アセンブラ(x86)
うち、動的型は
JavaScript、PHP、Perlだが、
どれも継承関係を中心としたプログラミングをする言語ではない。
0732デフォルトの名無しさん
2013/02/24(日) 07:03:40.350733デフォルトの名無しさん
2013/02/24(日) 07:04:07.12これだけ先達が色々教えてくれているのに
すこしは学んだらどうだい?
0734デフォルトの名無しさん
2013/02/24(日) 07:04:54.53みっともない自演はやめたほうがいいぞw
0735デフォルトの名無しさん
2013/02/24(日) 07:06:04.63継承どころかクラスがない。
0736デフォルトの名無しさん
2013/02/24(日) 07:07:21.90も自演かな?
あまりにも知識が少なすぎる。
0737デフォルトの名無しさん
2013/02/24(日) 07:10:42.23動的言語厨が、他の動的言語を
馬鹿にしだした。
仲間割れだ。どんどんやれ。
0738デフォルトの名無しさん
2013/02/24(日) 07:16:08.59煽っても無駄だよ
このスレには少なくとも5人が書き込んでいるが
状況を理解できていないのは君一人だw
0739デフォルトの名無しさん
2013/02/24(日) 07:19:15.44そうだね。
で、どの動的型言語で継承関係のリファクタリングをしたんだい?
具体的に言ってごらん?
0740デフォルトの名無しさん
2013/02/24(日) 07:19:26.05JavaScript、PHP、Perlでも
継承使うっていうの。
これらのフレームワークで
継承使ってないもの持ってきてみろって。
所詮、実践言語を知らない
机上の空論言語使いだったか。
0741デフォルトの名無しさん
2013/02/24(日) 07:20:13.890742デフォルトの名無しさん
2013/02/24(日) 07:26:08.49具体的に、どんな継承関係のリファクタリングしたのか言ってみろってwww
0743デフォルトの名無しさん
2013/02/24(日) 07:28:38.39古い知識で物を言っている。
まあ、Perlがオブジェクト指向に対応したのが1994年だし。
PHPがオブジェクト指向に対応したのが2000年、
トレイトに対応したのが2012年。
JavaScriptはプロトタイプベースというものを知らないだけ。
仕方ないよ。
0744デフォルトの名無しさん
2013/02/24(日) 07:29:34.14PHPでメソッドが存在しない時、
__callが呼ばれるので、他のメソッドに
委譲しただけですよぉ?w
0745デフォルトの名無しさん
2013/02/24(日) 07:29:48.82>BASIC, FORTRAN, PASCAL, Ada, Modula-2, Modula-3,
>i8080アセンブリ, x86アセンブリ, K&R C, ANSI-C, C++, Objective-C,
>Common LISP, elisp, SML, OCaml, Haskell, Clean, Prolog,
>Smalltalk, R, Python, Ruby, Perl, PHP, Java, Scala, JavaScript
なるほど、これが「机上の空論言語」か
ちなみに>>731から>>575に挙った「机上の空論言語」を取り除くと
C#しか残らないように見えるのは気のせいだよなw
0746デフォルトの名無しさん
2013/02/24(日) 07:33:42.73古い動的型のイメージで「リファクタリングできない」とか言っちゃってるのだろう。
仕方ないとはいえ、こういう人が偏見で都市伝説をつくっているんだろうな。
0747デフォルトの名無しさん
2013/02/24(日) 07:34:48.28> うち、動的型は
> JavaScript、PHP、Perlだが、
> どれも継承関係を中心としたプログラミングをする言語ではない。
お前がアマチュアだってのは、このセリフから
明らかになったし。
0748デフォルトの名無しさん
2013/02/24(日) 07:36:06.34どうやって継承しろと?
0749デフォルトの名無しさん
2013/02/24(日) 07:37:47.85相手の主張を歪曲して叩くのって、楽しい?
0750デフォルトの名無しさん
2013/02/24(日) 07:38:42.48おまえはPHPで継承を「中心にした」プログラミングをしているのか!?
すげえぜw
0751デフォルトの名無しさん
2013/02/24(日) 07:39:09.26え? じゃあなんて言った?
一つでもフレームワークの名前しってる?
0752デフォルトの名無しさん
2013/02/24(日) 07:40:14.59それが開発の「中心」になることは、まずないな。
ましてや「継承を中心」となると…
0753デフォルトの名無しさん
2013/02/24(日) 07:41:13.29好む好まない関係なく、
PHPの今の開発で普通に使われるフレームワーク
ZendFramework、CodeIgniter、CakePHP、Symfony
どれも継承を中心にしたプログラミングだよ?
0754デフォルトの名無しさん
2013/02/24(日) 07:42:22.41最近はやりのBackbone.jsは
ModelやViewを継承したクラスを作るんだが?
0755デフォルトの名無しさん
2013/02/24(日) 07:42:22.76「どれも継承関係を中心としたプログラミングをする言語ではない。」
という発言なら、>>731がしているな
まさか、これが「継承がない」に読める?バカ?
0756デフォルトの名無しさん
2013/02/24(日) 07:44:06.93なんで、それで継承関係を中心とした
プログラミングにはならないって
思っちゃうわけ?
継承関係を中心としたプログラミングに
ならない根拠はなんだよ?
0757デフォルトの名無しさん
2013/02/24(日) 07:45:58.26だろうなw
俺の常識では〜
以下本人の言い訳を御覧ください。
0758デフォルトの名無しさん
2013/02/24(日) 07:48:50.93では、Backbone.jsを使ったコードについて
具体的な継承関係のリファクタリングを見せてもらおうか
0759デフォルトの名無しさん
2013/02/24(日) 07:51:17.28> JavaScript、PHP、Perlだが、
> どれも継承関係を中心としたプログラミングをする言語ではない。
だって JavaScriptプログラマも、PHPプログラマも、Perlプログラマも
その、くぷぷ。だってそんな技術力ないじゃない。くぷぷ
あんなやつらに継承とか理解できないよ。くぷぷ。
これが理由じゃ不服かい?くぷぷ。
とか言ったら殺されるされるだろうなぁ。
オブラートに包んで言っても、ばれるよ。
下に見てるのは。
0760デフォルトの名無しさん
2013/02/24(日) 07:51:57.64継承以外のウェイトが大きいからじゃね?普通に考えて。アホ?
0761デフォルトの名無しさん
2013/02/24(日) 07:52:45.91継承から委譲にするために、
クラスに存在しないメソッドを
他のクラスから取り込みました。
クラスのメソッドを列挙する方法ですか?
for inでできますよ?
0762デフォルトの名無しさん
2013/02/24(日) 07:53:19.23で、リファクタリングの例、まだー?
0763デフォルトの名無しさん
2013/02/24(日) 07:53:39.200764デフォルトの名無しさん
2013/02/24(日) 07:55:15.43そうだよねー
動的型だからリファクタリングできないとか言うバカがいるらしいよ
アホだねー
0765デフォルトの名無しさん
2013/02/24(日) 07:55:15.77オブジェクト指向できないのは
世間の常識なわけで。
いい加減認めちゃいなよ。
0766デフォルトの名無しさん
2013/02/24(日) 07:55:59.09リファクタリングに時間がかかるじゃなかったっけ?
0767デフォルトの名無しさん
2013/02/24(日) 08:02:39.45そうなんだよねー
JSで委譲コード書くのは時間がかかって大変だよねー
あはは
0768デフォルトの名無しさん
2013/02/24(日) 08:28:35.96動的OO言語でのリファクタリングについて熱く語り出す事案が
発生しました
0769デフォルトの名無しさん
2013/02/24(日) 08:47:48.90高機能なconceptを低機能なobjectにemulationさせて実現させる際に頻繁に使用する。
委譲が自動で出来る場合は割と定石だから覚えとけ。
| simpleContext complexContext |
simpleContext := openGLDevice simpleContext. "委譲先のcontextを取得"
simpleContext lineTo: 10@10.
complexContext := ComplexContextForSimpleContext with: simpleContext. "委譲を行うobjectを生成"
complexContext lineTo: 10@10. "simpleContextと同じlineToを使用する"
complexContext drawRectangleFrom: 1@1 To: 10@10.
"ComplexContextForSimpleContextによって追加されたmethod。
lineToやらSimpleContextのconceptが備える最低限の操作を
使用して矩形描画を再現する"
complexContext := svgDevice complexContext. "SVG用のcontextを取得"
complexContext lineTo: 10@10.
complexContext drawRectangleFrom: 1@1 To: 10@10. "svgDeviceのdrawRectangleFrom:To:が直接実行される"
0770デフォルトの名無しさん
2013/02/24(日) 08:50:47.60アセンブラ lol
アセンブリ開発したことありゃアセンブリっつうだろ
0771デフォルトの名無しさん
2013/02/24(日) 08:57:36.45俺はゲーム業界だけどアセンブリって言う奴ほとんどいない
0772769
2013/02/24(日) 08:59:52.76○ complexContext drawRectangleFrom: 1@1 To: 10@10. "svgDeviceから取得したSVGContextのdrawRectangleFrom:To:が直接実行される"
0773デフォルトの名無しさん
2013/02/24(日) 09:01:04.290774デフォルトの名無しさん
2013/02/24(日) 09:05:25.55ある種類のAssemblerが使えるのと、ある種類のAssemblyが使えるのじゃ全然違うからな
x86のAssemblyが使えるったって、MSのAssemblerを使ってなのか、gasを使ってなのかじゃ話が大きく変わる
0775デフォルトの名無しさん
2013/02/24(日) 09:14:46.26むかしからいうんだよ
0776デフォルトの名無しさん
2013/02/24(日) 09:15:39.700777デフォルトの名無しさん
2013/02/24(日) 09:17:36.55にわかがな
0778デフォルトの名無しさん
2013/02/24(日) 09:35:10.14実際にドライバー開発とかしてた奴らは昔っから区別しとったよ
0779デフォルトの名無しさん
2013/02/24(日) 09:38:47.680780デフォルトの名無しさん
2013/02/24(日) 09:44:19.72wikipediaでも
> なお、アセンブリ言語の意味で「アセンブラ」または「アセンブラ言語」(Assembler Language)と呼ぶ場合も多い[注 1][1]。
て書かれてるから、こんなのどっちでも良いよ
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E8%A8%80%E8%AA%9E
文脈を考えれば混同することなんてないんだし
ただ、>>770みたいなのがいる職場だといちいち突っかかってきて面倒だろうけど
0781デフォルトの名無しさん
2013/02/24(日) 09:49:22.84最近アセンブリ使ったこと無い奴が多いからな
IPAに限っては昔から机上の学問しかしらん糞の集まりだし
0782デフォルトの名無しさん
2013/02/24(日) 09:52:37.77それはロクに使ったこと無い奴がアセンブラ言語って言うだけだよ
門外漢がアセンブラ言語っていうから、アセンブラ言語って言い回しが無いわけじゃない。
0783デフォルトの名無しさん
2013/02/24(日) 09:59:42.80masmかgasか?msasmか?
0784デフォルトの名無しさん
2013/02/24(日) 10:21:37.79> IBMはSystem/360から2011年現在まで一貫してアセンブラ言語(Assembler Language)と呼んでいる。例:IBM High Level Assembler
天下のIBMやIPAがアセンブラ言語っていってんのに2chの底辺でどっちが正しいとか話しても虚しいだけだろw
たぶん君等が糞みたいなレベルだから、こんな糞みたいなどうでもいいことが気になるんだよ
0785デフォルトの名無しさん
2013/02/24(日) 10:25:32.68使ってるアセンブリが違いました
使ってるアセンブラが違いました
よく使う言葉ほど簡潔に
0786デフォルトの名無しさん
2013/02/24(日) 10:30:43.16>>784
0787デフォルトの名無しさん
2013/02/24(日) 10:35:18.39Assembly languageとAssembler languageを区別してるIBMか
http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=13&ved=0CEIQFjACOAo&url=
http%3A%2F%2Ffaculty.cs.niu.edu%2F~hutchins%2Fcsci360%2Flang-ref.pdf&ei=vG0pUYfyIMnGkQXU3YFo&usg=AFQjCNEPUoQVktmrGPmdJXHLuK3ie6GFfw&
sig2=RG0ku8SRjyMZP3r9Mb9Y2w&bvm=bv.42768644,d.dGI
0788デフォルトの名無しさん
2013/02/24(日) 11:01:15.240789デフォルトの名無しさん
2013/02/24(日) 15:31:51.59自分が糞だからといって、他人まで糞だと言うのは間違いだぞ。
0790デフォルトの名無しさん
2013/02/24(日) 17:12:29.050791デフォルトの名無しさん
2013/02/24(日) 17:26:14.46できるのとするのとではちがう
JavaScript、PHP、Perlは動的型だが
どれも継承関係を中心としたプログラミングをする言語ではない。
0792デフォルトの名無しさん
2013/02/24(日) 18:26:08.730793デフォルトの名無しさん
2013/02/24(日) 18:28:14.45> どれも継承関係を中心としたプログラミングをする言語ではない。
できない人の言い訳はいらないよ
0794デフォルトの名無しさん
2013/02/24(日) 18:34:10.80>>726
>Java、C、C++、JavaScript、VB、C#、PHP、Perl、アセンブラ(x86)
うち、動的型は
JavaScript、PHP、Perlだが、
どれも継承関係を中心としたプログラミングをする言語ではない。
0795デフォルトの名無しさん
2013/02/24(日) 18:57:38.28さんざん馬鹿晒した逆恨みのなりすまし、かっこ悪い
0796デフォルトの名無しさん
2013/02/24(日) 19:00:24.410797デフォルトの名無しさん
2013/02/24(日) 19:16:45.26もっと優しく教えてやれよ。
0798デフォルトの名無しさん
2013/02/24(日) 19:18:05.85お前のその空白、なんで?
0799デフォルトの名無しさん
2013/02/24(日) 19:21:25.460800デフォルトの名無しさん
2013/02/24(日) 19:32:59.650801デフォルトの名無しさん
2013/02/24(日) 19:43:57.93ま、意固地になって継承拒否する必要もないけど。
0802デフォルトの名無しさん
2013/02/24(日) 19:45:41.23よろこんで使ってるの低能だけ
0803デフォルトの名無しさん
2013/02/24(日) 19:53:07.08DIで注入されるDaoやサービスの類を実装するのに普通に継承は使う。
注入される側も実装の共有が出来る部分では普通に継承を使う。
DI使えば継承不要とかPOJOとかまるで謎。むしろDI使うことで個々の部品が小さく
なって独立性も高くなるので、実装の共有のための継承がし易くなった。
0804デフォルトの名無しさん
2013/02/24(日) 19:56:21.58DIがやるのは、オブジェクトをnewする部分を
置き換えるもの。継承を置き換えるわけじゃない。
継承はオブジェクトの構造を表現したものだが
DIはオブジェクトを誰がどうやって生成するかを表現したもの。
is-a関係にない構造(例 モデルがDBクラスを継承するとか)なのに
なぜか継承しているものを委譲に変えるときに、
委譲先オブジェクトをインジェクションする。
その結果POJOになるって所から勘違いが広まってるんだと思う。
0805デフォルトの名無しさん
2013/02/24(日) 20:02:58.20大変微笑ましい
0806デフォルトの名無しさん
2013/02/24(日) 20:04:25.03嫉妬すんなよw
0807デフォルトの名無しさん
2013/02/24(日) 20:05:14.14追いつくんだろうね。
0808デフォルトの名無しさん
2013/02/24(日) 20:16:32.84本当に分かってんのか?
0809デフォルトの名無しさん
2013/02/24(日) 20:17:40.430810デフォルトの名無しさん
2013/02/24(日) 20:18:55.220811デフォルトの名無しさん
2013/02/24(日) 20:25:10.85既存のウェブフレームワーク使うなら、一切継承使わずにSpringだけでウェブアプリ書けちゃうと思うよ。
そういやPHPもアノテーションが導入されるんじゃなかったっけ。
0812デフォルトの名無しさん
2013/02/24(日) 20:26:19.030813デフォルトの名無しさん
2013/02/24(日) 20:30:11.46オブジェクトが他のオブジェクトを利用するとき、
オブジェクトが直接newするのではなく、
他の誰かにnewしてもらうことで依存関係を減らす。
という考え方。
0814デフォルトの名無しさん
2013/02/24(日) 20:37:14.66DIの本質がわかってない人がいるようだね。
DI(Depencancy Injection = 依存関係の注入)という
言葉の通りで、注入することが、一番の本質なのに。
0815デフォルトの名無しさん
2013/02/24(日) 20:37:56.15何言ってるか分からない。
0816デフォルトの名無しさん
2013/02/24(日) 20:38:38.19多重継承やトレイトのように内部で注入することは依存関係ができてしまうので
DIの目的をみたしていない。
0817デフォルトの名無しさん
2013/02/24(日) 20:39:10.21うん、みんな最初はわからないものだよ。
0818デフォルトの名無しさん
2013/02/24(日) 20:40:10.15ただのStrategyパターン
0819デフォルトの名無しさん
2013/02/24(日) 20:41:46.70多重継承やトレイトがあったところでそれが静的なのであればDIのメリットは殆ど再現出来ない。
クラス定義時にではなく実行時に動的に注入するから、注入するクラスを差し替えたり一つの
共有インスタンスを沢山の注入先に注入するといったメリットが出てくる。
0820デフォルトの名無しさん
2013/02/24(日) 20:43:43.040821デフォルトの名無しさん
2013/02/24(日) 20:44:52.32そりゃなんでも実装できるよ。
実装するための技術はなんでもいい。
実装されたDIに価値がある。
0822デフォルトの名無しさん
2013/02/24(日) 20:46:07.00僕の考えるDIを語っても的外れになるだけってことが
よく分かるな。
0823デフォルトの名無しさん
2013/02/24(日) 20:48:49.28状態を持たないアルゴリズムの実装の注入や差し替えであれば多重継承云々でも出来るだろうね。
ただごくごく一般的な例として、例えば使い回ししたいデータベースハンドラを注入する場合、
多重継承やトレイトではどうやるのだろう。
0824デフォルトの名無しさん
2013/02/24(日) 20:50:26.95冗長なXMLで書いてドヤ顔したあげく
XML地獄になっててワロタwww
センス無い連中が実装技術作ると悲惨だなって
0825デフォルトの名無しさん
2013/02/24(日) 20:56:29.59Javaみたいな単一継承の言語の場合、移譲に頼るしか仕方ないけど、やっぱトレイトやミックスイン使う方がスマートだと思うわ。
0826デフォルトの名無しさん
2013/02/24(日) 21:13:13.84インスタンスを注入できないと意味が無い。
0827デフォルトの名無しさん
2013/02/24(日) 22:06:29.700828デフォルトの名無しさん
2013/02/24(日) 22:35:02.85SpringのAOPにしてもDIはしていないぞ。DIを使うこととDIコンテナを使うことは区別しろよ。
Beanの生成をSpringフレームワークが制御するという特質を上手く利用して、Bean生成時に
プロキシクラスでラップしているだけでしょ。Beanを包みこそすれ何も注入はしていない。
0829デフォルトの名無しさん
2013/02/25(月) 00:59:41.17> Springとかに依存しておいてPlainでもOldでもないわな。
君、わかってないよ。
Springを使ったとしても、Springに
依存することはないんだよ。
不思議でしょう?
DIコンテナ以外のフレームワークが、クラスに便利な機能を提供するのと違って
DIコンテナは依存関係を分離するためにクラス外から注入することに特化しているから。
0830デフォルトの名無しさん
2013/02/25(月) 01:30:42.84Spring依存になってしまったけれども、今はDI用のアノテーションもJSR330で
javax.injectとして標準化されたものが使えるから、アノテーションでDI定義
しても使うDIコンテナには非依存だね。
Mavenに何個かdependency追加してポチポチとアノテーションつければサクッと
DI使える。別に身構える必要も何もないお気楽技術になって快適至極。
0831デフォルトの名無しさん
2013/02/25(月) 01:56:27.75というか、そういうことでもなく、
Springを使えばSpringがなければシステムが動かないのは当たり前。
依存関係っていうのは、クラスが他のクラスの実装に依存してしまうこと。
インターフェースに依存するのは問題ないけれど、実装に依存すると
その実装を他に実装に(ソースコードを修正せずに)に置き換えれない。
だからクラスではインターフェースの利用は行うけど、
その実装はクラス内部では生成(new)しない(=外部で行う)というルールにしましょう
っていうのがDIという考え方。(そしてそれをやってくれるのがDIコンテナ)
DIを使うことを前提にしたクラスは、他のクラスに依存しないから
再利用や単体テストがしやすくなる。システム全体を動かすときはspringがいるけど
(システムってのは依存関係の組み合わせてできるから当然)
そのクラスを単体で使うときspringはいらない。
クラス生成部分の依存関係を取り除いたのがDI。
動的言語では、DIコンテナは言語仕様で簡単に実装できる事が多いが
だからといって、クラス外部でnewするというDIという構造になるかどうかは別問題。
自分でクラス内部でnewしないように、気をつけないといけない。
でそういうのをコーディングルールとして書くよりも
DIコンテナというフレームワークを使うことで、自然とコーディングルールになるほうが健全
だから動的言語でもDIコンテナは有用。
それは例えば「gotoは例外目的にだけ使いましょう」というコーディングルールを作るよりも
例外を作ったほうが意図が明確になるのと同じ事。
0832デフォルトの名無しさん
2013/02/25(月) 02:30:37.13というか、そういうことでもなく、一段階下のレイヤーの話ね。
DIをするには何を何処に注入するかという情報をどこかに書く必要があるわけだけど、
それが昔はapplicationContext.xmlなどの外部XML、昨今はアノテーションが便利。
ところが設定XMLの仕様とか用意されたアノテーションはSpringといったDIコンテナの
実装の一部であるわけで。
特にアノテーションはSpringの実装で用意されたJavaアノテーションそのものだから、
ビルドにも実行にもSpringの実装を必要とする。DIのアノテーションを使う事で
コンポーネント間の依存性を簡単に疎にできる一方で、コンポーネントがどうしても
DIコンテナの実装に依存してしまうのが難だった。
別の言葉で言うと、コンポーネントの実装を差し替えるのが簡単な一方でDIコンテナ
の実装を差し替えることは簡単じゃなかった。特にアノテーション使うとDIコンテナ
への依存性がクラス定義に埋め込まれてしまうのでにっちもさっちもいかなくなる。
でも今はjavax.injectの@InjectアノテーションをつけておけばSpringでもGuiceでも
正しく注入される。DIに関してはDIコンテナへの依存をかなり減らして書けるように
なってきて良い時代だなぁと。
0833デフォルトの名無しさん
2013/02/25(月) 02:36:25.13きっと動的言語最強だから
こんな知識不要とか思ってるんだろうな。
0834デフォルトの名無しさん
2013/02/25(月) 07:54:28.50ていうか内部でnewしてたって後で入れ替える事すらできる
まあメタクラスとか知らんだろうけどな
0835デフォルトの名無しさん
2013/02/25(月) 09:09:11.09それ、カプセル化ぶち壊しってだけだぞw
function foo() {
var o = new Obj();
o.bar();
}
で、どうやって入れ替えるの?
0836デフォルトの名無しさん
2013/02/25(月) 09:23:12.870837デフォルトの名無しさん
2013/02/25(月) 16:27:59.66介して出来るからリフレクションの類は必要ない。
ただ動的言語、というか実行時コンパイルの言語の場合設定ファイル自体が実行可能コードで
ある場合も多く、その場合は他の設定と同様に注入も設定ファイルの中にDSL的な記法で直接
コーディング出来たりするので特にDIコンテナは必要が無い。
他方で事前コンパイルなJavaの場合、設定ファイルがJavaファイルということはまず無い。
なので注入はコードとして記述は出来ず、XML等で記述された情報を読んでリフレクションを
使って注入をしていく必要があるので、その辺の面倒くさい作業ががDIコンテナとして実装
されている、のだと思う。アノテーションも同様。
動的言語の世界にDIコンテナをあまり見かけないのは、動的静的云々よりも実行時コンパイル
か否か、設定ファイル自体がコードであるか否かの違いではないかなと思う。
0838デフォルトの名無しさん
2013/02/25(月) 21:16:33.39> 介して出来るからリフレクションの類は必要ない。
コンストラクタの引数やセッターを介してやると冗長になるんだよ
Javaのようなウンコ言語の場合は
0839デフォルトの名無しさん
2013/02/25(月) 23:24:55.49class T(type):
pass
class Obj(metaclass=T):
def bar(self):
print('bar')
def foo():
o = Obj()
o.bar()
foo() # => bar
class Foo():
def bar(self):
print('foo')
T.__call__ = lambda self, *args, **kwd: Foo()
foo() # => foo
0840デフォルトの名無しさん
2013/02/26(火) 06:49:52.790841デフォルトの名無しさん
2013/02/26(火) 07:43:50.790842デフォルトの名無しさん
2013/02/26(火) 09:23:50.41リフレクションでロジックにホットパッチ当てるのに固執するのかよくわからんw
ちなみに今時のDIコンテナは注入するインスタンスのライフタイム制御はデフォで、
永続的なシングルトンだけではなくセッション毎やリクエスト毎といった異なる
スコープ単位でインスタンス生成して注入出来るのだが。
こう書いておけばメタクラスを駆使してライフサイクルのスコープを実装する例を
頑張って作るのだろうなぁ。どうやら簡単らしいし。
0843デフォルトの名無しさん
2013/02/26(火) 20:01:13.09あ、読めないんだった
0844デフォルトの名無しさん
2013/02/26(火) 21:12:18.88大多数のドカタという分業体制が成立してるから、
DIの実装すると聞くだけでドカタから見ると
壮大なことに見えてしまうんだろうね。
これは文化的な違いだから仕方ない。
0845デフォルトの名無しさん
2013/02/26(火) 21:56:38.37> 普通にオブジェクトをセットするだけで済む簡単なお仕事なのに、なんでわざわざ
> リフレクションでロジックにホットパッチ当てるのに固執するのかよくわからんw
ライブラリ製作者側とライブラリ使用者側に
分けて考えましょう。
リフレクション云々はライブラリ製作者側です。
つまり、使用者側には関係ありません。
ライブラリ側が色々やってくれるおかげで
使用者側はシンプルで意図が明確なコードが書けるのです。
それがメリットだとわかりませんか?
0846デフォルトの名無しさん
2013/02/26(火) 21:58:00.36> DIの実装すると聞くだけでドカタから見ると
> 壮大なことに見えてしまうんだろうね。
いいえ。壮大だと思ってるのは、貴方では?
だから、いま壮大だって思ってしまったのでしょう?
0847デフォルトの名無しさん
2013/02/27(水) 07:36:55.540848デフォルトの名無しさん
2013/03/01(金) 12:13:17.550849デフォルトの名無しさん
2013/03/02(土) 00:09:39.61exampl := DI TypeId0 new.
"注入定義側"
DI TypeId0: Integer.
DI TypeId1: String.
DIなんてこんなもんでいいだろ。
仰々しいライブラリーもいらん。
0850デフォルトの名無しさん
2013/03/02(土) 00:52:33.35まさに>>849程度のものだよ。
最初っからそう言ってるのに。
0851デフォルトの名無しさん
2013/03/02(土) 01:01:42.330852デフォルトの名無しさん
2013/03/02(土) 04:12:59.84書き換えるとか、そんな話の時点であぁDIコンテナ使った経験が無いのだなぁと判る。
使った経験が無いから、DIコンテナのユースケースや依存性とは何かも理解していないでしょ。
クラスやロジックが変わらない場合もDIコンテナって使うんだよ。
0853デフォルトの名無しさん
2013/03/02(土) 08:26:20.97DIコンテナどころかプログラムも書いた事無いSEが言いそう。
0854デフォルトの名無しさん
2013/03/02(土) 09:15:13.24メタクラスに食いつき過ぎww
ていうか、ロジックを書き換えるって何の話だ?
お前のコードのロジックはnew演算子に依存してんのか?
0855デフォルトの名無しさん
2013/03/02(土) 12:52:14.97DIで重要なのは、依存関係を内部から取り除くという考え方と
DIコンテナが、POJOを扱えるという点によって
変化した、継承が不要な(必要最小限でいい)設計手法
誰もDIの仕組みで大騒ぎなんてしてないよw
0856デフォルトの名無しさん
2013/03/02(土) 13:02:15.56どうでも良い実装の詳細
そんなものはDIという概念のメリットでもなんでもない
0857デフォルトの名無しさん
2013/03/02(土) 13:04:24.43このメソッドは何処で定義してある?
ない。親クラスか? ない? 更に親クラスか? ない? 更に親クラスがあるぞ。さらに略
0858デフォルトの名無しさん
2013/03/02(土) 13:06:34.150859デフォルトの名無しさん
2013/03/02(土) 13:08:55.74親クラスに依存しているということ。
たとえばActiveRecordのように依存関係に
ないものを継承てはいけない。
継承は、is-a関係にある場合に行う。
特定のモデルは、ActiveRecordと同じものか?
違うね。ActiveRecordの機能を使ってるだけ。
これはhas-a関係が正しい。
このように、フレームワークの規約によって
無理やり継承を導入させて依存するような設計は良くない。
0860デフォルトの名無しさん
2013/03/02(土) 13:18:37.730861デフォルトの名無しさん
2013/03/02(土) 13:30:35.57その二つを取り替えられるようにする。
そういう時、モデルが(自分自身で)mix-inするのではなく
モデルが(誰かによって)mix-inされるという設計を取ると
二つの実装を取り替えられるという目的をスマートに達成できる。
これがDIの考え方。
0862デフォルトの名無しさん
2013/03/02(土) 13:34:54.81mix-inしたとき、mix-inしたメソッドをprivateにできるのかな?
意図的にpublicにしたいならpublicにするのもいいけど、
ActiveRecordの場合、基本privateにするべき。
全部publicにしかできないなら、それはis-a関係と同じになってる。
0863デフォルトの名無しさん
2013/03/02(土) 15:56:04.59>>849の方法で十分じゃん何が言いたいの?
0864デフォルトの名無しさん
2013/03/02(土) 16:06:46.49・同じクラスであってもインスタンス毎に異なる依存性を注入したい。
・状態を持った依存性を注入したい・例えばデータベースハンドラとか。
・状態を持った依存性の場合、そのインスタンス生成を制御したい。
シングルトンだとかインスタンス生成をファクトリに委譲するとか。
0865デフォルトの名無しさん
2013/03/02(土) 16:17:18.87こんなんでいいだろ
DI Type1
subclass:#Derived
instanceVariableNames:''
classVariableNames:''
poolDictionary:''
category:'example'.
0866デフォルトの名無しさん
2013/03/02(土) 16:44:32.20アプリケーション毎にクラスAに異なる依存性を注入出来るのは当然として、同じアプリ内でも
例えばクラスAのインスタンスがクラスBのプロパティであるときとクラスCのプロパティである
ときにはクラスAのインスタンスにそれぞれ異なる依存性を注入したい
・実行時のコンテキストやライフタイムに応じて異なる依存性を注入したい。
データベースハンドラのように実行中ずっと共有される依存性、セッション毎に共有される依存性
リクエスト毎に共有される依存性、使い捨ての依存性などの違いを手間をかけずに扱いたい。
・そういった注入のされ方の詳細を注入される側には書きたくない。例えばインスタンス毎に
生成される依存性はnewで、シングルトンなどの場合はファクトリを、なんてのを注入される
側で書くのは最悪。注入される側にとっては注入される依存性がシングルトンなのか否かは全く
あずかり知らぬこと。
・依存性の注入し忘れをプログラム開始前に検出したい
・注入も出来るところは規約ベースなどで自動化したい
・等々といったよくある作業を新たに手組をせずに実現したい
0867デフォルトの名無しさん
2013/03/02(土) 16:48:03.11依存関係が取り除けてないのでDIとしてはまだ足りないな。
DIされる側のクラスは、DIされたオブジェクトが
いつ生成されたのか(するのか)を意識してはいけない。
もしかしたらアプリの起動時に生成されたかもしれないし、
必要なときに生成時に作られたのかもしれない。
そしてこのオブジェクトはプロジェクト全体で一つしか
生成されないかもしれないし、複数生成されるかもしれない。
これらはシステム全体の依存関係を決めるときに考えることで、
単体のクラスで考えないほうが良い。(という設計方針がDI)
単純に言えば、依存関係を必要とするものは、内部でnewしてはいけない。
newは外部の「newマネージャクラス」という別名をあげたくなるような
DIコンテナにやらせるということ。
FactoryはDIコンテナの一番シンプルな姿と考えていい。
0869デフォルトの名無しさん
2013/03/02(土) 16:50:55.18ドカタ言語に無い概念だから知らなかったんだね
0870デフォルトの名無しさん
2013/03/02(土) 16:56:34.72まあ、こう言ってるのと同じ。
アセンブリ言語みればわかるように、プリミティブ(原始的)な機能でも複雑なことは出来る。
だけどそれでは、やれることが多すぎて間違った使い方をして、結果何がしたいのかわからなくなる。
まさにgotoと例外の関係と一緒。
C言語でエラーになったときはgotoで飛ばすと例外処理がスッキリとかける。
だがgotoはスパゲティコードの元。例外処理(try-catch)としてエラー専用の
機能があると意図が明確になり、間違った使い方も減る。
メタクラスもスパゲティコードの元なので、
意図が明確な機能に置き方方がいい。
メタクラスはライブラリを作るためのものと考え、
通常のアプリではメタクラスは意識するものではない。
ライブラリ内に隠蔽するものだ。
実際フレームワークを使った開発ではそうなってるだろ?
メタクラスを使って、DIコンテナ(フレームワーク)を作れ。
そうすれば、意図が明確なコードが書けるようになる。
0871デフォルトの名無しさん
2013/03/02(土) 16:59:33.930872デフォルトの名無しさん
2013/03/02(土) 16:59:36.57C#、Java以外の言語かな?
0873デフォルトの名無しさん
2013/03/02(土) 17:02:26.49これがJava脳か。オブジェクトがインスタンスか
クラスで有るかなんてどうでもいいし
インスタンスかクラスかで区別するようなコードを書いちゃいけない
0874デフォルトの名無しさん
2013/03/02(土) 17:02:43.87それはnewのオーバーライドではなく、コンストラクタのオーバーライドじゃないか?
Class1.new() したときClass1のインスタンスではなく
Class2のインスタンスができましたって言うのが
newのオーバーライド(でできること)なんだが。
0875デフォルトの名無しさん
2013/03/02(土) 17:03:42.49レスが的外れ。
インスタンスかクラスかなんて話は全くしていない。
インスタンスという用語すら出ていない。
0876デフォルトの名無しさん
2013/03/02(土) 17:04:46.07誰に何が言いたいの?
お前の日記か?
0877デフォルトの名無しさん
2013/03/02(土) 17:05:51.57>FactoryはDIコンテナの一番シンプルな姿と考えていい
でも今度はファクトリが新たな依存性となるよねw
そして依存性毎にファクトリが立ち並ぶファクトリ地獄に。
そこでカスタマイズ可能なアブストラクトファクトリの実装と、注入される側の内部から
ファクトリの呼び出しを排除して、代わりに誰かが外部で呼んで注入する、その作業を
自動化する仕組みを提供しているのが現代的なDIコンテナかと。
0878デフォルトの名無しさん
2013/03/02(土) 17:09:08.14object := Class.
object new.
object := Factory new.
object := object new.
やっぱJava脳だね〜
0879デフォルトの名無しさん
2013/03/02(土) 17:09:26.22ただの関数だからnewのオーバーライドできるよ。
Package Class1
sub new {
return Class2->new();
}
1;
こう書くと
my $c = Class1->new() したときに
$cはClass1とは無関係な、Class2のインスタンスができる。
混乱したのなら、こう読み替えればいい。
Package ClassFactory
sub create {
return Class2->new();
}
1;
my $c = ClassFactory->create()
で、これがDIコンテナのシンプルな形。
0880デフォルトの名無しさん
2013/03/02(土) 17:11:35.66コンテクストに応じた注入ができれば、内部でnewしててもDIできる
ただのシンタックスの話
0881デフォルトの名無しさん
2013/03/02(土) 17:18:25.71Smalltalk
Perl
Python
Ruby
Go
Javascript
Lisp
単にC++系統のやり方が少数派なだけだろ
0882デフォルトの名無しさん
2013/03/02(土) 17:19:19.81ただ手軽にやりたいし車輪の再発明はしたくないから、DIコンテナを拾ってきて使う。
0883デフォルトの名無しさん
2013/03/02(土) 17:20:38.07my $c = ClassFactory->create()
これがDIコンテナのシンプルな形と言った。
それっぽく名前を変えると、
my $c = DI->create()
だな。DIを使ったクラスを書いてみる。
package My;
sub main {
my $c = DI->create();
$c->foo()
}
この欠点はmainを呼び出した時に$cが作られるということ。
DIの発想では$cは「誰かが作ったもの」であり生成のタイミングは
Myクラスを書く人が考えるべきことではない。
あと単にcreateメソッド(new)呼び出しを書くのが面倒というものもあるw
この場合は引数なしからいいけど、何度も同じ引数でnewするの面倒でしょ?
ってことで、DIを使ったコードはもっとシンプルにこんな感じになる。
(Perlのコードとしてはちょっとおかしいけど、説明のための不要な冗長コードを削ってる)
package My;
sub main {
$c->foo();
}
$cは誰かが生成してくれたもの。このコードからは、誰が生成したか
いつ生成されたかなどという「依存情報」がなくなった。
0884デフォルトの名無しさん
2013/03/02(土) 17:21:28.88大根入れるのもメンドクセ
0885デフォルトの名無しさん
2013/03/02(土) 17:23:19.10なんでいちいちnewするんだろ?
「誰かが生成してくれたもの」として
コーディングしてる例が少なすぎる。
0886デフォルトの名無しさん
2013/03/02(土) 17:26:00.72範囲を限定した文脈での依存性注入ってのを
具体的にコードで書いてくれるか?
何か回りくどいこと考えてる気がする
0887デフォルトの名無しさん
2013/03/02(土) 17:27:47.77newしてるものは置き換えられるがな
0888デフォルトの名無しさん
2013/03/02(土) 17:27:55.68まだDIの発想に追いついてないからだと思う
Javaなどでは、まず最初にDIの発想があって
それを実現するために、DIコンテナができた。
静的型付け言語では難しいからね。
それをみてDIコンテナを作ることがゴールだと
思った人たちが、動的型付け言語ならDIコンテナ不要だよと言い始めた。
それはそれでいいんだが、DIコンテナの実装という話で終わって、
DIの発想にはまだたどり着けない。
DIの不要ではなく、DIコンテナ不要になっているのがいい証拠だ。
DIコンテナがあることでDIの理解につながると思うが、
さてDIコンテナなしで、なんでもできるアセンブラのよう機能を使って
高級言語的機能を理解できるようになるだろうか?
不可能ではないけど、たどり着けない人が多そうだ。
0889デフォルトの名無しさん
2013/03/02(土) 17:29:36.87newするというコードが持っている
依存関係を外部に「置き換える」というのが
DIの本質。
newしてる行をその場で別の書き方に置き換えてもダメ。
newしてる行そのものを消し去って、クラス外に書くことが重要。
0890デフォルトの名無しさん
2013/03/02(土) 17:31:36.08まさにこれ
package My;
my $c;
sub main {
$c->foo();
}
$cは中で生成していない(なのになんで使えるんだ!?)
外部から注入しているからだよ。
0891デフォルトの名無しさん
2013/03/02(土) 17:31:55.66置き換えりゃ済むもん
無意識にできるから意識する必要ないもん
0892デフォルトの名無しさん
2013/03/02(土) 17:33:08.22それは無意識ではない。
0893デフォルトの名無しさん
2013/03/02(土) 17:35:38.200894デフォルトの名無しさん
2013/03/02(土) 17:35:59.07だから簡単に出来るじゃん
newはオブジェクトにメッセージを送ってるだけ
じゃそのメッセージの送り先となるオブジェクトを
プログラムの起動時点で置き換えりゃいいだけ
0895デフォルトの名無しさん
2013/03/02(土) 17:37:29.01お前が言ってる、簡単にできるというのは
「DIコンテナ」の機能。
DIは考え方だ。
0896デフォルトの名無しさん
2013/03/02(土) 17:40:37.760897デフォルトの名無しさん
2013/03/02(土) 17:40:47.18じゃそんな事できるツールなんて存在しなくね
大根ツールだって大根入れにゃならんし
設定も書かにゃならん
コードにも手を入れにゃならん
実態のクラスとnewメッセージが送られるクラスの
対応をマッピング用のスクリプトにまとめとく
ほうが遥かにマシだろ
0898デフォルトの名無しさん
2013/03/02(土) 17:47:29.06だから何?
そもそも静的型じゃないとDIし辛いとか
アホみたいな発言から始まった議論だろ
0899デフォルトの名無しさん
2013/03/02(土) 17:52:08.80例
0900デフォルトの名無しさん
2013/03/02(土) 17:53:43.140901デフォルトの名無しさん
2013/03/02(土) 17:54:10.10>>894のいう「簡単にできる」と
俺の「簡単にできる」とでは求めてるレベルが違う気がする。
俺が言いたいのは、もっと簡単にできるよね? だ。
例えば、変数の値が数値かどうかを判定するのは、
正規表現で「簡単にできる」それが>>894が言ってるレベルで
俺はIsNumberという関数を作れば「もっと簡単にできるよね?」ということ。
メリットは簡単にかけるというだけじゃない。文字列でやる正規表現と違って
関数ならコンパイルチェックも出来るだろうし、修正が必要なとき
関数内部を修正するだけでいい。数値チェックをしている場所を探すのも簡単だし、
バグへの対応やメンテナンス性というメリットがある。
だがそれでも>>894は(正規表現や自分でコードを書いて)簡単にできる。と言うのだろう。
0902デフォルトの名無しさん
2013/03/02(土) 17:56:27.37> DIし辛いとか
> アホみたいな発言
それどれ?
DIという考え方の話をしていたら
DIコンテナは動的型付け言語で簡単に実装できるって
話からずれていったんだろ?
DIの話が出たのは、>>800からかな?
0903デフォルトの名無しさん
2013/03/02(土) 18:01:22.37DIコンテナがなくてもDI出来ると思うけど
コードのドキュメント性からいったら
DIコンテナがあったほうがいいかな
コードのドキュメント性というのは
コードにコメントを書くのではなく、
コードそのものが、ドキュメントとして読みやすいという意味。
例えば、IsCreditCardNumberなら、クレジットカード番号チェックだなってわかるけど
それを正規表現で書いても、クレジットカード番号なのか、電話番号なのか
すぐにはわからないでしょ?
0904デフォルトの名無しさん
2013/03/02(土) 18:05:31.10DIコンテナ使うほうが「よっぽど正規表現を
使えば簡単にできる」になってるだろ
型を間違えればエラーになるのは動的型だろうが
静的だろうがかわらん
かと言って依存性をクラス内から排除するのも
クラスかオブジェクトであればDIコンみたいな
もので無理矢理排除するんじゃなく
自然に排除できる
0905デフォルトの名無しさん
2013/03/02(土) 18:07:01.19オレオレDIコンテナモドキ規約を作るよりも、
有名なDIコンテナを使ったほうがいいと思うよ。
0906デフォルトの名無しさん
2013/03/02(土) 18:10:42.81大抵インタープリターだからスクリプトにマッピング
書いてimportすりゃ十分でしょ
使う側も代入しか書いてないから意味がすぐわかる
0907デフォルトの名無しさん
2013/03/02(土) 18:10:43.65いや、だからDIは考え方で
DIコンテナはその考え方を実践するための道具
DIコンテナは依存関係を無理やり排除する道具ではなく、
依存関係を外にだすときに使う道具だよ。
お前DIコンテナの役割すら間違ってるじゃん。
0908デフォルトの名無しさん
2013/03/02(土) 18:16:42.71コードを読めば意味がわかる
正確に言えば、コードを読まないと意味がわからない。
読んだ所で、なんでこんなコードになってるの?
あほじゃねって思われるだけ。
そこでDIのためにこのようなコードになってますと
君はコメントを残すわけか?
コメントには、コードの動きを書くのではなく
どうしてそのようなことをしたのか、
その意図を書くものだからそれは正しいな。
でも、コメント無しで、コード見ただけで
その ”意図” がわかるならそのほうがもっといいんだよ。
0909デフォルトの名無しさん
2013/03/02(土) 18:17:30.03だからどうしたんだよ
ここでDIは考え方だって言われても話が
つながってないだろうが
そもそもクラスオブジェクトが使えりゃ
DIがDIコンより簡単に出来るって言ってるんだ
最初からDIコン=DIになってないだろ
0910デフォルトの名無しさん
2013/03/02(土) 18:22:16.21可読性は別問題だな
可読性の主義によってはOOとも
背離するし別議論だ
0911デフォルトの名無しさん
2013/03/02(土) 18:24:29.30number instanceof CreditNumberの方が分かりやすいかな
0912デフォルトの名無しさん
2013/03/02(土) 18:26:03.49良くも悪くも普通にnewしてるように見えるんだから
読む側がロジックを追うときにDIコンテナの存在を意識する必要はない
DIコンテナ側のコード読むときは、そりゃ意味わかるだろ
代入してるだけなんだから
0913デフォルトの名無しさん
2013/03/02(土) 18:26:28.20> DIがDIコンより簡単に出来るって言ってるんだ
できないよ。できるというのならnew使わないで
newしてみ。
今、お前が頭のなかで考えたのが、
DIコンテナだから
0914デフォルトの名無しさん
2013/03/02(土) 18:28:01.38> 良くも悪くも普通にnewしてるように見えるんだから
DIの考え方に反してるじゃん。
newしてなくても使える。なぜだ
外部から注入しているから。
なるほど、newするのを意識しなくていいんだね。
それがDIの考え方。
0915デフォルトの名無しさん
2013/03/02(土) 18:28:43.410916デフォルトの名無しさん
2013/03/02(土) 18:29:55.20そうではなく、newそのものを忘れてくださいってのがDIです。
0917デフォルトの名無しさん
2013/03/02(土) 18:30:47.90じゃあnew演算子が無い言語はどうなるの?
0918デフォルトの名無しさん
2013/03/02(土) 18:33:09.55実行時とか後天的に依存性を注入出来るって事じゃなく
単にnewを使わない事だったんだ(衝撃)
0919デフォルトの名無しさん
2013/03/02(土) 18:36:41.86通りで話しが食い違うわけだ()
0920デフォルトの名無しさん
2013/03/02(土) 18:37:04.47反する動きをしてはいかんよ。
newって書いてるのに、実はnewしてませんでしたとか
罠以外のなにものでもないから。
こういうのを可読性というんだがねぇ。
0921デフォルトの名無しさん
2013/03/02(土) 18:39:06.03それが抽象化ってもんだろうが
0922デフォルトの名無しさん
2013/03/02(土) 18:39:54.38OSが書かれている言語がCであるという意味はあまりに大きい。
0923デフォルトの名無しさん
2013/03/02(土) 18:40:19.95> じゃあnew演算子が無い言語はどうなるの?
new演算子はオブジェクト生成の手段だ。
new演算子がなければ、同じ目的の物の話に置き換えれば良かろう?
>>918
> DIってクラスから依存性を排除し
> 実行時とか後天的に依存性を注入出来るって事
あってますよ。
>>919
>そうかJava厨にとってDIはnewを使わないって概念だったのか
ぷw オブジェクトの生成が外部でやるからnewがでてこなくなるだけだよw
0924デフォルトの名無しさん
2013/03/02(土) 18:43:32.37> 普通にnewしてたと思って読んでも全く問題無いんだよ
それだめじゃん。
newがまったくでてこなければ、
いつ生成されたかなんて考えることが出来ない。
newしたと思っているのなら、その時にnewされたはずって思ってしまう。
例えばnewされた時にこの処理やってるのだからって勘違いしてしまう。
0925デフォルトの名無しさん
2013/03/02(土) 18:45:40.37DIコンテナを使わなくても、newを使ってても
クラスから依存性を排除できるし、実行時とか後天的に依存性を注入出来る
という話に対し、newを排除するのがDIだと>>916が言い出したんだろうに
0926デフォルトの名無しさん
2013/03/02(土) 18:48:12.58プログラマがそんなレベルじゃメッセージ転送を使ったコードは読めない
話にならないよ
0927デフォルトの名無しさん
2013/03/02(土) 18:49:17.88factory := Factory new.
object := factory new.
よく有るパターンだがどの辺が罠よ?
因みにSmalltalk系統だとnewを直接使うことは少なくて
生成メソッドで代用する
type := Type.
object := type typeWithValue:0.
type := Factory type.
object := type typeWithValue:0.
0928デフォルトの名無しさん
2013/03/02(土) 18:52:33.00Factoryを使う所が罠。
その時点で生成していると
思ってしまってる。
生成タイミングを意識している時点で
DIにたどり着いていない
0929デフォルトの名無しさん
2013/03/02(土) 18:55:24.04実際オブジェクト生成するのはprotoNewとか
そんなんだったりするんだよねー
言語的に最初からオーバーライド前提の仕様なんだよねー
0930デフォルトの名無しさん
2013/03/02(土) 18:56:06.41DIの説明してるんじゃないんだが
0931デフォルトの名無しさん
2013/03/02(土) 19:03:45.01オブジェクト指向向いてねえんじゃね?
0932デフォルトの名無しさん
2013/03/02(土) 19:05:50.770933デフォルトの名無しさん
2013/03/02(土) 19:11:11.320934デフォルトの名無しさん
2013/03/02(土) 19:33:32.02のと
プログラマが「誰かが生成している」と思っている
では全然意味が違う。前者は自分の意図に反する動きをしており、
後者は、自分の意図に反していない。
0935デフォルトの名無しさん
2013/03/02(土) 19:36:55.95CでもBasicでもやってなよ
0936デフォルトの名無しさん
2013/03/02(土) 19:40:11.79読んだまんまで可読性抜群だし
Javaは現代版COBOLとも言われるしな(笑)
0937デフォルトの名無しさん
2013/03/02(土) 19:40:37.200938デフォルトの名無しさん
2013/03/02(土) 19:44:11.10そうじゃなくて出来るだけOOしない言語使えば
ってことだろ
0939デフォルトの名無しさん
2013/03/02(土) 21:12:43.37DI的にはファクトリに依存しているので依然ダサい。
0940デフォルトの名無しさん
2013/03/02(土) 21:41:04.32object := DI type1 new.
object := DI type2 typeWithValue:0.
DI type3
subclass:#type
instanceVariable:''
classVariable:''
poolDictionary:''
category:'Independency'.
"依存注入側"
DI type1: Integer.
DI type2: TypeForIntegerFactory.
DI type3: Integer.
"或いは"
delegate := Factory new.
DI type1: delegate.
"別解としてClass辞書を直接書き換えてしまう"
OldType := Type1.
System classDictionary replaceClass: #Type1 ToClass: #Integer.
依存性排除するにゃ大体これだけできりゃいいんでしょ
0941デフォルトの名無しさん
2013/03/02(土) 21:53:03.03することも多いのだけれども、newを使う場合はどう簡単に書けるのかな。
0942デフォルトの名無しさん
2013/03/02(土) 21:58:21.09大概やられていること。以上した依存性を解決するのも内部からファクトリ経由で引っ張って
きたり外部から注入したりと、フレームワークの実装を覗いてみれば色々やられている。
例えばデータベースのハンドラなんかはJavaの世界でも委譲される依存性の筆頭格だけれども
これはActiveRecordにしてもデータベース接続は別オブジェクトに委譲されていて、その解決
もプールから普通にインスタンスを引っ張ってくる仕組み。別にnewの書き換えとかしていない。
DIはnewのゴニョゴニョ云々で出来ると言っている人は単に腕自慢ではなくて、実際に広く使わ
れているフレームワークでその手法がどの程度活用されているのかコード例を示してもらえると
助かる。
0943デフォルトの名無しさん
2013/03/02(土) 22:07:33.46DI type1: NewDelegate withBlock:[Integer integerWithInteger:0.].
"依存排除側"
DI type1 new."Integer integerWithInteger:0.の戻り値が返される"
ね。簡単でしょ。
0944デフォルトの名無しさん
2013/03/02(土) 22:10:41.00ActiveRecodって局所的な意味になるから
メッセージ転送って言ってくれないか
メッセージ転送ならWikipediaにも乗ってるし
複数の言語で使える
0945デフォルトの名無しさん
2013/03/02(土) 22:42:12.10一言言っておくわ、
お前が言ってる依存性ってのは
DIで排除しようとして依存性と全く関係ない。
0946デフォルトの名無しさん
2013/03/02(土) 22:43:16.96DIの考え方にまでいたらないのは面白いね。
手段(DIコンテナ)と目的(DI)が
逆になってる。
0947デフォルトの名無しさん
2013/03/02(土) 22:49:06.08は?ActiveRecordの振る舞いはデータベースハンドラに依存しているでしょうが。
DIで排除しようとしている依存性って何だろう?
0948デフォルトの名無しさん
2013/03/02(土) 22:49:40.45例はこのスレに幾つか出てるだろ
お前はどういう結論に持っていきたいんだ?
0949デフォルトの名無しさん
2013/03/02(土) 22:53:31.21一部のクラスじゃ無くて自分が作ったクラス全てを
他のクラスから独立させ、実行時に全ての依存性を
注入するって事じゃないかな
既に何個かこのスレでも例はでてる
0950デフォルトの名無しさん
2013/03/02(土) 22:54:05.011.継承をやめること。is-a関係ないものは継承させない
2.あとでなw
0951デフォルトの名無しさん
2013/03/02(土) 22:58:18.25動的に継承できるなら関係ねえ
0952デフォルトの名無しさん
2013/03/02(土) 23:00:58.82言っとくが、実行時に継承するのも無しだよw
(当たり前だけど、is-a関係にないものの話)
0953デフォルトの名無しさん
2013/03/02(土) 23:02:44.06データベースハンドラを排除されるべき依存性だと見られないのであれば驚きだわ。
単にクラスの実装を入れ替えるだけがDIだと思っているのなら勘違いも甚だしいし、DIコンテナ
のユースケースが本当にわかっていない。
0954デフォルトの名無しさん
2013/03/02(土) 23:04:42.54何故?それこそDIを無視してDIコン実装に依存してるだけだろ
手段が目的になってる
目的は依存を排除する事のはずだ
0955デフォルトの名無しさん
2013/03/02(土) 23:11:30.49コンポーネントの実装はDIコンテナの実装に依存しないよ。
0956デフォルトの名無しさん
2013/03/02(土) 23:16:58.98DIコンテナに依存してないわけがないだろ!
0957デフォルトの名無しさん
2013/03/02(土) 23:17:30.45継承に制限がある時点でもろに依存してるじゃねぇか
結局あれだろJavaは簡単に動的継承できねぇから
継承元を依存注入対象にできませんってだけだろ
要は純粋な依存性注入はJavaじゃ出来ませんって話だ
0958デフォルトの名無しさん
2013/03/02(土) 23:18:18.06継承に制限、無いよ?
0959デフォルトの名無しさん
2013/03/02(土) 23:19:45.330960デフォルトの名無しさん
2013/03/02(土) 23:21:20.53純粋なDIなんて無理。純粋なDIをするなら
動的型付けかgoみたいな方法を取るしかない
0961デフォルトの名無しさん
2013/03/02(土) 23:21:42.13クラスにメソッドをはやさないことにメリットが有るって
気づいていないのかな?
何でもかんでも、メソッド生やしてバカみたい。
必要ないメソッドはむしろ生やしたほうが
デメリットが有るというのに。
カプセル化もそうだよね。外部から見せないという
メリットがわかってないとしか思えない。
0962デフォルトの名無しさん
2013/03/02(土) 23:24:36.13依存しないよ。DIコンテナ無しでも実行できるよ?
0963デフォルトの名無しさん
2013/03/02(土) 23:28:00.08何だよ純粋なDIって?
0964デフォルトの名無しさん
2013/03/02(土) 23:28:51.20動的言語の代表格であるシェルスクリプトさんには
メソッドなんてありませんよ。
代わりに関数とかコマンドは有りますが。
0965デフォルトの名無しさん
2013/03/02(土) 23:31:48.73Dependecy Injection
純粋な依存性の注入とは全ての依存性を後で注入できる状態
不順な依存性の注入とは一部の依存が残ってて
後で依存性を注入できない状態
0966デフォルトの名無しさん
2013/03/02(土) 23:48:09.41そのシェルスクリプトの話してるの?
mix-inとかできるレベルの言語の話だと思っていたんだが?
0967デフォルトの名無しさん
2013/03/02(土) 23:51:59.50皆は動的型付け言語の話をしているね
君は動的言語が気になるらしいけど
0968デフォルトの名無しさん
2013/03/02(土) 23:54:25.38おかしいなぁ?w
動的言語
抽出レス数:56
動的型付け
抽出レス数:36
所で動的型付け言語の
スクリプトってどれだ?
0969デフォルトの名無しさん
2013/03/02(土) 23:55:11.07型付けが動的であるということ、
つまり型が存在するということ。
0970デフォルトの名無しさん
2013/03/02(土) 23:56:39.94型はあるんだからね!
0971デフォルトの名無しさん
2013/03/03(日) 00:00:03.46動的型付だとJavascriptかな
PerlやPythonとかは俗にScriptと呼ばれる事もあるけど
公式には汎用言語(Genral-purpose language)てScriptじゃないらしいし
0972デフォルトの名無しさん
2013/03/03(日) 00:09:05.71この動的型付言語スレができた歴史をしらん奴らが増えたな
その昔動的言語はダメだの云々のスレがあった
その中で動的言語と動的型付言語は別物だろという揉め事が起きた
そのうち動的型付け排斥派が動的型付隔離スレを立て動的型付を排除
その後その動的型付スレを継承する形でこのスレが生まれた
動的言語、動的言語連呼してるとそのうちまた隔離スレができるぞ
0973デフォルトの名無しさん
2013/03/03(日) 00:15:50.17え? シェルスクリプトの話でしょ?
>>964
> 動的言語の代表格であるシェルスクリプトさんには
ほら。
0974デフォルトの名無しさん
2013/03/03(日) 00:23:36.69シェルスクリプトは動的言語だけど
殆どは動的型付じゃないんじゃない
HyperShellだっけ?あれは動的型付言語兼動的型付言語かも知れないけど
でも君が聞きたかったのは動的型付言語じゃなく動的言語だよね
0975デフォルトの名無しさん
2013/03/03(日) 00:29:50.73っていうか、静的型付け言語も
ほとんど、動的言語じゃないか?
0976デフォルトの名無しさん
2013/03/03(日) 00:31:47.65http://en.wikipedia.org/wiki/Dynamic_programming_language
ActionScript
BASIC
BeanShell[3]
Clojure
ColdFusion
Common Lisp and most other Lisps
Dylan
Groovy[4]
E programming language
Fancy
Java programming language
JavaScript
Julia
Lua
MATLAB / Octave
Objective-C
Perl
PHP
Powershell
Python
R
Ruby
Smalltalk
Tcl
VBScript
0977デフォルトの名無しさん
2013/03/03(日) 00:48:10.69半年後にはまるごと消えるかもしれんぞ
0978デフォルトの名無しさん
2013/03/03(日) 00:49:49.56直すまでもないという話だから
この状態になってる。
現状を受け入れよう。
受け入れられないのなら
自分で変えよう。
0979デフォルトの名無しさん
2013/03/03(日) 09:30:29.12DIはJavaで流行ってる用語だから
Javaで出来ないことはDIに含まれない感じになっちゃってるんだよ
「ほげ言語のパラドックス」ってやつだね
http://practical-scheme.net/trans/beating-the-averages-j.html
> 帰納的に、全てのプログラミング言語の力の違いを見分けることが出来るのは、
> 最もパワフルな言語を理解するプログラマのみであるということになる
> (これが、エリックがLispは良いプログラマを作ると言った真意だろうと思う)。
> この「ほげ」のパラドックスのために、他の人の意見は参考にならない。
> 誰であれ、プログラムについて考える時には 自分が使うことになった言語に思考が支配されているから、
> その言語に満足してしまうんだ。
0980デフォルトの名無しさん
2013/03/03(日) 13:22:31.12その言語が仮想classを搭載してないからだそうだ。仮想classを搭載してれば依存性の
注入なんて普通の事過ぎて名前が与えられる事もないと。
0981デフォルトの名無しさん
2013/03/03(日) 14:01:20.72何が出来るかという観点で戦ったら勝負になるわけない
0982デフォルトの名無しさん
2013/03/03(日) 15:37:52.750983デフォルトの名無しさん
2013/03/03(日) 15:40:33.66出来る事が全然違うんだから
0984デフォルトの名無しさん
2013/03/03(日) 15:59:45.86これを見てもDIコンテナの現状や歴史的経緯がわかっていないと思われる。
0985デフォルトの名無しさん
2013/03/03(日) 16:50:51.66単にオブジェクト生成の仮想化で
リソースやその他の依存性も一緒に片付くから
仮想クラスとかの話してりゃ十分なわけで
0986デフォルトの名無しさん
2013/03/03(日) 17:16:37.69引数やセッターといったインターフェイスをわざわざ宣言して注入するのか、理由を理解して
ないでしょ。これ動的静的とか仮想クラスとかとは全く無関係な明確な理由があるから。
書かれた例も歴史的にアンチパターンとして既に否定されたものから一歩も出ていないんだよね。
0987デフォルトの名無しさん
2013/03/03(日) 17:20:24.49こんなケースの場合は依存性があってどういう問題があるとか
端から見て何を訴えたいのか分からん
0988デフォルトの名無しさん
2013/03/03(日) 17:32:54.19チュートリアルでも読んでからにしたら?
Factoryの類の内部呼び出しがダメな理由も知らずにDIについて語ってきたわけ?
0989デフォルトの名無しさん
2013/03/03(日) 17:44:49.66クラス(モジュール)があったら便利だよね。
依存してる部分を利用者が後で自由に変更できて
バグ付きのコンポーネントとか存在すると解ってて
野放しにする必要がなくなる。
あと、ファクトリーを使ったときだと、
既に組み上がってるクラスを作り直すのが難しい
処理の切り替えや新しいクラスを作るときにしか
活躍できず、深い所にあるオブジェクトは手をつけ辛い
それじゃ、そういう問題の解決策の一派を総称してDIとよびましょう。
これだけの話じゃないのか?
だから仮想クラスが存在するなら意識する必要がないと言われるんだろ
0990デフォルトの名無しさん
2013/03/03(日) 17:46:31.18君らの言ってるFactoryはこのスレに出てきたどのFactoryを言ってんだ?
0991デフォルトの名無しさん
2013/03/03(日) 17:52:20.52> DIはJavaで流行ってる用語だから
> Javaで出来ないことはDIに含まれない感じになっちゃってるんだよ
それ単にJavaよりか遅れてるってだけだよw
ウェブフレームワークなんかも
Javaの世界ではとっくにあったのに、
比較的最近取り入れられた。
PHPの世界で最近やっとDIが話題になり始めてるらしいよ。
0992デフォルトの名無しさん
2013/03/03(日) 17:52:25.24Javaが出来ない奴は居ないからな
単にJava厨がFactoryという文字を見つけて
さわいどるだけかもしれん
0993デフォルトの名無しさん
2013/03/03(日) 17:53:16.83やっぱ他の言語は知らないんだな
0994デフォルトの名無しさん
2013/03/03(日) 17:56:35.290995デフォルトの名無しさん
2013/03/03(日) 18:02:26.30JavaScriptも知ってる?
というかウェブ使うなら
絶対JavaScript知ってるはずなんだが?
Javaしか知らないってどこから出た妄想だよw
0996デフォルトの名無しさん
2013/03/03(日) 18:03:11.48ざっと見てみたけれども大文字小文字に関わらず「出来るよ」サンプルにかかれている
factoryは全部ダメだね。ファクトリの内部呼び出しを排除してDIに至った理由が全く
理解されていない。
0997デフォルトの名無しさん
2013/03/03(日) 18:04:24.510998デフォルトの名無しさん
2013/03/03(日) 18:05:21.31何が気になるんだい?具体的にどう困るのか言ってみそ。
言えないなら脳内理論に浸ってるだけだぞ。
0999デフォルトの名無しさん
2013/03/03(日) 18:06:44.651000デフォルトの名無しさん
2013/03/03(日) 18:06:59.20長々とオレオレDI定義をご披露する前にちゃんと下調べしたら?
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。