tag:blogger.com,1999:blog-3636872937372639901.post981660653824957672..comments2024-03-27T21:24:43.584+09:00Comments on 本の虫: Dartがダウンキャストに警告を出さない理由江添亮http://www.blogger.com/profile/13387122818743087721noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-3636872937372639901.post-89859716331692369592012-07-14T17:12:59.655+09:002012-07-14T17:12:59.655+09:00まあ、現実的には駄プログラマが多いので、がっちがちな縛りが必要ってことで。まあ、現実的には駄プログラマが多いので、がっちがちな縛りが必要ってことで。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-938660228508433562012-01-09T21:11:40.686+09:002012-01-09T21:11:40.686+09:00せっかく返事をいただいたのにまた批判するのは忍びないのですが、「そもそも、オブジェクト指向は何も言語...せっかく返事をいただいたのにまた批判するのは忍びないのですが、「そもそも、オブジェクト指向は何も言語による支援が必要な概念ではないのです。」などといったことをわかったようにまたポンと書くから、あなたは現実を知らないというのです。そんなことは誰でも分かっていることです。C++も昔はCへのトランスレータでしたしね。ですが、私はそんな形而上学的な話をしているのではなく、現実の世界のことを言っているのです。<br /><br />先の私のコメントで、C#やJAVAの進化と書いたのは、具体的にはジェネリックのことです。机上の空論ではなく、実際に業務でコーディングする際には、既成のライブラリのコンテナを使うことが多いですが、ジェネリック対応以前は、コンテナ内のアイテムを使用する際にはダウンキャストを使わざるを得ませんでした。<br /><br />私はDartについては知らないので、あなたがDartの構文に限定して講釈をたれるのであれば、「ああ、Dartではそうですか。」と素直に読むこともできそうなものですが、それを調子に乗って一般化し、「OOPとはこうである」とか、「プログラマーとは云々」などという知ったかぶりをするから、分かったようなことを言うのはおよしなさい、と言いたくなった次第です。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-28493764876311508162012-01-09T10:26:14.295+09:002012-01-09T10:26:14.295+09:00もちろん、このように直接プログラマーにコードを書かせるのは誤りのもとであるので、C++では、構造体で...もちろん、このように直接プログラマーにコードを書かせるのは誤りのもとであるので、C++では、構造体ではなくクラスという概念を導入し、クラスはvirtual関数を持てるようにし、プログラマーを実行時の型チェックから、コードの上では解放したのです。<br /><br />そもそも、Dartの思想は、<br />「開発時に厳格な型チェックが行われるのは面倒であるから型はオプショナルとする。プログラマーは実際のコードではなく、型情報を来にしなければならない。これはプログラマーを実際の問題の解決から遠ざける」<br />というものなので、まず確実に問題になる場合のみに警告を発するのは当然です。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-11244764282924287892012-01-09T10:19:24.467+09:002012-01-09T10:19:24.467+09:00そもそも、オブジェクト指向は何も言語による支援が必要な概念ではないのです。
たとえば、あるCの構造体...そもそも、オブジェクト指向は何も言語による支援が必要な概念ではないのです。<br />たとえば、あるCの構造体に、構造体の種類を示すメンバー変数があったとしたら、<br /><br />enum Shape_Type { triangle, quadrilateral, circle, } ;<br /><br />struct Shape<br />{<br /> Shape_Type type ;<br />} ;<br /><br />この場合、Shapeは親クラスであり、Shape::typeの値はいわば、クラスの実際の型、すなわち子クラスを示す実行時型情報といういえます。<br />言語による支援はないとしても、根本的には同じです。<br /><br />この情報に依存して、与えられたShape型のオブジェクトのtypeを調べ、条件分岐して、それぞれ別の処理を行うようなコードは、根本的には、親クラスという抽象的な型から実行時の具体的な型を取得しているので、ダウンキャストをしていると言えます。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-1101932816300732952012-01-09T01:03:34.950+09:002012-01-09T01:03:34.950+09:00Anonymousさんのご指摘はもっともでしょう。オブジェクト指向で大規模開発に携わり、苦労を重ねた...Anonymousさんのご指摘はもっともでしょう。オブジェクト指向で大規模開発に携わり、苦労を重ねた経験がある人間であればダウンキャストは悪であると言うでしょう。JAVAもC#も、これを避けるための進化を遂げてきたのは御存知のことと思います。<br /><br />また、多人数で開発を行う場合には、静的チェックはなるべくおせっかいのほうが役に立つのです。構文的には正しいが、プログラマが本当にそれを意図したのか疑わしい場合には警告を発してくれる方が助かります。コンパイラの警告には飽き足らず、lint的なツールを別個に導入しているプロジェクトにも携わりましたが、これは潜在的バグの発見に役立ちました。<br /><br />それを「ダウンキャストは、オブジェクト指向言語ならば、当然行うこと」と言ってみたり、「警告というのは、ほぼ確実に誤りである場合にのみ発せられるべきなのだ」などと言うのは現実を知らないんでしょうね。<br /><br />言語マニアの立場で講釈をたれるのは結構ですが、(実際、あなたの重箱の隅をつつく様な内容にもときどき興味深いものがあります。)したり顔で世間知らずな考えをもっともらしく披露して素直な方を混乱させるのはどうかとおもいます。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-60617706396422232252011-10-23T15:09:46.775+09:002011-10-23T15:09:46.775+09:00まあ、そういうツールもひとつの手でしょう。
Dartの型システムは、静的解析を助けるためにあるのです...まあ、そういうツールもひとつの手でしょう。<br />Dartの型システムは、静的解析を助けるためにあるのです。<br />実行時のパフォーマンスだとかエラーチェックには、一切影響を及ぼしません。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-75806583365216605822011-10-23T08:51:05.462+09:002011-10-23T08:51:05.462+09:00さっそく記事にしていただき、ありがとうございます。
正直なところ、「ダウンキャストは、オブジェクト指...さっそく記事にしていただき、ありがとうございます。<br />正直なところ、「ダウンキャストは、オブジェクト指向言語ならば、当然行うことである。 」とは少々意外でした。<br /><br />JavaやC++で設計をする際、基本的には「ダウンキャストが発生しないように設計する」のが基本ですよね?<br />そもそもダウンキャストするくらいなら、最初からアップキャストすんなよって話です。<br /><br />一番怖いのは、多人数で開発していた、誰かが「誤って、間違ったダウンキャストを書く」ことです。<br />もちろん、どうせ<br />String str = static_cast(obj);<br />なんて書けば、警告もエラーもなく間違ったダウンキャストをしのばすことはできますが、少なくともそんなことをしていないかどうか「検索」できるという利点がある気がします。<br /><br />それともこんなことはIDEがやるべきことで、言語の仕様がサポートすべきことではない。といったところでしょうか?<br />IDEが「ダウンキャストを行っているところを列挙」してくれるのであれば、確かに「ダウンキャストに対する警告を抑制するための構文」は言語仕様的には冗長ですし、むしろ抑制された方が厄介な結果になる場合もあるかもしれません。Anonymousnoreply@blogger.com