R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

暗黙的型付け

C#と言う言語は、型セーフな言語です。

なので、常に型を意識して書く必要があると思っていたのですが、

暗黙的型付け

を使うようになってからは、少し考え方が変わってきました。

 

例えば、以下の3つのコードは、同じ処理をします。


double amount = this.GetAmount();
this.SetAmount(amount);


var amount = this.GetAmount();
this.SetAmount(amount);


this.SetAmount(this.GetAmount());


1番目のコードは、amount 変数は double 型であることがわかります。
また、GetAmount() メソッドは、double 型の値を返すことや、SetAmount() メソッドの引数が double であることは、このコードを読むだけでわかります。

2番目のコードでは、Amount の型はわかりません。
ですから、GetAmoun() メソッドが返す型や、SetAmount() メソッドの引数の型が何であるのかは、このコードを読んでもわかりません。
しかし、GetAmount() の戻り値の型が、SetAmount() の引数の型に対してキャストの不要な型であることはわかります。

3番目のコードは、変数を介さずに同じ処理を行っています。
GetAmount() の戻り値の型が、SetAmount() の引数の型に対してキャストの不要な型であることがわかる点は2番目のコードと同様です。

この3つのコードを見て、3番目のコードが有用な記法だと思う人は、2番目の書き方も許容できることになるのではないかと思っています。
理由は、2番目と3番目のコードは GetAmount() の戻り値の型や、SetAmount() の引数の型を明示していない点で共通しているからです。

同時に、3番目のコードを純粋に変数を介するやり方に置き換えるなら、1番目よりも2番目のコードの方が近しい置き換えと言えるのではないかと思います。

しかし、3つのコードで共通して言えることは、GetAmount() の戻り値と SetAmount() の引数の型を調べてから記述しなければならないということです。
結局、どのような書き方を用いたとしても、型セーフであるという考え方に基づいていることは間違いないということなのでしょうね。

投稿日時 : 2007年12月25日 15:14

Feedback

# re: 暗黙的型付け 2007/12/25 15:23 じゃんぬねっと

3 番目のコードは、戻り値の型が見えていないだけで指定されていれば自明だから許容できる人は多いと思いますが、かといって 1 と 2 が近しい置き換えになるわけではないです。
近しいというか JIT コンパイル後は同じコードになるのでしょうけど。

# re: 暗黙的型付け 2007/12/25 16:02 アキラ

メソッドの戻り値を"気にしない型"として使うことにはとくに反対しません
ですが、それも使いすぎ注意ですね

一度にこんな数の変数の型を本当に気にしなくていいの?
var id = GetID();
var name = GetName();
var age = GetAge();

DispID(id);
AddAge(age);
CreateName(name);
DoSomething(id, name, age);

こっちならいいけど
DoSomething(GetID(), GetName(), GetAge());

# re: 暗黙的型付け 2007/12/25 16:04 ひろえむ

んー。 問題点がすりかわっているように思います。

関数の定義で直接関数を使うのは
1.用途が関数の演算に限定される。
2.関数の型は定義されており自明である
3.戻り値も同様

一方、型推論で生成された変数では
1.利用用途はスコープの範囲内では限定されていない
2.型は推論されるため、一度何らかの方法で型を認識する必要がある。(newされるインスタンス・関数の戻り値などなど)
3.認識する方法は1種類だけではない。
4.場合によってはコンパイルエラーまで・・・

まあ、これだけではないかもしれませんがいろいろと前提が異なります。

これらを同列で見るのは少々無理がありませんか?(^^;

# re: 暗黙的型付け 2007/12/25 17:24 NyaRuRu

C++/C# では,変数と関数で皆さん読み方変えている感じですな.

たとえば,C# 3.0 ではコンパイルできませんが,こんな推論が許されるとして,
var get_id = () => GetID();
var get_name = () => GetName();
var get_age = () => GetAge();

ここで,以下のように書けば文句が出ないとすれば,やはりそういう読み方の最適化が起きているんじゃないかなという気がします.
DispID(get_id());
AddAge(get_age());
CreateName(get_name());
DoSomething(get_id(), get_name(), get_age());

「C# という言語として読みやすい/読みにくいか」と,プログラミングという行為自体に一般化した上で「読みやすい/読みにくいか」の議論は区別した方が良いかもしれませんね.
Haskell のように,副作用のない束縛ベースの世界ではだいぶ読み方が違ってきますし.

「ある流派は木の橋の掛け方を教え、別の流派は鉄の橋の掛け方を教え、というように、どちらの流派で学んだ者も木や鉄の制約を橋そのものの制約と思いこみ、木と鉄を一緒に使うことは思いも寄らないであろう。」ですな.

# re: 暗黙的型付け 2007/12/25 17:24 アキラ

Rさんに聞いてみたいんですけど

型推論は
「気にせずどんどん使え」派ですか?
それとも「気をつければどんどん使え」派ですか?

「気をつければ...」なら
どんなコードが許容できて、どんなコードが許容できませんか?

# re: 暗黙的型付け 2007/12/25 17:31 ひろえむ

#NyaRuRuさん

>var get_id = () => GetID();
>var get_name = () => GetName();
>var get_age = () => GetAge();

私的にはナシですね(^^;
意味のない型推論はどうにも許容できないです。
ひとつひとつは小さな推論でも数が増えれば、やはり誤りの元かと。

# re: 暗黙的型付け 2007/12/25 17:47 NyaRuRu

>ひろえむさん

言いたいのはそちらが主眼ではなくて,

DispID(get_id());
AddAge(get_age());
CreateName(get_name());
DoSomething(get_id(), get_name(), get_age());



DispID(id);
AddAge(age);
CreateName(name);
DoSomething(id, name, age);

の両方を局所的に読んだとき,前者は「宣言が気にならなくて」後者は「宣言が気になる」とすれば,多分それって「経験」の結果なのかなと.
C++/C#では,DoSomething(GetID(), GetName(), GetAge()); のようなコードを読む時,無意識のうちに「関数の戻り値を推論する」という行為を行っている気がします.
一方変数の場合は,推論せずに変数宣言を見ると体が覚えているので,明確に書いてないと不安になると.そんな感じではないでしょうか?

# re: 暗黙的型付け 2007/12/25 18:16 NyaRuRu

「C# 3.0 の var の濫用は既存のコードリーディング戦略と衝突するので慎むべし」という主張であれば,おっしゃることはもっともだと思います.

しかし「var が多用されたコードはこれこれこういう理由で読みにくい」を思い付く限り列挙するときには,それがそもそも C# という言語の持つ必然的または偶然的な制限に大きく影響を受けた結果であることを忘れてはいけないなとも思うわけです.
有名言語にも,歴史的経緯や偶然の結果存在する変な仕様や制限が残っていたりしますからねぇ.

# re: 暗黙的型付け 2007/12/25 18:18 アキラ

>NyaRuRuさん

でも、体が覚えてるって大事なことだと思いますよ

C# 3.0を導入し始めた開発現場でいきなり
「ローカル変数を全部varに置き換えました」とか言われたら
「そんなコード読めるかー」って言われませんか?

新しい概念を取り入れ、組み合わせて使うことはもちろん大事ですが、それが今までの概念を使ったコードとがらりと違っていたら、それは難読コードになりえるんじゃないかと思います

# re: 暗黙的型付け 2007/12/25 18:31 アキラ

varやラムダ式の使用にはいくつか段階を踏むべきだと思うんですよ

1.C# 2.0 + αとしての使用
  (C# 2.0の概念を補助する形で使用)

2.C# 2.0 + αとして使ったコードが当たり前のように受け入れられる

3.C# 3.0移行では、もっと広い視野でプログラミングしなければならない

varやラムダ式は、いわゆるパラダイムシフトなので、いきなり全部を取り入れるのは難しいと思います

# re: 暗黙的型付け 2007/12/25 18:33 アキラ

誤字訂正

>3.C# 3.0移行
3.C# 3.0以降

# re: 暗黙的型付け 2007/12/25 18:38 NyaRuRu

>でも、体が覚えてるって大事なことだと思いますよ

はい.そこは強く同意です.
だから,「何で読みにくいか」は「多くの人が体で覚えているコードと違うから」の一言でいいんじゃないかなと思うわけですよ.
var の濫用を思いとどまらせるためであれば,それがベストな気がします.逆に,読みにくい理由を論理的に説明しようとする作業は,孔明の罠と.

あとまあ「多くの人が体で覚えているコードと違うから」という理由で「ひどいコード」と言い切られているものが多いのもちょっとかわいそうな気がするんですよね.単に「歴史的に主流になれなかったコード」かもしれないし,別の言語だと「普通」かもしれないし.

# re: 暗黙的型付け 2007/12/25 18:39 アキラ

なるほど。納得しました

# re: 暗黙的型付け 2007/12/25 22:43 ひろえむ

>一方変数の場合は,推論せずに変数宣言を見ると体が覚えているので,明確に書いてないと不安になると.そんな感じではないでしょうか?

んー。そういうことなんでしょうか?

パラダイムシフトについていけていないのかもしれませんが、正直、未だにピンときていない感じですねー。

理由なく型推論することがよしとされることに非常に抵抗があります。

型推論という仕組みそのものが理解できないのではなく、それを適用すべき適切な理由なく利用することがよしとされるべきなのかがまだなんとなく理解できません。

>あとまあ「多くの人が体で覚えているコードと違うから」という理由で「ひどいコード」と言い切られているものが多いのもちょっとかわいそうな気がするんですよね.単に「歴史的に主流になれなかったコード」かもしれないし,別の言語だと「普通」かもしれないし.

型推論することがひどいコードだとは思いませんが、必然性もなく型推論することに抵抗があるんですね。

だって、型が書いてあったことによるメリット「型を勘違いしにくい」ということを置いてわざわざ型推論を利用する意味が今ひとつ理解できません。

うーん、ただパラダイムシフトについていけてないだけなんだろうか・・・はて(^^;

# re: 暗黙的型付け 2007/12/25 22:44 ひろえむ

お、アキラさんは納得している!

うーん、いよいよ私がついていけていないのかなぁ(^^;

# re: 暗黙的型付け 2007/12/25 22:56 シャノン

> それを適用すべき適切な理由なく利用することがよしとされるべきなのかがまだなんとなく理解できません。

varファンは「使っちゃいけない理由はあるの?」って聞いてくるかもしれませんね。
原則OKか原則NGかは前提としておかないと平行線です。

# re: 暗黙的型付け 2007/12/25 23:55 ひろえむ

>varファンは「使っちゃいけない理由はあるの?」って聞いてくるかもしれませんね。

>だって、型が書いてあったことによるメリット「型を勘違いしにくい」ということを置いてわざわざ型推論を利用する意味が今ひとつ理解できません。

これこれ(^^;
それに、型がわかりやすいじゃないですか。

それと引き替えにしてvarで書くことのメリットが見えてこないって感じなんですよね。

# re: 暗黙的型付け 2007/12/26 3:15 NyaRuRu

>ひろえむさん
別に既存のコードのローカル変数宣言を全部varに書き換えようって言っているわけじゃないですよ.
C# 2.0 スタイルで書かれたコードで,var を敢えて使うべきかと言われれば別に要らないんじゃないですかね.これで満足いただけますでしょうか?

んー,これ以上をコメントでやると長くなるかなぁ.また今度飲み会の時でも.

# re: 暗黙的型付け 2007/12/26 14:52 なぎせ

出遅れましたが、私もひろえむさんと同じ意見。
積極的につかうメリットが見えない。

# 暗黙的型付け(その2) 2007/12/26 15:34 R.Tanaka.Ichiro's Blog

暗黙的型付け(その2)

# re: 暗黙的型付け 2007/12/26 15:35 R・田中一郎

コメントへの返信ですが、長くなっちゃたので本日のエントリーとしてアップすることにしました。
また、いろいろご意見をいただけると嬉しいです。

# 暗黙的型付け(その2) 2007/12/26 18:11 R.Tanaka.Ichiro's Blog

暗黙的型付け(その2)

# 型推論を使う理由は抽象型を使うようなもの? 2007/12/26 21:29 凪瀬 Blog

型推論を使う理由は抽象型を使うようなもの?

# C#3.0が話題? 2007/12/26 23:49 かずきのBlog

C#3.0が話題?

# re: 暗黙的型付け 2007/12/27 9:35 じゃんぬねっと

しっかし、R さんの記事は人気あるなぁ。うらやましい。
プロパガンダ的に書いているとしたら、全員「してやられたり」ですな。

# 暗黙的型付け(その3) 2007/12/27 14:32 R.Tanaka.Ichiro's Blog

暗黙的型付け(その3)

# re: 暗黙的型付け 2007/12/27 14:43 R・田中一郎

>しっかし、R さんの記事は人気あるなぁ。うらやましい。

思ったより PV は伸びていないんですよね。
原価割れしている感じです。
どうすれば、じゃんぬさんのように慣れるのか知りたいです。

>プロパガンダ的に書いているとしたら、全員「してやられたり」ですな。

釣り師の時もそうでしたが、じゃんぬさんのさりげない一言が尾を引くことがあるので怖いですw

# re: 暗黙的型付け 2007/12/27 16:39 じゃんぬねっと

ご、ごめんなさい。

シャノンさんフラグのソースに私の名前が紛れ込んでいるのもたぶんそのせいです。

# re: 暗黙的型付け 2007/12/27 16:57 R・田中一郎

シャノンさんフラグが立つという表現は、今後流行ると思います。
間違いないです。

# re: 暗黙的型付け 2007/12/27 17:38 シャノン

リアルでももうちょっとフラグ立って欲しいですorz
あ、死亡フラグは無しで。

# re: 暗黙的型付け 2007/12/27 20:06 R・田中一郎

ご謙遜ですね。
既に、いくつかフラグが立っているじゃありませんか。

#・・・よくわからない会話になってきている希ガス

# varは、2007年のクリスマスプレゼント? 2007/12/28 9:39 石野光仁 Blog

varは、2007年のクリスマスプレゼント?

# 暗黙的型付け(その4) 2007/12/28 13:33 R.Tanaka.Ichiro's Blog

暗黙的型付け(その4)

# Cheap Canada Goose 2012/10/19 17:07 http://www.supercoatsale.com

of course like your website however you have to check the spelling on several of your posts. A number of them are rife with spelling problems and I find it very bothersome to inform the truth nevertheless I will certainly come again again.

# burberry bags 2012/10/26 5:16 http://www.burberryoutletonlineshopping.com/burber

obviously like your web site but you have to test the spelling on several of your posts. Several of them are rife with spelling problems and I find it very bothersome to tell the reality however I'll certainly come again again.
burberry bags http://www.burberryoutletonlineshopping.com/burberry-tote-bags.html

# wallet 2012/10/27 22:58 http://www.burberryoutletonlineshopping.com/burber

You have brought up a very fantastic points , thanks for the post.
wallet http://www.burberryoutletonlineshopping.com/burberry-wallets-2012.html

# Prepare The Ideal gucci Promotion 2012/12/23 21:20 Reoglerolla

OhyZsf http://guccimenzujp.com/ - gucci メンズ WqwYre http://guccimenzujp.com/ ZizVsg http://guccimenzujp.com/グッチ-メンズ財布-c-4.html - グッチ 財布 PnrCbx http://guccimenzujp.com/グッチ-レディース長財布-c-2.html - グッチ バッグ LyvFeb http://guccijastore.com/ - グッチメンズ JbnEbv http://guccijastore.com/ PjtZki http://guccijastore.com/グッチ-財布-c-2.html - gucci 財布 XphStm http://guccijastore.com/グッチ-バッグ-c-1.html - グッチ バッグ OcoNxc http://www.guccijpcheap.com/ - グッチ OyaVmg http://www.guccijpcheap.com/グッチ-財布-c-3.html - gucci 財布 TgaKbh http://www.guccijpcheap.com/グッチ-バッグ-c-1.html - グッチアウトレット PraAyp
http://www.bootswinterjp.com/ - ugg アグ

タイトル  
名前  
Url
コメント