R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

暗黙的型付け(その3)

http://blogs.wankuma.com/rti/archive/2007/12/26/114624.aspx
暗黙的型付け(その2)

http://blogs.wankuma.com/rti/archive/2007/12/25/114456.aspx
暗黙的型付け

上記のタイトルのコメントですが、更に濃い反応をいただいたため、再び1タイトルとして独立させることにしました。
前回の論点は、var は型を明らかにしていない訳ではなく、きちんと型を意識していることを力説した内容でした。
その後の問題としては、この読み換えが容易かどうかという部分だけになってきているように思います。

それにしても、アンチ var 派の人って多いんですね・・・^^;

ちなみに、コメントを読んでいて思ったのですが、僕のサンプルコードは、既存のソースコードを眺めた場合という前提がついています。
今回は、後になって読んだ時に、そのコードが var によって本当に難読化されてしまっているのかに論点を絞ってみたいと思います。

まずは、お馴染みのコードを少々改良してみました。


public void HogeHoge() {
  double a1 = this.GetAmount();
  this.SetAmount(a1);

  int a2 = this.GetAmount();
  this.SetAmount(a2);

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

  this.SetAmount(this.GetAmount());
}
private string amount;
private int GetAmount() { return 1; }
private void SetAmount(object value) { this.amount = value.ToString(); }


実行してみるまでもなく、問題無く動くことがわかるかと思います。
このコードを見た上で、もう一度、僕の言いたいことを繰り返しますと、a1, a2, a3 の型なんて、HogeHoge() メソッドの立場になって考えれば

どうでもいいこと

では無いでしょうか?

ここに int と明記する必要性は、僕には微塵も感じません。
あるいは、最初に double 型だったものが、後から GetAmount の戻り値を int に変更して、一部 double のまま修正し忘れてしまっているという場合もあるかもしれません(この時点で発見しにくいいバグですがなw)

これは、HogeHoge() メソッドにしてみれば、修正し忘れる行為自身「余計なこと」にはならないでしょうか?
HogeHoge() メソッドの役割は、GetAmount() から適切な値を受け取って、SetAmount() メソッドに渡すだけです。

以下のコードが GetAmount()から「何らかの値」という中間結果を受け取って SetAmount() に渡していると考えた場合、何らかの値の型を皆さんは意識しているのかどうか、と同義ではないでしょうか。


this.SetAmount(this.GetAmount());


さて、では次のコードを見て下さい。


private int unitPrice;
private int quantity;
:
private int GetAmount1() {
  return unitPrice * quantity;
}
private int GetAmount2() {
  var u = unitPrice;
  var q = quantity;
  return u * q;
}


GetAmount1 のような記述は許せて、GetAmount2 のような記述はすべきではないという明確な理由が僕にはわかりません。

次に、以下のコードです。


HogeHogeDataSet.ClientMaster a = new HogeHogeDataSet.ClientMaster();
System.Data.DataTable b = new HogeHogeDataSet.ClientMaster();
IDisposable c =  new HogeHogeDataSet.ClientMaster();


2~3行目の場合は型を明示しますが、1行目は迷わず var を使います。


HogeHogeDataSet.ClientMaster a = new HogeHogeDataSet.ClientMaster();
var a = new HogeHogeDataSet.ClientMaster();


これは、以下のように書く理由と全く同じです。


var i = 5;
var d = 2m;
for (var i = 0; i < count; ++i)


= の右辺で型を明確に表しているのですから、わざわざ以下のように記述する必要を感じません。


int i = 5;
decimal d = 2m;
for (int i = 0; i < count; ++i)


確かに上記が気持ち悪く感じた時期が僕にもありました。
しかし、そもそも for で使う i のような使い捨ての変数は、int とでもしておけばいいだろうという程度で型を選択しているのですから、そこに var と書くことに何の抵抗もある筈が無いのです。

#なんてことを書いてみるテスト・・・^^;

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

Feedback

# re: 暗黙的型付け(その3) 2007/12/27 14:41 επιστημη

> そもそも for で使う i のような使い捨ての変数は、int とでもしておけばいいだろうという程度で型を選択しているのですから、そこに var と書くことに何の抵抗もある筈が無いのです。

そ、そぉなのか!?
forで使うloop変数はiとでもしておけばいいだろうという程度で"名前"を選択してるんじゃないのか!?

単にcount回くるくる回りたいがために渋々変数iを使うんならvarで十分だけども、
そのiがloop内で(配列のindexなど)積極的に使われるのなら僕は型を明示したいっす。

# などと煽ってみるテスト ^^;

# re: 暗黙的型付け(その3) 2007/12/27 14:44 囚人

>このコードを見た上で、もう一度、僕の言いたいことを繰り返しますと、a1, a2, a3 の型なんて、HogeHoge() メソッドの立場になって考えれば
>どうでもいいこと
>では無いでしょうか?


オーマイガッ!
var 擁護派としてはその主張は戴けないッス。

私のブログにも書きましたが「var は人間にとっては型が明らか」であるべきです。ここで、「GetAmount() の結果が int になったり double になったりするから var にする」というのは var の使いどころとしては間違っていると断言しましょう。バグの元です。

# re: 暗黙的型付け(その3) 2007/12/27 14:48 シャノン

> ここで、「GetAmount() の結果が int になったり double になったりするから var にする」というのは var の使いどころとしては間違っていると断言しましょう。バグの元です。

わはは、菊池さんはまさにその理論でvarを擁護している。
面白いのぉ、面白いのぉw

# re: 暗黙的型付け(その3) 2007/12/27 14:50 アキラ

>for (var i = 0; i < count; ++i)
>確かに上記が気持ち悪く感じた時期が僕にもありました。

Rさん以外の不特定多数のひとが今でも気持ち悪いと感じています
(少なくてもコメント欄やトラックバック先では↑のfor文には反対意見しかないはずです)

チーム開発を行い、あなた以外の全員が↑のようなfor文に文句を言っても強行しますか?(コーディング規約で縛られない場合)

# re: 暗黙的型付け(その3) 2007/12/27 14:56 渋木宏明(ひどり)

>一部 double のまま修正し忘れてしまっているという場合もあるかもしれません(この時点で発見しにくいいバグですがなw)

前にも似たようなこと書いたけど、C# だとコンパイルエラーになるでしょ?

# re: 暗黙的型付け(その3) 2007/12/27 15:03 ghost_shell

>> そもそも for で使う i のような使い捨ての変数は、int とでもしておけばいいだろうという程度で型を選択しているのですから、そこに var と書くことに何の抵抗もある筈が無いのです。

>そ、そぉなのか!?
>forで使うloop変数はiとでもしておけばいいだろうという程度で"名前"を選択してるんじゃないのか!?

断定されていますが、少なくともこの部分はぼくもRさんの主張がわかりません。

# re: 暗黙的型付け(その3) 2007/12/27 15:20 R・田中一郎

επιστημη さん

>forで使うloop変数はiとでもしておけばいいだろうという程度で"名前"を選択してるんじゃないのか!?


と同じ程度のノリで、var と記述する訳ですよ^^;

>単にcount回くるくる回りたいがために渋々変数iを使うんならvarで十分だけども、
>そのiがloop内で(配列のindexなど)積極的に使われるのなら僕は型を明示したいっす。

index が float 型なら

for (var i = 0f; i < count; ++i)

と書いても、型を明示したことになりませんか?

と言ってみるテスト。

------------------------------------------------------
囚人 さん

>ここで、「GetAmount() の結果が int になったり double になったりするから var にする」というのは

その解釈は、僕が本来言いたいこととはちょっと違います。

僕としては、var は抽象的な型ではなくて、GetAmount() メソッドの戻り値の型に順ずるという解釈が正しいのです。
ですから、GetAmount() の戻り値が、何であろうと HogeHoge() メソッドとしては、ちまちま考えるまでも無いですよと言いたかったのです。
------------------------------------------------------
シャノン さん

>わはは、菊池さんはまさにその理論でvarを擁護している。

囚人さんへの返信に書いた部分の見解は、僕と菊池さんは一致している筈ですね。

>面白いのぉ、面白いのぉw

ええ、面白いですね。
こういう話題は、大好きです。

------------------------------------------------------
アキラ さん

>Rさん以外の不特定多数のひとが今でも気持ち悪いと感じています
>(少なくてもコメント欄やトラックバック先では↑のfor文には反対意見しかないはずです)

これは、論点が違うというものです。
菊池さんのお言葉を借りれば、これが僕のスタンスなのです。

ですから、

>チーム開発を行い、あなた以外の全員が↑のようなfor文に文句を言っても強行しますか?(コーディング規約で縛られない場合)

は強行する筈もありません。
しかし、僕がそれを決定できる立場にあるなら、間違い無く強行するでしょうね。

更に、最初はブーブー言っていたメンバーが、プロジェクトが完了した後に、for (var i = 0; ・・・と書くことを嫌っていたことを振り返って不思議に思う筈だと、そう思いますです。

------------------------------------------------------
渋木宏明(ひどり) さん

>前にも似たようなこと書いたけど、C# だとコンパイルエラーになるでしょ?

通りますよー

#不安になって確認してしまった^^;

------------------------------------------------------
ghost_shell さん

んじゃあ、

var i = 0;

が許せて

for (var i = 0;

が許せない理由とは、どんなものが挙げられますか?

# re: 暗黙的型付け(その3) 2007/12/27 15:34 アキラ

>これは、論点が違うというものです。
>菊池さんのお言葉を借りれば、これが僕のスタンスなのです。

コーディングスタイルが人それぞれなのは当然ですが、私の考えでは「より一般的な組み方」をするべきだと思うんですよ
その、より一般的な組み方をした上でそれぞれ組み方が違うなら私は何も口出ししません


>(少なくてもコメント欄やトラックバック先では↑のfor文には反対意見しかないはずです)

ここに書いたのは、varを使ったfor文は多くのひとから反対されているので、それは一般的なスタイルとは言い難いということです
(新しい概念を使ったコードだとしても)

for文は基本構文なので、それが人それぞれ違っていいのか?
嫌われてる文法を使い続けていいのか?
と思ってます

# re: 暗黙的型付け(その3) 2007/12/27 15:41 επιστημη

> index が float 型なら
> for (var i = 0f; i < count; ++i)
> と書いても、型を明示したことになりませんか?

なります。

が、僕は「作者の思いが伝わる」のを善しとしたいので
for ( float i = 0.0; i < count; i += 1.0 )
を好みます。

# re: 暗黙的型付け(その3) 2007/12/27 15:46 ghost_shell

>ghost_shell さん

>んじゃあ、

>var i = 0;

>が許せて

>for (var i = 0;

>が許せない理由とは、どんなものが挙げられますか?

Rさんの囚人さんに対するコメント より
>僕としては、var は抽象的な型ではなくて、GetAmount() メソッドの戻り値の型に順ずるという解釈が正しいのです。
>ですから、GetAmount() の戻り値が、何であろうと HogeHoge() メソッドとしては、ちまちま考えるまでも無いですよと言いたかったのです。

宣言された1行をとってみると
前者は型が決定していますよね?
後者は(ある程度わかるぐらいで)決定していませんよね?

ぼくは
var i = 0;
はOKではありません。(このコード一片に対してYES/NOを論じるのは愚のようにさえ思えてきます)

もっと言えばεπι先生のコメントの一部に反応しただけで、使用基準がはっきりしていないので完全支持ではないです。

# re: 暗黙的型付け(その3) 2007/12/27 15:46 囚人

>僕としては、var は抽象的な型ではなくて、GetAmount() メソッドの戻り値の型に順ずるという解釈が正しいのです。


あーなるほど。それは良い表現方法ですね。

# re: 暗黙的型付け(その3) 2007/12/27 15:59 ghost_shell

>> index が float 型なら
>> for (var i = 0f; i < count; ++i)
>> と書いても、型を明示したことになりませんか?

>なります。

>が、僕は「作者の思いが伝わる」のを善しとしたいので
>for ( float i = 0.0; i < count; i += 1.0 )
>を好みます。

配列(コレクション)操作目的のforとは別にすべきではないかと思います。
要素削除以外でコレクションを回す場合はforを使わなければいいじゃん。

っていう方向には なる? ならない?

# re: 暗黙的型付け(その3) 2007/12/27 16:08 επιστημη

> 要素削除以外でコレクションを回す場合はforを使わなければいいじゃん。

そぢゃなくてぇー 僕がいーたいのわぁ:
型推論によってコードに込められたプログラマの意図がボケる/薄まるようなら、僕はvarの使用を控えます。

# re: 暗黙的型付け(その3) 2007/12/27 16:11 囚人

>型推論によってコードに込められたプログラマの意図がボケる/薄まるようなら、僕はvarの使用を控えます。

至極もっとも。
どこで使うと人間が推論を強いられるか、なんですよねー。

# 暗黙的型付け じじいの心配 2007/12/27 16:20 えムナウ Blog

暗黙的型付け じじいの心配

# re: 暗黙的型付け(その3) 2007/12/27 16:33 R・田中一郎

アキラさん

>for文は基本構文なので、それが人それぞれ違っていいのか?

それについては、先ほど述べたことの繰り返しになってしまうのですが・・・

基本構文云々は関係なく、自分が一番素晴らしいと思った書き方を選択して書くだけの話です。
for 文に var を使うことは、それが選択した結果だから、そうするまでです。
しかし、否定派の人にコーディング規約の決定権があるなら、僕は何も言わずに int と明記するでしょう。

for (int i = 0; i < count; ++i)
for (var i = 0; i < count; i++)
Enumerable.Range(0, count - 1).Select(i => ・・・・

#そもそも var の主役となる変数の定義や、初期化も基本構文なんじゃ・・・(ry

------------------------------------------------------
επιστημη さん

>が、僕は「作者の思いが伝わる」のを善しとしたいので
>for ( float i = 0.0; i < count; i += 1.0 )
>を好みます。

うーん、さすがは epi さんですね。
このコードを見て、かなりぐらっと来たのですが、内緒にしておきます。

>型推論によってコードに込められたプログラマの意図がボケる/薄まるようなら、僕はvarの使用を控えます。

これは、全くその通りだと思います。

------------------------------------------------------
ghost_shell さん

>宣言された1行をとってみると

これは、どの部分にかかっていますか?

>var i = 0;
>はOKではありません。(このコード一片に対してYES/NOを論じるのは愚のようにさえ思えてきます)

これは異なことを^^;
for (var i = 0 の一片に対して YES/NO を論じてこられたことに対する返信だった訳ですが、僕は、この時点でghost_shell さんを愚などという失礼な印象を持ちませんでしたよ。

まあ、いいですけど・・・

------------------------------------------------------
囚人 さん

>あーなるほど。それは良い表現方法ですね。

そういう意味では、型推論って一番適当な表現ではあると思いますが、本当に推論している訳ではないので、ちょっとややこしい表現でもあるように感じます・・・

# re: 暗黙的型付け(その3) 2007/12/27 16:35 凪瀬

どのオーバーロードが呼ばれるかvarにお任せなのかー。
自分ならこういうケースはStrategyパターンのようなパラダイムで解決するのを好みますね。

型推論による型導出+オーバーロードってのは非常に不気味に思える。
戻り型の定義部分と、オーバーロードが連動してメンテされている保証の下でならアリかもしれない。

しかし、コードを治していないにもかかわらず、予期せぬオーバーロードに
処理が流れるように切り替わったことによるバグというのがありそうで怖い。
今の場合はSetAmountもGetAmountもthisに定義されるから大丈夫だとは思うけども。

# re: 暗黙的型付け(その3) 2007/12/27 16:40 R・田中一郎

凪瀬 さん

>どのオーバーロードが呼ばれるかvarにお任せなのかー。

Method の目的として、引数の型によって振る舞いを変えるべきではないという大前提が必要ですよね。

>戻り型の定義部分と、オーバーロードが連動してメンテされている保証の下でならアリかもしれない。

その場合なら、僕はジェネリクスを使う方を選択するかもしれません。

# re: 暗黙的型付け(その3) 2007/12/27 16:43 じゃんぬねっと

型についてはコンパイラに任せられるところは任せたいので明記して特にデメリットはないですよね。
それこそ元の意図を忘れたままで修正が等閑になる var の方がデメリットが多いと言えます。
var が絶対的にダメだとは言いませんが、積極的に置き換えられるところを使う理由がないとダメっすよ。
「これでもいいじゃないか」は理由としては弱いということです。

ところで、ここにいる人たち煽りすぎw
シャノン.Flag = true;

# re: 暗黙的型付け(その3) 2007/12/27 16:52 じゃんぬねっと

> Method の目的として、引数の型によって振る舞いを変えるべきではないという大前提が必要ですよね。

それでも予期しないオーバーロードに流れる可能性はあります。
引数のすべてが左に対して互換のある型でなければ良いのですが、そんなことを意識してオーバーロードを組む人は今のところいないと思います。

ありえるシナリオとしてはコードの手直し漏れで、

> しかし、コードを治していないにもかかわらず、予期せぬオーバーロードに
> 処理が流れるように切り替わったことによるバグというのがありそうで怖い。

まさにこの意見は私も同じくするところです。

# re: 暗黙的型付け(その3) 2007/12/27 16:55 じゃんぬねっと

> > 前にも似たようなこと書いたけど、C# だとコンパイルエラーになるでしょ?
>
> 通りますよー
>
> #不安になって確認してしまった^^;

これは、たぶんひどりさんは逆の場合を想定して心配しているのだと思います。

# re: 暗黙的型付け(その3) 2007/12/27 17:15 R・田中一郎

>型についてはコンパイラに任せられるところは任せたいので明記して特にデメリットはないですよね。

逆に・・・
型についてはコンパイラに任せられるところは任せたいので明記せずとも特にデメリットはないですよね。
とは言えませんか?

>それこそ元の意図を忘れたままで修正が等閑になる var の方がデメリットが多いと言えます。

忘れたままというより、意識する必要のないという表現が僕の主張に準ずるところではないかと。

>var が絶対的にダメだとは言いませんが、積極的に置き換えられるところを使う理由がないとダメっすよ。

var と記述することは置き換えではなくて、意識する必要がないことを明記するための手法の一つだと思っている訳です。

>「これでもいいじゃないか」は理由としては弱いということです。

逆に、皆さんが型を明記しなければいけないことを主張される理由もわからないのです。
元記事の「GetAmount1 のような記述は許せて、GetAmount2が許せない・・・」の部分の納得できる説明を誰かにお願いしたいです。

>それでも予期しないオーバーロードに流れる可能性はあります。

僕はメソッドは一つの振る舞いをすべきだと言う前提に置いてオーバーロードによる流れの危険性を懸念する必要は無いと書きました。
懸念されるバッドケースは、どのようなものなのかが想像できません。

>これは、たぶんひどりさんは逆の場合を想定して心配しているのだと思います。

ん?
逆とは一体・・・

# re: 暗黙的型付け(その3) 2007/12/27 17:22 アクア

なんか実践的ではない印象を受けた。

# re: 暗黙的型付け(その3) 2007/12/27 17:29 アキラ

>逆に、皆さんが型を明記しなければいけないことを主張される理由もわからないのです。

これは逆でしょう。varは新しくでた概念なので
「今まで型を明記してたのに、なんでvarで書く必要があるんだ」
が正しい

「varをなんで型に直さないといけないんだ」ではない

# re: 暗黙的型付け(その3) 2007/12/27 17:31 じゃんぬねっと

> 逆に・・・
> 型についてはコンパイラに任せられるところは任せたいので明記せずとも特にデメリットはないですよね。

いや皆さんデメリットを言っていますよ。
可読性について主に、ですが。

> 忘れたままというより、意識する必要のないという表現が僕の主張に準ずるところではないかと。

あれば無茶なことをやる実装者がいます。
私がどうこうではなく周りを考えての意見です。

> 逆に、皆さんが型を明記しなければいけないことを主張される理由もわからないのです。

何度も説明されていると思います。

> index が float 型なら
> for (var i = 0f; i < count; ++i)
> と書いても、型を明示したことになりませんか?

あとは上記の件があるので、どうにも主張が一貫せず混乱中です。

> 懸念されるバッドケースは、どのようなものなのかが想像できません。

同じ数の引数前提だとありえないかもしれませんね。
直し漏れ前提かな...

> 逆とは一体・・・

アップの反対はダウン。
ダウンの反対はアップ。

時間がないので端的ですが、とりあえず帰宅します。

# re: 暗黙的型付け(その3) 2007/12/27 17:35 シャノン

> これは逆でしょう。varは新しくでた概念なので
> 「今まで型を明記してたのに、なんでvarで書く必要があるんだ」
> が正しい

今までは型推論がサポートされていなかったからしぶしぶ明記していただけで、できるものなら昔からずっとvarって書きたかったんです。

ってどこかで書いてたの誰だっけ? 追いきれてないw

# re: 暗黙的型付け(その3) 2007/12/27 17:39 アキラ

囚人さんですね

# re: 暗黙的型付け(その3) 2007/12/27 17:47 囚人

超後付けですけどね。
ホントはそんな事思ってるわけないけど、アキラさんの問いにはそう答えるしかない。

断っておくと、int を var に置き換える事は自分はないと思います。ただそこまで排除する理由もないという事で var 賛成派になってます。

# re: 暗黙的型付け(その3) 2007/12/27 17:51 ghost_shell

>逆に、皆さんが型を明記しなければいけないことを主張される理由もわからないのです。
>元記事の「GetAmount1 のような記述は許せて、GetAmount2が許せない・・・」の部分の納得できる説明を誰かにお願いしたいです。

いろいろなケースをひとくくりにして、「使うべき」としているからじゃない?
少なくともコメントしている「皆さん」は新しい技術に興味があり、理解した上で、だと思います。

ここまできたから言うと、Rさんの答えには「どちらの書き方も受け入れられるから、今まで書いてきたorマジョリティーで書こう。」という発想は無いのかしら。

#強めに出てみるテスト

# re: 暗黙的型付け(その3) 2007/12/27 18:12 アクア

> Rさんの答えには「どちらの書き方も受け入れられるから、今まで書いてきたorマジョリティーで書こう。」という発想は無いのかしら。

いや、むしろその気があるからこそ、極論をぶつけているだけだと思う。

# re: 暗黙的型付け(その3) 2007/12/27 18:24 R・田中一郎

アクア さん

>なんか実践的ではない印象を受けた。

ならば、使わない方がいいでしょうね^^;
なるほど、と思える部分があって使うのが理想的ですね。

-----------------------------------------------------
アキラ さん

>「今まで型を明記してたのに、なんでvarで書く必要があるんだ」

なるほど、言われてみれば一部の方は反論理由になっているように思います。

しかし、

HogeHogeHogeHoge hoge = new HogeHogeHogeHoge();

と毎回書くのが煩わしいので、

dim hoge = new HogeHogeHogeHoge();

と書ければいいのにな、と思っている人は多かったんじゃないでしょうかね。
そして、そう思う人にとっては、「このように書けなかったから、やむを得ず型を明記していた」となりませんか?

-----------------------------------------------------
じゃんぬねっと さん

>可読性について主に、ですが。

今思い出しましたが、この記事は、そもそも可読性が落ちることに対する反論がテーマでした。
そして、僕の反論した内容が論破されているとは思えない訳です。
(これは、個々人のプログラミングスタイルを変えるべきだという主張では無いです)

>あれば無茶なことをやる実装者がいます。

上記は、「意識する必要の無い部分があるとすれば」という言葉が前に付きますか?

>私がどうこうではなく周りを考えての意見です。

この表現は、少々ずるいように感じました。
少なくとも僕は周りを考えるという前提で話はしていませんでしたから。

無茶な実装をする恐れがある人がいるために var の使用を制限するという規則があるなら、それに従う旨はアキラさんへの返信でも明記した通りです。
プログラマー個人として var という表現を許容できるか否かという論点に止めないと、収集がつかなくなる恐れがありませんか?

>あとは上記の件があるので、どうにも主張が一貫せず混乱中です。

主張に一貫性がない部分を明示していただけると助かります。

>> 懸念されるバッドケースは、どのようなものなのかが想像できません。
>
>同じ数の引数前提だとありえないかもしれませんね。
>直し漏れ前提かな...

引数の数が違うという理由では、型推論によって暗黙のうちにオーバーロードによって意図しない経路を辿ることの直接的な原因にはならないかと思ったのですが・・・

>アップの反対はダウン。
>ダウンの反対はアップ。

なるほど。
であれば納得です。
僕のサンプルで戻り値の型を int にした理由でもありますから。

>時間がないので端的ですが、とりあえず帰宅します。

お疲れ様でした。

-----------------------------------------------------
シャノン さん

>今までは型推論がサポートされていなかったからしぶしぶ明記していただけで、できるものなら昔からずっとvarって書きたかったんです。

おおっ、僕と同じ意見だっ!

-----------------------------------------------------
ghost_shell さん

>ここまできたから言うと、Rさんの答えには「どちらの書き方も受け入れられるから、今まで書いてきたorマジョリティーで書こう。」という発想は無いのかしら。

もう少しきちんと議論しませんか?
例えば、僕が前にした質問ですが、

var i = 0;
for (var i = 0;


前者が許せて後者が許せない理由は?、と聞くと、型推論にそもそも反対だったと仰る。
ならば、var i = 0; という書き方が、何故許容できないのかについて語ることが本筋です。
僕の発想に対する否定的な書き込みをすることは、この議題に何か関係があるのでしょうか?

# re: 暗黙的型付け(その3) 2007/12/27 18:44 無記名

>HogeHogeHogeHoge hoge = new HogeHogeHogeHoge();
>
>と毎回書くのが煩わしいので、
>
>dim hoge = new HogeHogeHogeHoge();
>
>と書ければいいのにな、と思っている人は多かったんじゃないでしょうかね。

これからなぜfor (int i = 0; ...までfor (var i = 0; ...と積極的に記述するような考えになるかが分かりません。
上のケースではvarを使うのもありでしょうが、下のケースはどっちも3文字です。
ならばより記述的なほうを選ぶのはプログラマとして当然だと思いますが。

# re: 暗黙的型付け(その3) 2007/12/27 19:05 無記名

あー、なんとなく主張したいことが分かったような気がします。
極論、リテラルは型と強く結びついてるんだから、型を明示するなんてDRYの原則に反している。だからvarのほうがいい!
って感じですかね。

# re: 暗黙的型付け(その3) 2007/12/27 19:07 ghost_shell

逆に質問すると
「int型だから書かなくていい(コメントを見ていてそう判断しました) 0(型の決まっている定数)」 と、「型が宣言部に依存するメソッドの戻り値」をなぜ一緒にして議論するのですか?

もちろんコンパイル/ビルド前には型は決まるので同じですが、書き手の目的が違うのでは?

質問に対するコメントは整理できてからにさせてください。

------------------------------
アクアさん

>> Rさんの答えには「どちらの書き方も受け入れられるから、今まで書いてきたorマジョリティーで書こう。」という発想は無いのかしら。

>いや、むしろその気があるからこそ、極論をぶつけているだけだと思う。

そうだと思って最初はスルーしました。
でもね。長引いているので、ネタではなく本気なのか、と。

# re: 暗黙的型付け(その3) 2007/12/27 19:12 なか-chan

HogeHogeHogeHoge hoge = new();
って書ければいいと思うことはあります。

varは使ったことないんですが、VBのVariantのような
ものをイメージするので、ちょっと動作が思い通りに
ならない気が...。
intで初期化してstringを入れられないんですよね?
インテリセンスはどうなるんだろう?

# re: 暗黙的型付け(その3) 2007/12/27 19:24 無記名

HogeHogeHogeHoge hoge = new();
だと、
void Method(HogeHogeHoge h) ...
なメソッドで
Method(new());
となってこれはこれで微妙な感じが。
極端な話、
Method(new(), new(), new());
とかなるわけですし。

# 型議論 2007/12/27 19:30 "ウェブ100" は "GSP.NET GJAX!"に変わり

型議論

# ソースの可読性 2007/12/27 19:43 ひよっこプログラミング

ソースの可読性

# re: 暗黙的型付け(その3) 2007/12/27 19:59 R・田中一郎

無記名 さん

>極論、リテラルは型と強く結びついてるんだから、型を明示するなんてDRYの原則に反している。だからvarのほうがいい!

はい。その通りです。

Hoge hoge = new Hoge();
float f = 0f;

は、型推論が可能な場面では、型を明示している部分が2ヵ所になります。

double f = 0f;

のように書くなら明記することは有効でしょうけれど・・・

詳細は、明日まとめようと思います。
良かったら、また覗きに来てやって下さい^^;

-------------------------------------------
ghost_shell さん

>逆に質問すると

困りましたね。
質問に質問で返したら、議論は平行線のままです。
ということで僕の方で折れることにしましょう。

>「int型だから書かなくていい(コメントを見ていてそう判断しました) 0(型の決まっている定数)」 と、「型が宣言部に依存するメソッドの戻り値」をなぜ一緒にして議論するのですか?

そもそも、この場の議題は、じゃんぬねっとさんへの返信にも、この記事にも書いてある通り、var を使っても可読性は落ちませんよね?、という内容です。
そのテーマの上で上記の2つを取り上げているに過ぎません。

これが質問に対する回答です。納得していただけたでしょうか?

# re: 暗黙的型付け(その3) 2007/12/27 20:01 青柳 臣一

# 本スレはここですか?w

「var の乱用は危険」 そう思っていた時期が私にもありましたw
やっぱり、型を明示しないのは気持ち悪いし、読みにくくなると思ってたんですね。
けど、実際にコードを書いたり見たりしてて 「var で問題ないじゃん」 と思えるようになっちゃって結構使うようになりました。
ローカル変数の宣言はほとんど var って書いちゃってるかもw

# re: 暗黙的型付け(その3) 2007/12/27 20:15 とりこびと

ちょっと気になったので確認させてください。

その2を書いたときととその3を書いたときでは考え方が変わったという認識でよろしいでしょうか?

# re: 暗黙的型付け(その3) 2007/12/27 22:23 アキラ

>そう思う人にとっては、「このように書けなかったから、やむを得ず型を明記していた」となりませんか?

なりませんね
静的言語では型を明示的に書くのが正しい

だからこそvarが追加されたことで使いどころをみんなで議論してるんでしょう



では囚人さんに対して書いた質問をRさんにも問います

このコードで
for(var i = 0; i < 10; i++)

「わざわざintと書く必要があるの?」 と言われたら
「じゃあ今までわざわざintと書いてたの?」と私は聞き返します

そのとき、「型推論がなかったから仕方なくintを書いていた」と本当に言えますか?

それは、静的言語の静的言語らしさがイヤだったことになりませんか?

# re: 暗黙的型付け(その3) 2007/12/27 23:39 アキラ

※上記の質問はとりあえずはfor(var i = 0についてです

# XSDはどうですか 2007/12/28 0:16 Ognacの雑感

XSDはどうですか

# XSDはどうですか 2007/12/28 0:17 Ognacの雑感

XSDはどうですか

# re: 暗黙的型付け(その3) 2007/12/28 0:44 シャノン

> それは、静的言語の静的言語らしさがイヤだったことになりませんか?

そう。そうと言えばそうになるんだろうと思っていた。
菊池さんのあれも、「じゃあ動的言語使えばいいじゃん」と言おうとして思いとどまってた。

# re: 暗黙的型付け(その3) 2007/12/28 1:21 ゆうじ1982

どちらにすべきと言う話ではないのですが、現実的に作業する場合、
「varは使えるとこは全部使え」の方が現時点では好きです。

ソースだけの話じゃないので、論点が違えばすみません。

・VS、コンパイラが頭いい。
・ローカル変数は極力減らす
・少人数での開発が多い
・単体テストに頼る。(おまけ:追うソースが減るって程度の意味です)
と言う事情も含めてしまいます。

数本の業務開発で実践しただけの感想ですが、
少なくとも、その数本の開発内容では
使ったほうが生産性が高いように感じました。

『タイプ数が減る。』

一番の理由はこんなんですが……

# re: 暗黙的型付け(その3) 2007/12/28 8:35 アキラ

C#のインテリセンス使ってるのに、そんなにタイプ数減りますか?

# re: 暗黙的型付け(その3) 2007/12/28 9:08 アキラ

>今思い出しましたが、この記事は、そもそも可読性が落ちることに対する反論がテーマでした。
>そして、僕の反論した内容が論破されているとは思えない訳です。

これは、Rさんのいう根拠に納得してないから反論してるんだと思います


>(これは、個々人のプログラミングスタイルを変えるべきだという主張では無いです)

でも、不特定多数の人が見るブログという場でそれを使う有効性を語っていたでしょう
ならばそれは普及活動と取られてしまうこともあるでしょう
個人のスタイルに収まらない部分が出てくるのではないですか?

飽くまで個人のスタイルだから推奨してるわけではないというのであれば、それは初めに断わっておくべきではないですか?

# re: 暗黙的型付け(その3) 2007/12/28 10:36 R・田中一郎

青柳 臣一 さん

># 本スレはここですか?w

本スレかどうかはわかりませんが、着火したのは間違いなく僕です^^;

>「var の乱用は危険」 そう思っていた時期が私にもありましたw

はい、僕もそんな時期がありましたっけ。
今思えば何もかもが懐かしいです。

--------------------------------------------------------------
とりこびと さん

>その2を書いたときととその3を書いたときでは考え方が変わったという認識でよろしいでしょうか?

一緒です。
ただ、一部誤解を招くかな、と思う点はありましたけれども、その3の方が明確に表現しているので、こちらの認識だと受け取って下さい。

--------------------------------------------------------------
アキラ さん

>静的言語では型を明示的に書くのが正しい

var は明示していませんが、明確ではありますね。

>そのとき、「型推論がなかったから仕方なくintを書いていた」と本当に言えますか?

前回の返答で、既に言えると明記しました。

>それは、静的言語の静的言語らしさがイヤだったことになりませんか?

これも繰り返しになってしまいますが、静的言語は int のように型を明記する言語でなければいけないという定義がそもそも間違っています。
var i = 0; と書くことで int i = 0; と書いたことと同じ、つまり型の表現が違うというだけの話で、型が動的に変わる訳でも、抽象化している訳でもありません。

--------------------------------------------------------------
シャノン さん

>菊池さんのあれも、「じゃあ動的言語使えばいいじゃん」と言おうとして思いとどまってた。

その辺りは「何がしと同じ型」という型が、そこに確かに存在しているという意味で、動的言語との違いがあるのです。

--------------------------------------------------------------
ゆうじ1982 さん

>『タイプ数が減る。』
>
>一番の理由はこんなんですが……

揃うというのもあります。

var i = 0;
var c = new HogeHoge();

# re: 暗黙的型付け(その3) 2007/12/28 11:11 R・田中一郎

なか-chan さん

>HogeHogeHogeHoge hoge = new();
>って書ければいいと思うことはあります。

この表現は、規定のコンストラクタでオブジェクトを生成するというイメージがしやすいですね。

>varは使ったことないんですが、VBのVariantのような
ものをイメージするので、

はい、こちらのイメージが先行してしまっているような気がします。

>intで初期化してstringを入れられないんですよね?

そうですね。

var i = 0;

と表現した時点で、 i は int 型ということになります。

>インテリセンスはどうなるんだろう?

int i = 0;

と書いたのと同様に振る舞われますね。

# re: 暗黙的型付け(その3) 2007/12/28 11:27 ghost_shell

少し間が空きました。
コメントID:115012, 115036

>>逆に質問すると

>困りましたね。
>質問に質問で返したら、議論は平行線のままです。
>ということで僕の方で折れることにしましょう。

>>「int型だから書かなくていい(コメントを見ていてそう判断しました) 0(型の決まっている定数)」 と、「型が宣言部に依存するメソッドの戻り値」をなぜ一緒にして議論するのですか?

>そもそも、この場の議題は、じゃんぬねっとさんへの返信にも、この記事にも書いてある通り、var を使っても可読性は落ちませんよね?、という内容です。
>そのテーマの上で上記の2つを取り上げているに過ぎません。

>これが質問に対する回答です。納得していただけたでしょうか?

別に話を逸らしたいのではありません。
論点が違うことはこれまでの中ではっきりとわかりました。
提案する形であれば受け入れるのですが、主に断定している箇所で納得できない部分があります。

回答についてですが、引用部分8行目で議題とは違うと言われている以上、質問の観点を変えることにします。

-----------------------------

たびたび「明確」という言葉が出ています。

  例(115173の R さん の アキラ さん への返答)
  >>静的言語では型を明示的に書くのが正しい
  >
  >var は明示していませんが、明確ではありますね。

一意に決まりますし、コード全体、参照アセンブリの中に定義がありますが、どういう意味で「明確」というのが気になります。
#それ以外に「明確」としている根拠ってありますか?

#結局、これは
#>>「int型だから書かなくていい(コメントを見ていてそう判断しました) 0(型の決まっている定数)」 と、「型が宣言部に依存するメソッドの戻り値」をなぜ一緒にして議論するのですか?
#の言い換えに過ぎないのですが・・・

# re: 暗黙的型付け(その3) 2007/12/28 11:33 とりこびと

>一緒です。

了解です。
引っかかったのはココだったんです。

>System.Data.DataTable b = new HogeHogeDataSet.ClientMaster();
>IDisposable c = new HogeHogeDataSet.ClientMaster();

この部分についてはRさん自身επιστημηさんのところでコメントされていたのを見ているのでそういうことなんだろうとは思っていますが、
このブログだけ見ると「var使ってないやん!使えるとこなのに!!」って読んじゃいました。

「使えるとこ」ってのは「記述できる限り」ではなく「明示的に型を書く必要がない限り」ってことで合っています?

# re: 暗黙的型付け(その3) 2007/12/28 11:46 R・田中一郎

ghost_shell さん

>一意に決まりますし、コード全体、参照アセンブリの中に定義がありますが、どういう意味で「明確」というのが気になります。

記述している時点で、型は明確であるという意味ですね。

var i = GetValue();

と書いた場合でも i という型が決まっていない訳ではなく、この場に表記されていないだけですよね。

#僕が for で var を使う理由は、本日のエントリーで詳細を書きます。

---------------------------------------------------------------
とりこびと さん

>「使えるとこ」ってのは「記述できる限り」ではなく「明示的に型を書く必要がない限り」ってことで合っています?

そうですそうです。

HogeHoge x = new HogeHoge();

なら

var x = new HogeHoge();

と書きますが、

object x = new HogeHoge();

のように書く必要があるなら勿論そうします。

# re: 暗黙的型付け(その3) 2007/12/28 12:21 ghost_shell

Rさん

varは型セーフであるけれども修正に対してはどうなのかな? と思うんですよ。
(先程とは違うと思うかもしれませんが、これもまたぼくの意見です。)

>>「使えるとこ」ってのは「記述できる限り」ではなく「明示的に型を書く必要がない限り」ってことで合っています?
>そうですそうです。
>HogeHoge x = new HogeHoge();
>なら
>var x = new HogeHoge();
>と書きますが、
>object x = new HogeHoge();
>のように書く必要があるなら勿論そうします。

そういうものの、よくよく考えてみると、必要なケースって少なくありませんか?

インターフェースで受け取ろうと思ったときに、すでにインターフェースで引数、戻り値が定義してあった場合どうしますか?

# re: 暗黙的型付け(その3) 2007/12/28 13:13 R・田中一郎

>varは型セーフであるけれども修正に対してはどうなのかな? と思うんですよ。

例えば、どのような場合でしょうか?

>そういうものの、よくよく考えてみると、必要なケースって少なくありませんか?

Control[] a = { new Button(), new Button() };
foreach (var x in a) x.Visible = false;

とかですね。

>インターフェースで受け取ろうと思ったときに、すでにインターフェースで引数、戻り値が定義してあった場合どうしますか?

ご質問の意味がわかりませんでした。
もう少し詳しくお願いできますか?

# re: 暗黙的型付け(その3) 2007/12/28 13:46 ghost_shell

>>varは型セーフであるけれども修正に対してはどうなのかな? と思うんですよ。

>例えば、どのような場合でしょうか?

初期化子を変えて別の型になっても気づかなくはない?(特に数値型)
それって従来の型セーフとは違う危険があるのでは?
と思います。
少なくとも「intでもvarでもいいよね?」という内容に対してはintで書くことの安全性があると思います。

>Control[] a = { new Button(), new Button() };
>foreach (var x in a) x.Visible = false;

>とかですね。

コレクションは忘れていました。
コレクションではない変数について「ここインターフェース・抽象クラスに出来るからしよう。」以外は全てvarで書く(ことになる)イメージでよろしいですか?

>>インターフェースで受け取ろうと思ったときに、すでにインターフェースで引数、戻り値が定義してあった場合どうしますか?

>ご質問の意味がわかりませんでした。
>もう少し詳しくお願いできますか?

IEnumerable<T>, IList<T>で返すオブジェクトに対してどの型で捕捉しますか、ってことなんだけど、ローカル変数の型なのでこの質問はたいした質問ではないです。

要はこのルールの詳細についてどうなるのかな?と思ったわけです。

# re: 暗黙的型付け(その3) 2007/12/28 14:02 シャノン

> 初期化子を変えて別の型になっても気づかなくはない?(特に数値型)

初期化しに自動追従してくれるメリットがある、とは菊池さんの弁ですね。

# re: 暗黙的型付け(その3) 2007/12/28 14:03 シャノン

ところでこの記事、URLが愉快なことになってます。

# re: 暗黙的型付け(その3) 2007/12/28 14:14 シャノン

> ところでこの記事、URLが愉快なことになってます。

失礼。勘違いでした。

.Textって、記事IDさえあってれば、日付は適当でもいいんだね。
http://blogs.wankuma.com/rti/archive/2011/13/32/114850.aspx

# re: 暗黙的型付け(その3) 2007/12/28 14:52 ghost_shell

>> 初期化子を変えて別の型になっても気づかなくはない?(特に数値型)

>初期化しに自動追従してくれるメリットがある、とは菊池さんの弁ですね。

ぼくは、
  Rさんがたまたま型がintだったオブジェクトに対してintを書く(名乗らせる)のはおかしい
と言っているものとして、
  (varではなくintと書いた場合に比べて)後からlongなどに簡単に変えられるけどOKなの?
という意味合いで言いました。

ぼくは「1つの値型になってしまうけど、数値全般で使いたいような場面」と「intしか入らない場面」を分けて考えたくて、前者でvarを使ってみたい、という意見です。

ちなみに過去のエントリで以下のことの書いていますが、今回の一連の主張とは話は別です。冗談半分だし。

http://blogs.wankuma.com/gshell/archive/2007/11/06/WhatAEnviableBother.aspx

--------------------
>> ところでこの記事、URLが愉快なことになってます。

>失礼。勘違いでした。

>.Textって、記事IDさえあってれば、日付は適当でもいいんだね。

114850 = 「いいよはゴー 」かと思いました。

# re: 暗黙的型付け(その3) 2007/12/28 15:51 シャノン

> ぼくは「1つの値型になってしまうけど、数値全般で使いたいような場面」と「intしか入らない場面」を分けて考えたくて、前者でvarを使ってみたい、という意見です。

菊池さんと同じですね。
菊池さん用語で言えば、前者が真理で、後者が仕様です。

そういえば、ghost_shell さんのブログは記事IDが数字じゃないんですね。

# re: 暗黙的型付け(その3) 2007/12/29 11:00 R・田中一郎

ghost_shell さん

>初期化子を変えて別の型になっても気づかなくはない?(特に数値型)

確かに一理ありますし、懸念するべき事柄だと思います。
しかし、僕としては、これは慣れの問題だと結論付けたいと思います。

var f = 0f;

のように var を書く場合、= の右側の型に準ずる訳です。
0f で float 型だと定義している訳です。
1文字間違えたらアウトというのは、仮に2つの酷似した型名があった時に間違え易いという理屈に近い気がしました。

>コレクションではない変数について「ここインターフェース・抽象クラスに出来るからしよう。」以外は全てvarで書く(ことになる)イメージでよろしいですか?

全てにはならないかも知れません。
例えば、あるメソッドの振る舞いにとって、型が重要である場合は型を明記することがあるかもしれません。
しかし、その場合の具体例が、今は思い浮かびませんけれど。

>要はこのルールの詳細についてどうなるのかな?と思ったわけです。

使う側としては、

var collection = this.GetList<int>(HogeCode);

ですよね?

>Rさんがたまたま型がintだったオブジェクトに対してintを書く(名乗らせる)のはおかしい
>と言っているものとして、
>  (varではなくintと書いた場合に比べて)後からlongなどに簡単に変えられるけどOKなの?
>という意味合いで言いました。

微妙に違います。

private void Method(bool flag) {
  var a = flag ? this.Amount1 : this.Amount2
  this.SetAmount(a);
}

フィールド変数の型ですが、これは「ある型」が定義されています。
上記の場合は、Method() にとっては「ある型」として振舞ってもいいでしょうと言う考え方ですね。
フィールド変数の型が簡単に変えられることは、決して悪いことじゃないです。
適切に変更できれば、それに越したことはありません。

>ぼくは「1つの値型になってしまうけど、数値全般で使いたいような場面」と「intしか入らない場面」を分けて考えたくて、前者でvarを使ってみたい、という意見です。

前者の場合は、型を抽象化しています。
つまり var は型を抽象的に考えるために用いるべきもの、という考え方を持っている人が、今回の僕の主張に反論されている方になっていますね。
でも、僕は始終一環して var も型が明確で、慣れてしまえば型があることがわかると言っています。
これは型を抽象的に考えている訳ではなくて、記述上の問題として var と書くだけの話です。

----------------------------------------------------------------------
シャノン さん

>初期化しに自動追従してくれるメリットがある、とは菊池さんの弁ですね。

僕としては、代入する型に依存した型という解釈に近いですね。

>菊池さん用語で言えば、前者が真理で、後者が仕様です。

ただ、仕様が変わるかもしれないから var にしておこうというのは、僕とはちょっと違うかもしれません。
付加価値として、そういうものがあるのは確かですが、実際のところ var なんて単なる便利な記法でしかない気がします。
その記法の便利さ以上でも、それ以下でも無いです。

# thanks for the postmishertAtroro 2010/11/09 0:35 Phlebotomy Certification

Useful blog website, keep me personally through searching it, I am seriously interested to find out another recommendation of it.

# Good locale, like the color 2010/12/06 6:33 Signed Baseball

Such a usefule blog…whoa

--------------------------------------------
my website is
http://toclimb.org

Also welcome you!

# Hi,glad to know everybody here! 2011/07/10 3:33 beatsdrea8

Hi,happy to know everyone here for the very first time! It's good forum, I was searching for something like this particular.

タイトル  
名前  
Url
コメント