- 動的言語で大規模開発
551 :デフォルトの名無しさん[sage]:2014/11/30(日) 17:10:09.29 ID:7WEYW95R - >>546
そうなんだよね。結局問題を先送りしてるだけ。 だいたいさ、コードの中でこの変数(httpとか)は connectを呼び出しているって書いているから この変数はconnectを持っている型だって決まってるわけだよね。 動的型付けであっても、型は決まってる。 だからそのことをコードに書いておけばいいわけよ。 それが変数の型宣言というもの。 型宣言しておけば、コードとその型に矛盾が起きるような修正が 発生した時、それをすぐにコンピュータが検出できる。 検出した問題を人間がみた時にも、すぐにその原因がわかりやすい。 どうせコードでは型は特定の型じゃないと動かないんだから その型であるって明示しておけばもっと便利になる。 動的型付けでは不可能なレベルの完璧な補完っていうのも その高度なコード解析能力の一端にすぎないんだよ。
|
- 動的言語で大規模開発
554 :デフォルトの名無しさん[sage]:2014/11/30(日) 17:37:33.47 ID:7WEYW95R - >>552
動的と動的型付きは違うからね。 そもそもコードが「静的に型付きされているのと同様」に 特定の型じゃないと動かないように書かれているわけで。
|
- 動的言語で大規模開発
555 :デフォルトの名無しさん[sage]:2014/11/30(日) 17:40:58.65 ID:7WEYW95R - >>552
その頃言われていた「遅延結合」っていうのは、 遅延ではない結合、つまり特定の型以外には結合しないという意味で それを解決したのが、継承やインターフェースでしょう。 継承やインターフェースは、指定した型+その型を継承したもの (もしくはインターフェースを持っているもの)に 動的に結合しているわけで、遅延結合になっている。
|
- 動的言語で大規模開発
557 :デフォルトの名無しさん[sage]:2014/11/30(日) 17:47:36.29 ID:7WEYW95R - >>556
コンパイルエラーをミスと考えるかバグと考えるかで話が違う。 テストはバグを見つけるもの。 だから普通はコンパイルエラーによるミスは テストで見つけるものではない。 だから本当の意味でのテストの量は同じだが、問題はミス。 静的型付け言語ならミスは、ミスとしてテストの前段階で弾くことができるが、 動的型付け言語だと、テストの段階で弾くことになる。 (しかも静的型付け言語ならミスは修正箇所をコンピュータが示すから素早く解決できるが、 動的型付け言語だとバグを探すのと同じ作業をしないといけなくなる) そういう点で、動的型付け言語ではテストでやるべきことが 増えるのでテスト工数が増えることになる。
|
- 動的言語で大規模開発
559 :デフォルトの名無しさん[sage]:2014/11/30(日) 18:24:06.55 ID:7WEYW95R - >>558
それを言うなら、契約って言ったほうがかっこいいな。 契約プログラミングといえば、EiffelとD言語ぐらいだけど、 型っていうのもある意味契約だからね。 この引数は、○型であるという事前条件 この関数は、○型を返すという事後条件
|
- 動的言語で大規模開発
563 :デフォルトの名無しさん[sage]:2014/11/30(日) 18:31:27.03 ID:7WEYW95R - >>561
> ここの人たちにとってC++のテンプレートを引数に取る関数ってどういうふうに捉えられてるの? ┃ template<typename T>┃ void f(T func) ↑ ここからここまでが、型 ↑ HOGE_T void f(T func) 置き換えるならこんなふうに捉えてる。 > みたいないわゆるダックタイピング それをダックタイピングとは言わない。
|
- 動的言語で大規模開発
566 :デフォルトの名無しさん[sage]:2014/11/30(日) 19:22:49.09 ID:7WEYW95R - > bar() を呼び出せるなら何でも foo の引数に入れられるのが
それってさfoo関数の引数 aはbarメソッドを 持った型ではなければならないってことだよね? コードに書くならば function foo(/* fooメソッドを持った型 */ a) { a.bar() }
|
- 動的言語で大規模開発
567 :デフォルトの名無しさん[sage]:2014/11/30(日) 19:26:23.25 ID:7WEYW95R - 間違えたw
function foo(/* barメソッドを持った型 */ a) { a.bar() } そして、大概は一つのメソッドだけ使うことはないから、 function foo(/* barとbazメソッドを持った型 */ a) { a.bar() a.baz() } あぁ!もう面倒くさい。 // Hogeインターフェース = barとbazメソッドを持っていること function foo(Hoge a) { a.bar() a.baz() } わかりやすい。Hogeってみるだけで barとbazを持っていることがわかるし もし持っていないものをaに入れるコードを書いたらコンパイルエラーが出る
|
- 動的言語で大規模開発
569 :デフォルトの名無しさん[sage]:2014/11/30(日) 19:47:43.07 ID:7WEYW95R - http.connectを呼び出す関数に、
db.connectというメソッドを持ったオブジェクトを 入れても期待通りに動くことはまず無い。 二つの無関係なオブジェクトが同名のメソッドを持っていて 呼び出せるからといって、それはバグにしかならない。 メソッドに名前空間がないような形で使う動的型付け言語では このような問題が起きる。 静的型付け言語ではインターフェースという型を定義することで、 同名であっても本質的に違うものは、違うものとして扱うことが出来る
|
- Git 11©2ch.net
72 :デフォルトの名無しさん[sage]:2014/11/30(日) 19:53:21.13 ID:7WEYW95R - >>71
だと思った。 お前が単語しか知らないことが確定した。 はい、次の話どうぞ
|
- 動的言語で大規模開発
571 :デフォルトの名無しさん[sage]:2014/11/30(日) 19:56:23.78 ID:7WEYW95R - インターフェースがduck typingなどとは
ひとことも言ってない。 duck typingは不要。ガアガアと鳴いたからたから といって人間はアヒルでしか無い。 アヒルだ、空を飛べ。人間は飛べません。はいバグです。 実際には鳴くメソッドがあればアヒルである ということになって更に意味がわからない。 もちろん、アヒルである条件をインターフェースとして定義しているならば そのインターフェースを備えているものは、アヒルでいいですがね。 メソッド一つが有るか無いかきめんなよ。
|
- 動的言語で大規模開発
572 :デフォルトの名無しさん[sage]:2014/11/30(日) 19:57:27.20 ID:7WEYW95R - 訂正
duck typingは不要。ガアガアと鳴いたからたから といって人間はアヒルにはならない
|
- 動的言語で大規模開発
574 :デフォルトの名無しさん[sage]:2014/11/30(日) 20:01:50.38 ID:7WEYW95R - したことある人が、リンクを見つけてきて
ここに書けばいいと思いますが、 それを要求することは酷なことですね。 だってググっても見つからないのだから。
|
- 動的言語で大規模開発
575 :デフォルトの名無しさん[sage]:2014/11/30(日) 20:04:43.51 ID:7WEYW95R - ダックタイピングの説明として
「アヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである」 という言葉があるが、 それを、 アヒルのように歩くとアヒルのように鳴くという アヒルインターフェースを実装しているものはアヒルである。 というふうに読み替えると これは実は静的型付け言語の説明だなとわかるはずである。
|
- 動的言語で大規模開発
578 :デフォルトの名無しさん[sage]:2014/11/30(日) 20:15:01.73 ID:7WEYW95R - >>576
両方が同じデータベースインターフェースを サポートしているならばそうだろうね。 現実的な話をするならば、mysql.connect を 使うコードは、実際にはmysql.connect だけを 使うことはなく、複数のメソッドを使う。 だから、その複数のメソッドというものを 定義しないといけない。 そしてその定義したものがインターフェースであり そのインターフェースを使いますよと宣言するのが 型宣言なのである。 そうすればある型がデータベースインターフェースを 定義していることを保証する型宣言だけあれば、 全てのメソッドを安心して使うことが出来る。 このオブジェクトはconnectメソッドは持ってるけど、 disconnectメソッドを持っていないかもしれない なんてことはなくなるのである。
|
- 動的言語で大規模開発
580 :デフォルトの名無しさん[sage]:2014/11/30(日) 20:21:32.59 ID:7WEYW95R - 足し算をaddメソッドだとして、
addメソッドさえあればなんでも使えるかというと (addメソッドでググって一番目にでてきた) > Addメソッドとはエクセルのシートに表とグラフを同時に表示するメソッドです。 に対してもうまく動くことはおそらくないだろう。 つまり名前が一緒でも、正しく動くとは限らんのさ。 だから名前と意味が一緒であることを保証するために 名前をつけたものが型なのである。
|
- 動的言語で大規模開発
584 :デフォルトの名無しさん[sage]:2014/11/30(日) 20:26:04.76 ID:7WEYW95R - アヒルのインスタンスを実行時にその振る舞いから分類というけれど、
コード自体は、実行時に分類してないんだよ。 コードは、アヒルであること、を前提として書いてる。 実行前にコードで分類しているのに、 なぜ実行時に分類しないといけないのか。 型は動的に変わるが、コードは静的なのである。
|
- 動的言語で大規模開発
585 :デフォルトの名無しさん[sage]:2014/11/30(日) 20:28:54.03 ID:7WEYW95R - >>583
> だから同じ「意味」に対して名前を揃えるのが動的言語でのメソッド名のつけ方だ だから大規模では無理なんだよ。 大規模=大多数の人間が係る。場合によっては全く知らない人が作った ライブラリを使うこともあるしな。 そんなんで、すべて意味を揃えるなんてことは不可能 いくつもの意味を持つ英単語なんてざらにある 単語の意味を揃えるのは不可能。というのが大前提
|