- 1 名前:デフォルトの名無しさん mailto:sage [2016/10/01(土) 23:40:48.89 ID:FvOeAcfn.net]
- 前スレ
【JavaScript】スクリプト バトルロワイヤル54【php,py,pl,rb】 echo.2ch.net/test/read.cgi/tech/1458955459/
- 499 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 09:52:33.87 ID:SqhlDt4o.net]
- ダックタイピングはそれをプログラマが活用するのではなく
動的言語における多態性の(安易な)実装手法にすぎない
- 500 名前:デフォルトの名無しさん [2017/04/16(日) 10:22:58.46 ID:XyqfpBE9.net]
- という完全に誤った理解が蔓延しているというお話し
- 501 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 10:23:01.86 ID:AmA5ei6y.net]
- >>495のURL先は皆読んでくれたかわからんが
掛け違えたボタン感が本当にすごくて 最初の一歩を間違えるとこんなにも面倒なんことになるのかって感じ 北朝鮮はどこまで進化しても北朝鮮ってことなんだろうよ うすら寒い理想の未来を語るところもよく似ている 過去に生きて、未来を語って、現在に生きてないって感じ まさに掛け違えたボタンで、「現実」のボタンをスキップして飛ばしている 胡散臭い宗教とかもそんな感じだよね たぶん「現実」に不満がある人を集めるのが目的だから 過去の技術を使って、未来を語ってみせて、騙くらかすって事なんだろうな これがまさしく、走り続けないと終わる、の意味だろう でももう流石に誰も騙されないよね 麻疹みたいなものだから、学生さんは一度はそういう目に合うかもだが
- 502 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 10:25:51.21 ID:AmA5ei6y.net]
- もしくは、ボタンを掛け違えていることに本人だけが気付いていなくて
誰も追いついてこないな〜なんて思っていたら 実はみんなもっと遠いところで高度なことをやっていた、ってパターンか 誰も追いついてこないんじゃなくて、フォロワーが居ないってことなんだけどね
- 503 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 11:27:58.86 ID:cCOM2/u0.net]
- ダックタイピングというのは、(人間が)ガーガーと
アヒルのモノマネをすれば、アヒルとみなして扱おう という発想から生まれたもの
- 504 名前:デフォルトの名無しさん [2017/04/16(日) 15:33:13.73 ID:aIkdKg/w.net]
- >>501
ダックタイピングのことを何も分かってない人間がいくら言おうと説得力はゼロだよ
- 505 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 16:41:45.39 ID:AmA5ei6y.net]
- 残念ながら>>499が正解なんだな〜
俺も、もし何かの都合で自分で言語を作る必要性に駆られたら そうするだろうね、実装が圧倒的に楽だから つまり、自分で言語を作って、自分で使うんなら 現代においてもなお、動的型はありうるんだよ、これが 言語を作る手間と時間もコストとして換算して トータルで労力を最小にしたいから どこでバランスするかの問題 もしくは自分はもっぱら言語を作るのがメインで、使うのは他のやつって場合も 自分だけが楽できれば良いという身勝手な発想に行き着いたのなら、ありえる 自分は静的型言語でその恩恵を十分に得ながら言語開発して 他人は自分の作った言語で苦しむっていう 人として最悪な感じにはなるけど、まぁ最終的には良心の問題 金もうけのためだったり仕事って事なら仕方ないけど 人生の目標にしたら只の嫌がらせだな それはそれとして、既存の言語を使うだけなら わざわざ手抜きな言語をあえて選択する意味はないよ
- 506 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 16:43:12.44 ID:aIkdKg/w.net]
- >>505
ダックタイピングをジェネリクスで代替できると思ってる人間の論理に説得力はない
- 507 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 16:45:25.04 ID:cCOM2/u0.net]
- ダックタイピングはジェネリクスではなく
インターフェースで代替するもの
- 508 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 16:49:53.76 ID:aIkdKg/w.net]
- >>507
その通りだね そしてインタフェースをいちいち付けてまわるのは非常に面倒臭いこと 自分で作るクラスならまだ何とかなるが、使ってるライブラリのクラスだとそうもいかない
- 509 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 16:54:54.02 ID:cCOM2/u0.net]
- > そしてインタフェースをいちいち付けてまわるのは非常に面倒臭いこと
めんどくさい? ダックタイピングではインターフェースがないから 代わりにコメントで同じ情報を書かないといけないじゃん。 インターフェースの情報(コメント含む)を書かないで それが仕様かどうか分かってもらえると思ってんの?
- 510 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:00:32.58 ID:aIkdKg/w.net]
- >>509
コメントなら書くか書かないかは開発者が選べる それを「低レベルコード生産要素」と見るか「プログラマの自由を保証」と見るかは ポジションによる Matzなんかは後者の立場なんだろうし、日本のSIのような人月計算でレベルはおかまいなしのような プロジェクトに関わってるような人から見れば前者になるんだろうね
- 511 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:01:19.16 ID:AmA5ei6y.net]
- 「静的な」ダックタイピングはジェネリックとオーバーロードで実現可能
という風に書いたのにこれが理解できないのではどうしようもない きっと静的と動的の違いも理解できてないんだろう 静的なダックタイピングはタイプセーフだし 本当にうまい落としどころだなぁって思う 何もかもが静的型に都合がよいように回ってて、ちょっと怖いね とはいっても俺も何でもかんでも型で解決しようってのはあまり好きじゃなくて 一つのアイデアが上手くいくと一気に乗っかっていく感じは何か過剰というか ただ、そうはいってもダメなものがダメなことには変わりないんだけどね
- 512 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:01:47.01 ID:cCOM2/u0.net]
- >>510
> コメントなら書くか書かないかは開発者が選べる 言い換えると、 コメント書きたくない、仕様書を書きたくない。 コード読まないとわからない。 というコードを書きたいってことか? ひどいな。だから可読性が下がるんだよ。
- 513 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:03:04.51 ID:aIkdKg/w.net]
- >>511
ぜんぜん違う ほんとダックタイピング分かってないんだな ID:cCOM2/u0 なんかはその辺分かってるから議論になるけど、お前にゃ無理だよ
- 514 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:07:46.06 ID:aIkdKg/w.net]
- >>512
Matz の有名な言葉に「ソースがドキュメントだ.バグも完全に記述されている」ってのがあるからねぇ 冗談半分だとしても、思想としてそういう方向なんだろう 本気半分の言い分としては、ソース読んだだけでちんぷんかんぷんなコードはその時点で怪しいと思え って感じだろうか
- 515 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:08:31.24 ID:cCOM2/u0.net]
- インターフェースは契約プログラミングの一種でもあるんだよ。
インターフェースを定義することは事前条件を定義することにあたる。 事前条件を記述することで、予め(プログラムを実行しなくても)バグがあることがわかる。 実行パスは無限と言ってもいいほどあるから、実行しなければ わからない問題を検出するのは時間がかかる。 だけど、条件を満たすかどうかを調べるために、 実行そのものが必要なければ、短時間で問題が検出できる。 コンピュータが理解できる方法で、しかも実行せずにわかることと コメントという人間しか読めない方法で書くのとでは全然意味が違う
- 516 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:09:43.45 ID:AmA5ei6y.net]
- 静的型において動的な多態にインターフェースを使うのは当たり前
動的なことは危険な香りがするから、インターフェースで制約する これも丁度よいぐらいの落としどころなんだよ 静的な多態はジェネリックとオーバーロードでダックタイピングも可 動的な多態はインターフェースを通して安全に どちらの場合もタイプセーフ よくできているよね〜
- 517 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:10:37.85 ID:aIkdKg/w.net]
- >>515
そういう方向でバグを減らすというのもひとつの方向性としてはいいんじゃない? 単なる思想の違いというだけで、そういうのが嫌いな人が作った言語だって別に悪いわけじゃない
- 518 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:12:57.07 ID:aIkdKg/w.net]
- >>516
だからお前はダックタイピング分かってないんだからもういいよ staticおじさんのように、分かってない機能は全部けなす方向性の人間と議論になんかならんからな まずお前にすすめるのはリーベルGの「高慢と偏見」を読めってことだ
- 519 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:13:47.39 ID:cCOM2/u0.net]
- >>517
> そういう方向でバグを減らすというのも そういう方向で"も" な バグを減らすテクニックはいくつもある。 静的言語なら、そのテクニックが増えるわけだ 動的言語でできるバグを減らすテクニックは、静的言語でも使える。 さらにプラスして、静的言語ではコンパイル時に実行することなく バグを減らすことが可能になる。 これは明らかにバグを減らすために追加された機能といえるだろう
- 520 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:15:16.10 ID:aIkdKg/w.net]
- >>519
そのために生産性やプログラマの自由が減るというトレードオフがあるけどね そのトレードオフのどっちを取るかはポジションで決めればいいだけの話
- 521 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:16:58.16 ID:AmA5ei6y.net]
- ちなみにダックタイピングは、ダックのように振舞うものは、ダックとして扱える
って言ってるだけで 静的に解決するか、動的に解決するかは、別の問題であり 当然静的なダックタイピングは、ある >ダック・タイピング >https://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0 >C++のtemplateはダック・タイピングの静的版である 残念だったなwww それともWikiを書き直すか?
- 522 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:18:10.05 ID:aIkdKg/w.net]
- >>521
俺はテンプレートに関しては何も言ってないが? ジェネリクスはちゃうやろって言ってるんだが
- 523 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:20:02.41 ID:cCOM2/u0.net]
- >>520
> そのために生産性やプログラマの自由が減るというトレードオフがあるけどね 減ってないよ。逆に高くなっている。 っていうか、あんた書くときのことしか考えてないでしょ?w プログラミングっていうのは書くよりも読むことのほうが遥かに多い。 だから、可 "読" 性 が重視される。 読みやすいコードは生産性を大きく上げる
- 524 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:27:15.74 ID:0ImhO/qF.net]
- >>521
× C++のtemplateはダック・タイピングの静的版である ○ C++における型消去はダック・タイピングの静的版である 明らかに間違ってるから直しとけよ
- 525 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 17:29:05.78 ID:aIkdKg/w.net]
- >>523
それは違うな コメントなら引数を「与えられる方」だけ書けばいいが、インタフェースは引数を「与える方」にもそれを強制する そしてこれは結構面倒な作業だ もちろん、引数として変なものを与えてしまう可能性も出てしまうが、それと上記の面倒さをどっちを取るかは それぞれの人が決めればいい
- 526 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:04:26.80 ID:AmA5ei6y.net]
- 現代に生き残りし貴重なサンプルだとは思うが
「何が面倒か」までは書かないんだよな 結局、何でもかんでも渡すわけにはいかないのは同じこと どのみち仕様を満たさなきゃならん ダックならダックの仕様を満たさなきゃならん ダックの仕様を満たすように書かなきゃならないのと ダックのインターフェースを満たすように書かなきゃならないことは 実質問題大差ない 大差ないか、むしろインターフェスがあった方が何をすべきかよくわかるぐらいだ 仮にこのケースでほんの少しだけ動的型が便利だったと仮定しても 静的型の、型安全性、リファクタリングのしやすさ、タイポなどの些細なミスの検出 型が書いてあることによるドキュメンテーション、最適化のききやすさ あと宣言があることによるスコープの細かさ これらすべてを投げ捨てるほどの差はない 動的型のメリットといえばもはや動的なメタプログラミング的な何かぐらいしかないが そんな黒魔術はどうでもよいし、はっきり言ってgoto文と変わらない
- 527 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:10:54.82 ID:AmA5ei6y.net]
- こういうと彼はきっとこう思う
静的型は互いに別々の出どころのライブラリ間で インターフェースに互換性がないから困る、と しかし、そんなことは動的型でも同じこと
- 528 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:14:22.59 ID:cCOM2/u0.net]
- >>525
クラスだけ与えられて、 さてこのクラスはどこで使えるでしょう? みたいなクイズして楽しいか? このクラスが持っているインターフェースは何かって ちゃんと書いていれば、そのインターフェースを使える場所も 明確にわかるだろ
- 529 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:15:43.11 ID:cCOM2/u0.net]
- >>526
> 「何が面倒か」までは書かないんだよな それだよなw ほんと何が面倒なのか。
- 530 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:20:36.92 ID:aIkdKg/w.net]
- >>528
アプリケーションの全クラスが自分の管理下にあればそれも可能かもしれんな でも実際は様々なライブラリを使うことは避けられないし、各ライブラリのクラスに後から自分が欲しい インタフェースを追加することはできないことがほとんど C#やScalaなんかはそういうこともできるみたいだが、今度は可読性が落ちるのでここぞというときの 秘密兵器扱いだな
- 531 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:26:41.26 ID:cCOM2/u0.net]
- >>530
各ライブラリのクラスに後から自分が欲しいインターフェースを追加して、 正しく動く保証はあるのですか? そもそもそんなことする必要ありませんよね?
- 532 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:29:04.31 ID:cCOM2/u0.net]
- 手段が目的になってしまってるんだよなw
何がしたいのかは言わない。 ライブラリのクラスに後からインターフェースを追加することが 目的なんだって臆面もなく言ってしまうw
- 533 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:34:11.12 ID:aIkdKg/w.net]
- >>531
あるよ たとえばあるライブラリがAというクラスのオブジェクトを返したとする これを別のライブラリか自分で作ったクラスのの引数として使いたいけど、その引数はBという インタフェースを要求する Aというクラスは字面の上ではBというインタフェースを満たしているのだが、Bというインタフェースを implement しているわけではない さてどうしよう Bというインタフェースを持つクラスを自分で定義してコピーする?こんな余計なことしなきゃいけない のは生産性の低下以外の何物でもないわな これは一例であって他にも同様の例はいくらでもある
- 534 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:43:08.06 ID:cCOM2/u0.net]
- >>533
なんでAというクラスが、Aとは全く関係のなく作られたBというインターフェースを たまたま運良く満たすなんて自体が起きるんだよw ありえないだろ。 それよりか引数が違うのに、同じ名前のメソッドを定義してしまっていた どうしようって思うほうが可能性高いわw
- 535 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:46:33.36 ID:cCOM2/u0.net]
- Aというクラスは字面の上ではBというインタフェースを満たしているのだが、
Bのバージョンアップでインタフェースが変わってしまった。 だけど、Aというクラスがたまたま古いBのインターフェースと 一致していたという前提をどこにも書いていなかったので、 動かなくなる原因の判明に時間がかかった。 そのためにコメントをしっかり書くようにした。 A は B interface を implements しているよと
- 536 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:50:50.79 ID:aIkdKg/w.net]
- >>534
ありえるんだよ、これが しかもしょっちゅう (俺は静的型言語でも開発してるからよく出くわすよ) たとえば、Serializable なんか典型じゃないかな そのまま Serialize したいのになんで Serializable インタフェース持ってねぇんだよ! みたいなのはほんといくらでもあるよ
- 537 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:53:05.94 ID:cCOM2/u0.net]
- このようにダックタイピングを使うとその場しのぎで直ぐに対応できるように思えるけど
長い目で見れば、可読性の低下を招き、メンテナンス性、生産性を下げることになってしまう。 書いたら終わり、メンテナンスが不要な書捨てのプログラムぐらいにしか 使わない方がいい。 そして、書捨てのプログラムをよく書くのはインフラ系が多い。 インフラ系で必要とされるのはオブジェクト指向も必要ない 数行程度のスクリプト。シェルスクリプトよりは書きやすいぐらいの 理由しか持ち合わせてない アプリの開発には長期間メンテナンスされるので可読性が重要
- 538 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 18:56:36.72 ID:cCOM2/u0.net]
- >>536
> そのまま Serialize したいのになんで Serializable インタフェース持ってねぇんだよ! そのクラスがSerializeする機能を実装してないからだろ?
- 539 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 19:04:01.20 ID:cCOM2/u0.net]
- rubytips86.hatenablog.com/entry/2014/03/19/184940
Rubyでこのシリアライズとデシリアライズを担うライブラリがMarshalモジュールだ。 注意点としてMarshal.dumpでは、無名のクラス・モジュールのオブジェクト、 システムがオブジェクトの状態を保持するIOなど、 Procなどいくつかのインスタンス、特異メソッドを定義したオブジェクトはシリアライズできない。
- 540 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 22:32:15.20 ID:AmA5ei6y.net]
- 第一だよ
全然関係ないライブラリ同士でたまたま字面の上で メソッド名が一致しているクラスがあるっていう 偶然の一致があったとしても その動作振る舞いまでもが完全に一致していて 動作的にコンパチブルかどうかは分からないよ 想定してないんだからさ おおよそ慣例というか習慣というか、その言語ではふつうそうするって 何らかの決まり事みたいなものがあるのなら問題ないかもしれないが そういう場合は言語側やファウンダメンタリーなライブラリが インターフェースを定義してくれているから、それ使えばよいわけで やっぱり関係ないんだよ そういうメソッド名と振る舞いの両方が偶然にも一致 っていう奇跡偶然に頼るってのが まさにおまえ自身が>>530で言ってる >アプリケーションの全クラスが自分の管理下にあればそれも可能かもしれんな そのものなんだよ、まったくのブーメラン
- 541 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 22:54:49.91 ID:aIkdKg/w.net]
- >>540
ダックタイピングのことを知らないお前が言っても説得力はないよ
- 542 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 23:27:02.64 ID:f4lMQoiy.net]
- 言い争いの起点がどこにあるのかわからん
- 543 名前:デフォルトの名無しさん mailto:sage [2017/04/16(日) 23:30:25.86 ID:aIkdKg/w.net]
- >>542
>>496 >>498
- 544 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 00:16:09.41 ID:W0pN1+cl.net]
- 要するに、後付で色々したい場合はダックタイピングの方が楽なんだよ。
ただし、全てを見通せるのなら最初からインタフェースにしておいた方が美しいのも事実。 現実的にはJavaScriptはUI用で酷く書き換えを強いられる為、 ダックタイピングの方が向いている。(と俺は感じている) 逆に、仕様がかっちり決まっている場合は型ありでも特に苦労しないし、 数値計算等のバグ出ししにくい状況では型があった方が安心ではある。 (期待値が作りにくい、見た目でバグと分からない) ただ、UIならバグは見て分かるし、ダックタイピングでも問題ない。 動的言語はパターンを当てないとバグ検出出来ないけど、 UIなら「変更が依頼された」=「パターン持ってる」ってことだし。
- 545 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 01:28:08.77 ID:8mjeDRwA.net]
- 真面目にダックタイピングをやろうとする行為は、型やインタフェースを定義するのと違いがない
だからrubyでダックタイピングを考えてプログラミングしてる人なんているわけない
- 546 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 03:12:15.72 ID:LB/3uUQe.net]
- >>544
あの、精神論でごまかさないでください? 何一つ、ダックタイピングのほうが良いという理由を 言っていませんよ
- 547 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 07:17:22.30 ID:W0pN1+cl.net]
- >>546
良い悪いを議論する事じゃないよ。 結局は、どう思うか、どう感じるか、でしかないから。 型には型の得失があるし、ダックタイピングにしてもそう。 選べる状況なら好きな方選べばいいし、無理ならグダグダ言っても意味無いだろ。 利点を感じないのなら、これまでそういう状況に遭遇したことがないか、 或いはそもそもそっち派ではないか。 いずれにしても使わないってことで問題はない。 利点説明おねだり君なんてウザイだけだから止めろ。 yohshiy.blog.fc2.com/blog-entry-244.html 未確認飛行の人も同じようなことを言っていたと思ったけど見つからなかったから上記で。 結論出したいのならこの辺だと思うよ。 >>545 ガチでダックタイピングの利点を享受しようとすると、 型に留まらず世界が統一されていないといけないので、実は型よりも難しい。 そしてJavaScriptもそれに対応出来ていない。理由は標準化している奴らが馬鹿だから。 sizeとlengthが混在してるでしょ。 あれ、どっちでもいいけどどっちかに統一されてないといけない。 だから真面目にダックタイピングをやっている奴なんていない、というのは俺も思う。
- 548 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 09:32:26.96 ID:LB/3uUQe.net]
- > そしてインタフェースをいちいち付けてまわるのは非常に面倒臭いこと
めんどくさい? ダックタイピングではインターフェースがないから 代わりにコメントで同じ情報を書かないといけないじゃん。 インターフェースの情報(コメント含む)を書かないで それが仕様かどうか分かってもらえると思ってんの?
- 549 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 09:43:33.93 ID:oCHN+Sd+.net]
- >>540
同じインターフェースを実装してても、それは引数と戻り値の型が一致するだけで 動作振る舞いがコンパチブルかどうかは保証してくれないけどな JavaやC#みたいなショボい言語では
- 550 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 21:03:29.03 ID:LB/3uUQe.net]
- >>549
interfaceは"インターフェースを"保証してくれるもので インターフェース以外は別の話なのは当たり前だと思うが? 「お前型を保証してくれるんだろ? バグがないことまで保証してくれよ」 っていうのと同じぐらい無茶なこと 普通保証の対象しか、保証しませんってw
- 551 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 22:17:56.90 ID:BH39VCMj.net]
- >>549
ショボくない言語ではどういう感じになるのでしょうか? 純粋な興味として知りたいです
- 552 名前:デフォルトの名無しさん mailto:sage [2017/04/17(月) 23:27:50.92 ID:LB/3uUQe.net]
- しょぼくない言語なら、
動作振る舞いがコンパチブルかどうかを保証してくれるんだろう?
- 553 名前:デフォルトの名無しさん [2017/04/18(火) 00:29:01.98 ID:n/IUHgwq.net]
- >>544
> 要するに、後付で色々したい場合はダックタイピングの方が楽なんだよ。 メソッドや関数のオーバーロードが可能なら静的型でも変わらなくない?
- 554 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 01:27:12.80 ID:xAHUlHha.net]
- >>553
いや、それだと全部用意しないといけなくなるでしょ。 ダックタイピングだと必要なところだけ用意すればいいし、つまみ食いも出来る。その分楽。 丁度C++のスレが同じ事を言っているけど、 echo.2ch.net/test/read.cgi/tech/1490917669/137- そりゃ全てのオブジェクトが isScrollable や isSerealizable を持っているのが美しいだろうさ。 しかしそれは通常は余計に手間が増えるだろ。 インタフェースが肥大化するか、基底クラスが肥大化するかで。 だったらJavaScriptみたいに、 var obj_serialized = (obj.serialize)? obj.serialize() : null; とか、 SomeObj.prototype.serialize = function(){}; とか、出来たら融通は利くでしょ。少なくとも「今」やりたいことは出来るようになる。 それが後々逆に足を引っ張ることになるかどうかは腕次第でしょ。 ただし、どっちが楽かという話であって、 出来るか出来ないかで言えば、同じだよ。同じ事を逆からアプローチしてるだけだから。 JavaScriptについて言えば、 初期状態は全ての名前のメソッドを定義してあるが、実装してない状態だと言える。 だから未実装ならundefinedが返ってくるし、実装済みなら使える。 C++とかだと、初期状態は全く定義がなくて、自分で全て追加しないといけない。 でも全てのダックタイピングを可能にしようとしたら、 型消去するなりして全てのインタフェースに対応しないといけなくなる。 これってJavaScriptの初期状態と同じでしょ。 C++のテンプレートは空回り感が酷い。 UIなんて張り切って実装しても意外に糞だったりするので、 とりあえず実装してから確認したいってのはある。 そういう時はJavaScriptみたいな、とりあえずサクサク実装出来る言語の方が向いている。
- 555 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 02:34:37.34 ID:ibb6Zkrz.net]
- >>554
シリアライズのことしか考えてなくて、しかもシリアライズメソッドさえあれば 何でもかんでも簡単にシリアライズできるんだって思ってるみたいだけど、 まず前提として、いかなる言語も汎用的なシリアライズはなという話をしようか? これが大前提なので、あとからシリアライズメソッドつければ、 シリアライズできて便利ーにはならないんだよ。 通常シリアライズメソッドは後から追加できないものと考えるべき。 例外的に可能なものもあるけど、あとからシリアライズメソッドを追加できるならば、 obj.serialize() ではなく、Serializer.serialize(obj) とやることで目的は達成できる。 あんたがやろうとしているのは、単にシリアライズ処理を インスタンスメソッドにしたいと言っているだけ。
- 556 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 07:09:23.56 ID:16rBXoJR.net]
- >>551
OCamlあたりで構造的部分型を利用した型推論とかを知っとくといいと思うよ itpro.nikkeibp.co.jp/article/COLUMN/20061107/252787/
- 557 名前:デフォルトの名無しさん [2017/04/18(火) 07:25:53.47 ID:V4ah9bya.net]
- >>554 C++のテンプレートは空回り感が酷い。 とりあえず実装してから確認したいってのはある。
激しく同意する。 An one-liner で書けるようなものでは、型の恩恵などない。Local,global の峻別さえ無意味だ。そのようなときは duck typing で書かねば損だ。 逆に duck typing で一万行を超えてくると、強烈に型が欲しくなる。
- 558 名前:デフォルトの名無しさん [2017/04/18(火) 07:30:18.04 ID:V4ah9bya.net]
- >>554 そういう時はJavaScriptみたいな、とりあえずサクサク実装出来る言語の方が向いている。
俺は JavaScript(というより TypeScript) を使っていない。昔一舐めしただけだ。それ に本格的に手を出すべきか迷っている。意見を貰いたい。 JavaScript を押す人たちのコードを見ていると、Python のほうが三倍程度は濃密な コードで書けそうに見える。その理由は質の良いライブラリが揃っていることにある。 例えば N 重ループの iterator を Python ならば下のように書ける。JavaScript で、 こんな濃密なコードを書けるだろうか。 N=3; import itertools as md; list(md.product(*[range(3)]*N)) =============================== [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)]
- 559 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 09:47:58.51 ID:1155c42j.net]
- >>550
そんなショボいものしか保証してくれないの? まったく安心して使えないね 動的型付けと大差ないじゃん
- 560 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 09:54:21.27 ID:1155c42j.net]
- 動作を保証しないから問題だって言った(>>540)直後に
動作を保証しなくて何が悪いと返せる(>>550)って凄いねw そのチンパンジー並みの記憶力は賞賛に値するよ
- 561 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 21:12:55.65 ID:xAHUlHha.net]
- >>558
俺はPythonは知らないのでJavaScriptとの比較は出来ない。 ただPythonはクロージャに難ありなので今後も使う気はない。 改行が強制されるのも気に入らない。 JavaScriptは書いてて気持ちがいいんだよ。 理由は簡単で、全て具だから。 型等の動作には関係ない物がないから、動作に集中出来る。 なるほどMatzが目指したのはこれだったのか、というのは分かった。 だから俺が次にやるとしたらRubyだね。 今のところ、俺は型自体はは要らないという結論だ。 名前通りの型しか付けないので、見りゃ分かる。 ただ、現実として、実行前にタイプミスを見つけてくれないから困っている。 ダックタイプや動的に使う場所なんて限られているのだから、 そういう場所に対してワーニング出してくれるだけでいいんだが。 そのためのリントを探してはみたものの、 JavaScriptのリンターはそんな方向では全くなかった。 あと、C++が糞なのはクラスは全て独立で親クラスを掴めないことだ。 だから細かくクラスを階層化出来ない。というか、やると余計に手間が増える。 ここら辺はJavaでは改善されていて、明示的に掴めるし、 JavaScriptではデフォで掴んでる。(レキシカルスコープ) 粗結合を目指すのならJava方式がいいし、 お気楽を目指すのならJavaScriptの方がいい。 ところで初心者はそういう「短く書ける方がイイ」みたいなことをよく言うが、 君が本当に一万行のコードを書ける奴なら、それは意味無いと分かるだろ。 そしてそれをここで聞くのも意味無い。 だって俺の腕前なんて未知数だし、ここでは無駄に吠える初心者も多いし。 一般論としては、Pythonはキャズムを越えているっぽいから、 学んでも無駄にはならないと思うよ。
- 562 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 21:41:20.30 ID:xAHUlHha.net]
- ああすまん、質問はPythonではなくて、JavaScriptを学ぶべきか?だったか。
俺が勘違いしてた。 これは俺は正確には答えられないね。 俺は他言語使えるわけではないし。 そもそも道具なんだから、今困ってなければ学ぶ必要はないだろ。 新しいプログラミングを学びたいというのなら、 結局どの言語も似たり寄ったりの方向に進化しつつあるし、 とりあえず「進化している言語」を一つ追跡しておけば問題はないだろ。 一番速いのは多分Rubyだろうし、この点ではPythonは遅いほうだよ。 同様に、この点でJavaScriptを選択する意味はない。 逆に、今使うというのなら、グダグダ言う意味もないだろ。 Web環境ではJavaScript以外の選択肢はないんだし。
- 563 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 22:41:32.37 ID:ibb6Zkrz.net]
- >>560
> 動作を保証しないから問題だって言った(>>540)直後に > 動作を保証しなくて何が悪いと返せる(>>550)って凄いねw なんの動作? ねぇねぇ、なんの動作? わざとぼやかしてるでしょwww
- 564 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 22:42:21.03 ID:ibb6Zkrz.net]
- あとそれから>>540は俺じゃないからねw
IDすら見えない? チンパンジーになみの理解力だった?w
- 565 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 22:43:49.88 ID:ibb6Zkrz.net]
- >>561
> JavaScriptのリンターはそんな方向では全くなかった。 TypeScriptがお前が望むものだよ 型を導入したJavaScriptだ。 いまあちこちで普及してる。
- 566 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 22:45:23.23 ID:ibb6Zkrz.net]
- >>561
> ところで初心者はそういう「短く書ける方がイイ」みたいなことをよく言うが、 > 君が本当に一万行のコードを書ける奴なら、それは意味無いと分かるだろ。 え? なんで? 同じ一万行なら、短く書ける方がより多くの機能を実装できるから やっぱり短いほうが良いじゃんw
- 567 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:07:56.67 ID:wXuuRzeA.net]
- >>566
つまり型は余計だということだね インタフェースとか余計なことを書かなきゃいけないから
- 568 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:13:36.64 ID:ibb6Zkrz.net]
- >>567
それはインターフェースが余計なものであるという前提で成り立つものだ インターフェースは余計なものではなくプログラマの意図を コードというコンピュータにも理解できる言語で記述した価値がある情報だ
- 569 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:14:34.77 ID:wXuuRzeA.net]
- >>568
短く書ける方がいいんでしょ? ダブスタいくないよ
- 570 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:18:22.51 ID:ibb6Zkrz.net]
- >>569
正確に言うと「少ないステップ数」というべきだな。 インターフェースは実行されないのでステップには含まれない。 他にも型宣言とかimportとかコメントとか空行とか { だけの行とか、そういうのもステップには含まれない。
- 571 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:19:45.52 ID:wXuuRzeA.net]
- >>570
> インターフェースは実行されないのでステップには含まれない。 こんなオレオレ定義聞いたことありませんw
- 572 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:20:25.75 ID:ibb6Zkrz.net]
- >>571
デバッガの「ステップ実行」って 使ったことないの? インターフェースの前後でステップ実行することはない
- 573 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:26:21.27 ID:wXuuRzeA.net]
- >>572
ググってみたけどステップ数からインタフェースを抜くなんて計算方法はまったく出てこない オレオレじゃないなら、どこか有名なサイトに計算方法が載ってるはずだからさ、ポインタでいいから 示してください
- 574 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:39:00.32 ID:ibb6Zkrz.net]
- >>573
ステップ数は単に英語の意味の通り、ステップ(一歩)という意味しかないよ。 ステップイン、ステップアウト、ステップ実行できる単位と考えればいい。 ステップできないのに、ステップ数に数えるとか意味不明だろう ソースコードの行数はLOCという。
- 575 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:42:54.39 ID:wXuuRzeA.net]
- >>574
たとえばさ、↓のページにあるように、ステップ数というと一般的にはプログラム規模を測るための 指標なんだよね e-words.jp/w/%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E6%95%B0.html LOCからコメントや空行を抜いたり、中括弧だけの行を抜いたりと言語によって流儀はあるみたいだけど、 お前の言う流儀がどこにも載ってないんだよ どこに載ってるか教えてくれないか?
- 576 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:49:43.26 ID:ibb6Zkrz.net]
- >>575
だからステップ数は誰も正確な定義をしてないのだから どんなものでも間違いではない。
- 577 名前:デフォルトの名無しさん mailto:sage [2017/04/18(火) 23:54:29.25 ID:wXuuRzeA.net]
- >>576
とはいえ、「インタフェースはステップ数に含まない」と断言するからには、それなりに普及してる 流儀なんでしょ? その流儀がどこに書いてるか知りたいんだが
- 578 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 00:50:35.21 ID:4qCNxF1h.net]
- 動的型付言語の苦手な奴が多過ぎ
ダックタイピングでいいじゃん スタティックおじさん馬鹿にしていながら、自分もスタティックおじさんみたいになってる
- 579 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 01:04:19.78 ID:PWf0mJDu.net]
- ダックタイプおじさんに言われても…
- 580 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 02:34:11.69 ID:kxK9Wtdr.net]
- ここでダックタイプ嫌ってる奴って、ダックタイプを静的言語でやるとしたらジェネリクスとか言い出す奴だもんな
「自分の分からない技術は使えない技術だ」なんて完全にスタティックおじさんだよな
- 581 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 02:40:43.54 ID:0X+KA4Ry.net]
- 静的型の言語の補完の快適さは動的型言語には得られないものなんだよなぁ
インターフェイスとかをいちいち記述する手間を含めてもその最適さのほうが上回る感はある
- 582 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 02:43:32.85 ID:kxK9Wtdr.net]
- >>581
という感想を持つ人は静的言語を使えばいいし、インタフェースとかをいちいち記述するのが面倒くさい人は 動的言語を使えばいいよね ただそれだけの話
- 583 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 06:39:45.49 ID:SqPK9IfP.net]
- 自分だけで完結してる話ならそれでいいんだけど仕事だとそれじゃ駄目なんだよね
以前rubyのプロジェクトで酷い目にあったのでもう動的型付け言語は嫌だわ
- 584 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 07:15:17.15 ID:5nJ22bL2.net]
- インターフェースがある言語を使ってる人のほうが、よっぽどダックタイピング的思考をしてるだろう
rubyなんて脳内で型付けしてて、ダックタイピングのことなんて考えてない 教祖だけが狂ってる
- 585 名前:デフォルトの名無しさん [2017/04/19(水) 07:48:20.66 ID:+KnDkITW.net]
- >>562 意見ありがとう。552です。
>Web環境ではJavaScript以外の選択肢はないんだし。 同意します。Google が TypeScript を標準言語にしているのも、その意味なんでしょう。 俺としては型推論の働く、濃密なコード記述可能で、良質のライブラリが揃っている言語が欲しい。 Haskell が型推論で一番強力だと思うが、キャズムを超えられないと思う。Python のよ うな、全世界の知性による良質なライブラリの膨大な蓄積は期待できない。
- 586 名前:デフォルトの名無しさん [2017/04/19(水) 07:53:38.11 ID:+KnDkITW.net]
- >> 562 ところで初心者はそういう「短く書ける方がイイ」みたいなことをよく言うが、
君が本当に一万行のコードを書ける奴なら、それは意味無いと分かるだろ。 この主張への反例として、下の URL にある RSA 暗号の実験コードを示す www.math.kobe-u.ac.jp/~taka/asir-book-html/main/node96.html 二つの素数 p,q, から n=p q, n`=(p-1) (q-1) を経由して、秘密キーd 公開キー e を 構築する。ただし d e==1 mod n`。この 公開キー (e,n) を使ってデータ m から暗号 mm を生成し、mm から秘密キー(d,n) を使って m を復号する ## 素数 p,q から n` の定義する (暗号化されるデータ m は m < n` である) p=13;q=17;n=p q; n`=(p-1) (q-1); n` =============================== 192 # e=35 は gcd(e,n)=1 となる適当に選んだ数数。 ts(); p=13;q=17;n=p q; n`=(p-1) (q-1); e=35; ts.gcd(e,n`) =============================== 1
- 587 名前:デフォルトの名無しさん [2017/04/19(水) 07:54:07.55 ID:+KnDkITW.net]
- ## e から d e %n` == 1 となる d を作る
p=13;q=17;n=p q; n`=(p-1) (q-1); e=35; d = e^(n`-1) %n`; d, (d e) % n` =============================== (11L, 1L) ## p,q から作った (d,n) を秘密キーにして (e,n) を公開する。given m=100 に対する暗号は m^e mod n で行う ↑ (m^e mod n) ^ d mod n により、暗号 (m^e mod n) から m を複合できる # m = 100(<n` == 192) に対する暗号 m^e mod n:94 を生成する m=100; p=13;q=17;n=p q; n`=(p-1) (q-1); e=35; d = e^(n`-1) %n`; m^e %n =============================== 94 # m = 100 に対する暗号 mm=94 から、元の m を複合数 mm=94; p=13;q=17;n=p q; n`=(p-1) (q-1); e=35; d = e^(n`-1) %n`; mm^d %n =============================== 100
- 588 名前:デフォルトの名無しさん [2017/04/19(水) 07:54:36.26 ID:+KnDkITW.net]
- 以上の計算ができれば、RSA 暗号を実装できる程度に理解したと言えます。
ここでの one-liners は、プログラムというより、コンピュータ計算可能な数式です。 これ以上に単純化できない程に濃密です。しかも独立しています。それ以前の文脈に影 響されません。試行錯誤のごみの山から御宝式だけを copy and paste で取り出せま す。 これらの one-liners は短いけれど、可読性も備えています。 Python は、これだけの濃密なコード記述を可能にする良質なライブラリ群を備えています。 これらのコードを書くのに、一々 big num class を持ち出したりしてられません。RSA 暗号数学だけで、手一杯なのですから。 これらの one-liners で、int 型宣言する意味もないでしょう。
- 589 名前:デフォルトの名無しさん [2017/04/19(水) 07:55:01.02 ID:+KnDkITW.net]
- >>562 一番速いのは多分Rubyだろうし、この点ではPythonは遅いほうだよ。
老婆心ながら言っておきます。こんな理由で Ruby に学習コストを書けるのは止めるへき。 スピードが欲しいならば C 言語で実装して繋げばよい。SciPy は、実装にそうして実装 され、data science 分野で使われ、ライブラリが蓄積され続けている。 Ruby が書き安い言語なことには同意する。しかし勝手な互換性の放棄により、良質なラ イブラリの作者たちを離反させすぎた。Python community とは差が付きすぎた。 Python は Ruby と比較して読みやすい。俺にとって読んで楽しめるコードは Python だ けだ。C 言語はマクロの解析が必要になるなど、コードを読むことは苦痛のほうが勝 る。Ruby は C言語よりは読みやすいが、楽しめるほどではない。 今更 Ruby に向かうのは無謀すぎる。
- 590 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 08:42:44.89 ID:NBkpFfOk.net]
- どうせエンジンのお粗末なRubyのことだから
型が付いてもそのまま実行するよりWASM経由でした方が早いとなるだろうな。
- 591 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 09:30:10.92 ID:kxK9Wtdr.net]
- >>589
思いっきり文章の読み方を間違ってるよ >>562 でいうスピードは変化のスピードだよ 君がPython好きなのは分かるが、他の言語をけなそうとする余り文章を読み違えるのは いただけないな
- 592 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 09:59:52.76 ID:96WIxtun.net]
- Julia!
- 593 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 11:52:47.70 ID:oz+MR2rn.net]
- >>591
「このプログラミング言語は速い」って文脈で「進化の速度」のことを言っている奴は初めて見たな 普通は実行速度だよな? プログラミング基礎でO記法とか学ぶもの
- 594 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 12:15:11.91 ID:kxK9Wtdr.net]
- >>593
>>562 で直前で > とりあえず「進化している言語」を一つ追跡しておけば問題はないだろ。 と書かれているので、ここでの速いは進化の速度だよ そうでないとJavaScriptを除外している部分と整合性が取れない (JavaScriptは実行速度はかなり速いしね)
- 595 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 12:54:41.04 ID:D6qUbZcQ.net]
- >>560
亀レスで申し訳ないが、それはお前の認識が誤っているからだ あるライブラリAの、とあるクラスが、別のライブラリBて定義されている インターフェースを実装していた場合 ライブラリAはライブラリBでも使われることを前提としている というかライブラリBの上にライブラリAを築いている あたりまえだろ?だから当然想定されている で、ダックタイピングの場合は メソッド名が一致しているからひょっとして使えるんじゃね? ってレベルだろ そんなの偶然の一致かもしれないし、使えるかどうかわからん 元の開発者はそんなこと想定してないかもしれない 微妙に動作が違うかもしれない
- 596 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 13:04:46.14 ID:D6qUbZcQ.net]
- >元の開発者はそんなこと想定してないかもしれない
と書いたが、逆に使われることを想定しているんなら インターフェース方式でも問題ないんだよ ライブラリBのインターフェースを実装すればよいだけだからな 使われることを想定しているんなら、これは当然できる状態にある そして明確になる
- 597 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 13:17:55.77 ID:cvkGewar.net]
- >>596
どういう主張だっけ? 作者が意図しない使い方はすべきでない、つまりダックタイピングは悪 ってこと?
- 598 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 13:29:02.70 ID:D6qUbZcQ.net]
- 言いえて妙な話で、あるクラスがあちこちで使われることを想定しているなら
クラスの開発者は、想定する全ての使われ方について、全てのンターフェースを 実装すればよい 逆に、実装されてないインターフェースに関しては 「想定してませんよ、考慮してませんよ、ノーサポート」って事なんだよ その場合は、当たり前だが自分でラッパークラスを書けばよい ちょっとしたデータ変換や仕様のすり合わせもそこですればよい 元のクラスが想定してないんだから、これは当然なんだよ ダックタイピングは全てのクラスが自分の管理下にあって 仕様を完ぺきに把握しているのなら可能かもしれんが、という話
- 599 名前:デフォルトの名無しさん mailto:sage [2017/04/19(水) 13:31:56.22 ID:D6qUbZcQ.net]
- ラッパークラスと書いたが、アダプタクラスと言ったほうが正しいかもしれん
|
|