- PR -

インスタンスに対する変数型は、本当に、一意に決まるのか?

投稿者投稿内容
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-01-13 10:49
うーん、そもそも今までの書き方も出来るし影響範囲なんてローカルしかないvarなんてそんなに問題にするようなもの?スコープが非常に狭い。個人的にはステートメントレベルでの型のポータビリティの排除なんて求めていないしメソッドレベルでの型安全性を保った型総称性はジェネリクスでほぼ問題ないと考える。

それにこのキーワードはただ右辺に型情報を依存させるだけ(だからコンパイル時にエラーが分かる)のものであって、LINQのおかげで右辺の表現力が格段に向上するからでしょ。インターフェイスなり使用するならばvarは使わなければいいだけであって(例えばlamda式をExpressionとして取得する場合明示的に宣言するよね)。
以下がvarの主目的であると思われるコード。

コード:

var values =
  from a in Foo, b in Bar
  where a.ID == b.ID
  select new{ ID = a.ID, Name = a.Name, Enabled = b.Enabled };
var enabledValues =
  from it in values
  where it.Enabled
  select it;



valuesの型はselectの匿名タイプに依存して、さらにenabledValuesの型もそれに依存する。もしこれで今までのように明示的に型を書かなければならないのだとしたら一つ目のクエリのvarの部分にもまったく同じ型定義を書かせますか(IEnumarable<class{int ID, string Name, bool Enabled}>)?それでさらにenabledValuesのところにも。修正する場合3箇所も書き直さないといけないですね。逆にミスを誘発するような気さえする。

…個人的にはむしろExtension Methodのほうが問題が大きいと思うけどなぁ。要はmix-inで重要性は折り紙つきだからこそ、LINQ専用のような実装の仕方じゃなくもうちょっと何とかならんかったものか。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2006-01-13 18:17
objectです。
#少し長くなりました。
#済みません。
============================================================
>Jittaさん
>そういうときにこそ、MVP を使ってください。MVP は、強い口調でマイクロソフトに意見することが出来ます。
>マイクロソフトにとって、MVP はバックに多数のユーザがついている、ユーザの代表なのです。
>
>あと、ご案内。
>「C#の設計者 アンダース ヘルスバーグ に聞きたい事」
>http://vsug.jp/tabid/63/forumid/45/postid/1423/view/topic/Default.aspx
了解しました。
また、その時はお願いします。
============================================================
>未記入さん
ええ、だから問題の本質は、
「何度も同じ型名をタイピングする事」
には無いと思います。
============================================================
>じゃんぬねっとさん
>VS2003 の IDE 上で、C# にはこのインテリセンスの機能が既にあります。
>インテリセンスに凝ったハズの VB は何故かありませんが...
ええ、そういう意味では、
今迄の「IDE実装の流れ」とか、
「設計者が語るVisual Basicの来た道、進む道」
http://www.atmarkit.co.jp/fdotnet/t-interview/vb2005/vb2005_03.html
をみても、私には「VB設計者が何を考えているのか」が見えて来ません。
============================================================
>なちゃさん
「LINQ」の問題が中心であるのは、私も間違い無いと思います。
============================================================
>yaさん
>うーん、そもそも今までの書き方も出来るし影響範囲なんてローカルしかないvarなんてそんなに問題にする
>ようなもの?スコープが非常に狭い。
「今までの書き方も出来る」=>「問題が無い」
「影響範囲なんてローカルしかないvar」=>「問題が無い」
という事にはならないと思いますよ?
それから、
「スコープが非常に狭い」
は、このスレの「観点の事」を仰ってるのでしょうか?

>個人的にはステートメントレベルでの型のポータビリティの排除なんて求めていない
「ステートメントレベルでの型のポータビリティの排除」の意味が良く分かりませんでした。

>メソッドレベルでの型安全性を保った型総称性はジェネリクスでほぼ問題ないと考える。
「総称性(ジェネリクス)に関して問題がある」
という指摘がこのスレ内の何処かにあるのでしょうか?

>それにこのキーワードはただ右辺に型情報を依存させるだけ……
>……
>……逆にミスを誘発するような気さえする
コードを含め、ここの内容では、取り立てて反論する積りはありませんが、
何処かで「var」の使用の必要が「問い合わせ式」等でも無いと書いたでしょうか?

>…個人的にはむしろExtension Methodのほうが問題が大きいと思うけどなぁ。要はmix-inで重要性は折り紙つ
>きだからこそ、LINQ専用のような実装の仕方じゃなくもうちょっと何とかならんかったものか。
私も「Extension Method」に関しては良く知りませんが、
何処かで
「インターフェースに対してインスタンスメソッドを書ける」
というのは、読んだ気がします。

それから、
「mix-inで重要性は折り紙つき」というのは、「実用性が高い」
という事を仰っているんですよね。
でも、全てを「実用性」で考える事の問題は、とても大きいと思いますよ?
#『XMLにおける「ボヘミアンと貴族の階級闘争」を読み解く』
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=4276&forum=9
#は、この「実用性中心の考え方(実用主義)」が起因したのではないでしょうか?
============================================================
>ALL
確か、「.NET」に「ObjectSpaces」というのがありましたよね。
所謂「O/R」マッピングです。
これは、「R」が「O」としてみえる訳ですから、
「O」上には何も問題を起こしません。

これに対して、「var」のベースは、言うならば
「R/O」マッピング
だと私は考えています。
でも、これは「R」の「O」への侵食ですから、
「無制限に許すと」
「O」に悪影響を起こすと思います。

ここで重要なのは
真の意味での「オブジェクト指向(狭義のオブジェクト指向)」
を明確にする事だと思います。
#未だ、全く明確になっていません。

私は、@ITで
「UML」を初めとする現在の「モデリング言語(手法)」の問題点は?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18279&forum=25
というスレをたてていますが、
これは
「狭義のオブジェクト指向を明確にさせようとする試みと問題提起」
です。

今ソフトウエア界に起きている、混乱の原因の殆どは、
「狭義のオブジェクト指向を明確にしない事」
に起因しているのではないでしょうか?
============================================================

[ メッセージ編集済み 編集者: object 編集日時 2006-01-13 18:28 ]
清華
ベテラン
会議室デビュー日: 2005/12/21
投稿数: 50
投稿日時: 2006-01-13 20:21
大人ぶってちょっと参戦。

var には多少疑問抱きますね、厳格にすることによって可読性をあげた言語のはずなのにまるでVBScriptのような var と……まぁLINQのこともあるのでいた仕方がないという感もいなめませんが。

まぁそんなことよりラムダ式いらないかなと思った、僕にとって可読性を下げるだけの存在になりそう。

StringBuilder s = new();
は欲しいですね、意味的にも綺麗ですし。

僕としては省略よりも可読性を重視したいです、省略も根気よく作業するためには必要ですが、可読性が下がるとC#の意味が1つなくなっていきますからね……。
_________________
9uiet Design - http://quietdesign.rental.allinoneserver.net/
デザインにこだわったソフトの配布とプログラミングTipsの公開(予定)をしています。
9uiet Blog - http://seiga.blog44.fc2.com/
笑ったことやプログラミングのことなど書
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-01-13 20:41
引用:


「スコープが非常に狭い」
は、このスレの「観点の事」を仰ってるのでしょうか?



いえ、そんな抽象的な話でなく文字通り変数のスコープです。

varはローカル変数以外に使用できません。これは、メソッド外に推論が伝播しないということになります。また、varは初期化子を持たなくてはならないため、型は「右辺に絶対に書いてある」ということになります(ただしこの表現は、ローカル変数であるため別のローカル変数に伝播される可能性がある事を無視していますがそれもメソッドの外へ伝播することは一つの例外を除いてありません)。

そして、この前提で唯一の例外はスタティックな型伝播であるジェネリクスですが、型パラメータは安全性を保証しているため問題がない、という意味です。また、ジェネリクスが導入されたことによってアルゴリズムは「実装するもの」ではなく「適用するもの」に近づくため、ジェネリクスでインターフェイス等を利用した型安全性さえ保証されればさらに今までよりも問題点は減ることにもなります(推論したとしても)。

確かに今までのようなステートメントレベルの型安全性からメソッドレベルの型安全性になるわけで危険性があがると考えることもできるわけですが、それによって発生する危険性を考えるに、まともに設計していればメソッドは単純な構造かせいぜい一画面に収まる程度の量であるはずなので、たどる範囲自体たいしたことがないことになり、たいしたことはないと判断します(むしろ定義を単一化できることによりミスが減るのではないか)。

引用:


「今までの書き方も出来る」=>「問題が無い」
「影響範囲なんてローカルしかないvar」=>「問題が無い」
という事にはならないと思いますよ?



つまり上記の指摘の答えは危険性が問題とするレベルにないという話です。これは「C#は長いメソッドがかけてしまう。これは問題だ」というレベルの危険性と大して違わないと私は判断します。

その上でジェネリクス、クエリ式、匿名タイプの導入により「型名が非常に長くなるか、そもそも名前がない」という状況に対する解決策となりうるので、導入する利点は大きいと判断しているわけです。

引用:


何処かで「var」の使用の必要が「問い合わせ式」等でも無いと書いたでしょうか?



では、チップスとして「必要なとき以外使うな」で済ませればいいような気がしますが…強制しないことによって発生する危険性は説明したとおりですし。

引用:


それから、
「mix-inで重要性は折り紙つき」というのは、「実用性が高い」
という事を仰っているんですよね。



違います(いや、もちろんのこと実用性も重要な判断要素です)。オブジェクト指向本来の考え方からいえば多重継承は認めるべきです。それを危険だからという理由だけでインターフェイスという折衝案で誤魔化している現状のせいで大体大丈夫(例外あり)っていう状況に対する解決策ということができます。
というか、mix-inはオブジェクト指向への解決策ではなく、単一継承言語への解決策です(例えばC++に対してはmix-inはあまり必要ない)。

引用:


これに対して、「var」のベースは、言うならば
「R/O」マッピング
だと私は考えています。
でも、これは「R」の「O」への侵食ですから、
「無制限に許すと」
「O」に悪影響を起こすと思います。



すいません。これが理解できません。varは原始的な(あえてそれ以上しない?)型推論以上のものではないしベースは関数型言語(「オブジェクトの」型について厳密)だと思うのですが、Relationalと何か関係があるのでしょうか?

varなんて宣言のシンタックスレベルの話で構造にまで及ぶようなものでもないと思うんですけど、何か間違ってますかね?型云々の話まで影響を及ぼすレベルとはどうしても思えません。というか、なちゃさんが示した「VBのDimに相当する」という表現はぴったりだと思います。型を指定しないわけではなくて右に指定する(指定したものを使う)だけなのですから。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-13 21:46
引用:

yaさんの書き込み (2006-01-13 10:49) より:
コード:

var values =
  from a in Foo, b in Bar
  where a.ID == b.ID
  select new{ ID = a.ID, Name = a.Name, Enabled = b.Enabled };
var enabledValues =
  from it in values
  where it.Enabled
  select it;




 なるほど、こういう使い方をするのか。
 例としてこれが出てくると、あるいは納得します。LINQ を注目していないものとしては、「たかが、分かり切ったものを省略することが、そんなに必要なのか」と、思っていました。

 ただ、本当に必要なのか、というのは、まだ疑問です。
 問い合わせた結果がどういうものか、結果が返ってこないとわからない……CSV で "001" を文字列として扱いたいのに数字として扱われるというのがしょっちゅう問題になっていますが、そういうことがおこらないのかな?

 また、スコープがメソッド内に限定されますよね?それって、かえって不便じゃないかなぁ?
 ADO.NET は、乱暴な言い方をすれば、メモリ上にデータベースを複製しますが、このときに型を可搬的にしなければなりません。型付けされた DataSet などですね。型付けされた DataSet を作るなら、必要ないんじゃないかなぁ?
________________________________
□ Posted by Jitta on 2006/01/13
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-14 12:33
引用:

>でも、タイプ数が少ないのもスキなので、最終的には書けるところには var って書いてしまいそうな予感です (^^;;;
仰ってるのは、ただ単に
「タイプ数が少ない」
という事では無く
「必要なタイプは」
という事、つまり
「不必要なタイプ迄自分では作りたくない」
という事ですよね。



いえ、単に「入力する文字数が少ない方が好み」という意味でした (^^;

# begin ~ end より { ~ } がスキ。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-14 12:51
引用:

 問い合わせた結果がどういうものか、結果が返ってこないとわからない……CSV で "001" を文字列として扱いたいのに数字として扱われるというのがしょっちゅう問題になっていますが、そういうことがおこらないのかな?



その辺はデータソース次第です。
DLINQ の場合、DB のスキームを元に、各フィールドの型が CLR の型にマッピングされます。

XLINQ の場合、XML Schema が定義されていればその型付け規則に従うはずです。
Schema が無い場合はどうなるだろ? すべての属性値やノード値が文字列扱いかな?

引用:

 ADO.NET は、乱暴な言い方をすれば、メモリ上にデータベースを複製しますが、このときに型を可搬的にしなければなりません。型付けされた DataSet などですね。型付けされた DataSet を作るなら、必要ないんじゃないかなぁ?



LINQ は、DataSet よりも低位の仕組みなので (^^;

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-14 13:01
引用:

 そういうときにこそ、MVP を使ってください。MVP は、強い口調でマイクロソフトに意見することが出来ます。マイクロソフトにとって、MVP はバックに多数のユーザがついている、ユーザの代表なのです。



開発者向け製品に関しては

MSDN Product Feedback
http://lab.msdn.microsoft.com/productfeedback/

を介して、誰でもフィードバックを投げかけることが出来ます。

C#3.0 や LINQ については、現在広くフィードバッグが求められています。

近々では、Jitta さんの紹介してくれた

「C#の設計者 アンダース ヘルスバーグ に聞きたい事」
http://vsug.jp/tabid/63/forumid/45/postid/1423/view/topic/Default.aspx

にコメントしてもらえれば、C#3.0/LINQ の設計責任者に対して直接意見を伝えることが出来ます。

引用:

 私としては、囚人さんのを見て思ったのですが、
var s = new StringBuilder();
よりも、
StringBuilder s = new();
のほうがいいなぁ。。。代入しようとしている型から s の型が推論できるなら、宣言している型から作らなければならない型を推論することも出来るのでは?



var とは違う意味で、これもアリかな。。。
面白いから、これこそ Product Feedback に投げてみては?

# Vote しますよ

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/

スキルアップ/キャリアアップ(JOB@IT)