むりせず♪なまけず? ~ぷろくらすてぃねいたーの言い訳雑記~

よた ときどき .NET  by 刈歩 菜良 CTP

目次

ニュース

C# VB.NET掲示板
C#, VB.NET 掲示板

わんくま同盟ブログ
わんくま同盟ブログ

Web アプリケーションを簡単編集できる無償ツール WebMatrix ダウンロードはこちら

あわせて読みたい

日記カテゴリ

書庫

Blog 利用状況

バグを少なくシンプルに!C#言語仕様に隠された意図

ネタ元:お前に訊きたい!

コメントで書いていたのですが、長くなったり、古かったりで記事に切り替えました。

?

C#では静的なメソッドにアクセスするには、クラス名.メソッド名()というように、クラス名を使ってアクセスする必要があります。C++のようにインスタンス変数を使ってアクセスすることはできません。

これはいわゆるバグ対策だと私は解釈しています。

インスタンス変数からスタティックメソッドのアクセスを許可するのは簡単な話だとおもうのですが、そうすると、ソースコードを見ただけでは呼び出しているメソッドがスタティックなのか、そうではないのか判断つかなくなるんです。

クラス(インスタンス)の利用者に「staticメソッドってことを重々承知で使ってます。」って認識させる意味もあります。
通常のメソッドと勘違いして、うっかりstaticメソッド呼び出しをしてしまって、すべてのインスタンスに影響が出てしまったというバグを避けるためではないかと私は解釈しています。

この考え方ってC#の仕様ではあちこちにでてて、たとえば、参照渡しをするときもメソッド利用側で引数にrefつけなきゃいけないとかっていうのも、同様の理由からだと思います。

ifの条件にbool型しか使えないのも、switch caseでフォールスルーがエラーになるのもバグ対策です。

他の言語経験者からすると最初は冗長で面倒くさく感じるかもしれませんが、すべては言語仕様でバグを発生しにくくしているのだと私は解釈しています。

結局コストと時間が一番かかるのがデバッグ・テスト・メンテナンスなので...

あと、シンプルっていうのは、例えばC++にある->や::はすべて.に一本化されたとか、ポインタを排除したとか、多重継承を禁止したとかということです。これらも結局は言語仕様でバグを発生しにくくしようということだと私は解釈しています。
(注)::はなくなったわけではないですけどね。->はマネージドコードでは使えませんね(unsafeなら可)。

宿題忘れてませんよー!
今日中に提出しまーす。

う~、ひとつもぼけれんかった。
Torikobuta にケチョンケチョンに言われる~~~。

さて問題です。
1.私は何回「私は解釈しています。」と書いたでしょう?
2.なぜその台詞を連発したのでしょう?

投稿日時 : 2007年11月7日 13:51

Feedback

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2007/11/07 14:36 επιστημη

わかるわかるすごくわかる。

カラスに対して「お前の色は?」と訊けないわけだな。
「んなもん知らネーヨ。カラスに訊いてくんな」
ってお前カラスぢゃねーのかよ!?

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2007/11/07 16:58 とりこびと

けちょんぬけちょんぬ。

# ねーねー、そこの日本人さん。日本人って何人いるん? 2007/11/07 20:55 むりせず♪なまけず? ~ぷろくらすてぃねいたーの言い訳雑記~

ねーねー、そこの日本人さん。日本人って何人いるん?

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2007/11/07 21:06 刈歩 菜良

コメント長くなったので、また記事にしちゃいました。
# 実は1日に複数の記事上げるの初めて...
# 何となく避けてました。

επιさん
> カラスに対して「お前の色は?」と訊けないわけだな。
> 「んなもん知らネーヨ。カラスに訊いてくんな」
> ってお前カラスぢゃねーのかよ!?

この場合カラスはインスタンス?クラス?
あっ、両方か!!
# 初心者の方がよくやる、Buttonクラスのインスタンス名をButtonにしちゃうとか。(違っ

とりこびとさん
> けちょんぬけちょんぬ。
あれ~、torikobutaさんぢゃなくって、とりこびとさんにけちょぬけちょぬされたー。
(・o・)

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2007/11/08 9:06 かずくん

C++で、グローバル関数にスコープ解決演算子(::)をつけて、
クラスのスタティックメソッドと区別するイディオムをみて、目からアレが落ちた。のを思い出した。

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2007/11/08 11:00 Gushwell

># 初心者の方がよくやる、Buttonクラスのインスタンス名をButtonにしちゃうとか。

Person person = new Person();
これ(クラスとインスタンス名が大文字小文字の違いしかない)って、初心者にはものすごく混乱するみたいです。
そういう意味で、
TPerson person = new TPerson(); (Delphi流)
CPerson person = new CPerson(); (VC++流?)
の方が、ベターだと思うのは僕だけ?



# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2007/11/08 11:48 刈歩 菜良

かずくん
> C++で、グローバル関数にスコープ解決演算子(::)をつけて、

C#でもglobal::なんちゃら名前空間 みたいな感じで使いますね。

Gushwellさん
> これ(クラスとインスタンス名が大文字小文字の違いしかない)って、初心者にはものすごく混乱するみたいです。

そうですよね。バグを作ってっていわんばかりですよね。
しかも、VBにやさしくなくなっちゃいますし...

> TPerson person = new TPerson(); (Delphi流)
> CPerson person = new CPerson(); (VC++流?)
> の方が、ベターだと思うのは僕だけ?
ここら辺は趣味の範疇だったり、それまでの言語経験に寄ったりするところですよね。

わたしの好みはクラスはシンプルかつ汎用的な名前で、インスタンスの方にある程度インスタンスの位置づけ的な名前をつけたりします。
例えば、
Person tmpPerson = new Person();
という感じでしょうか。

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2007/11/08 18:40 Gushwell

その言語の流儀に合わせるのが僕の主義なので、C#で、
TPerson や CPersonっていう名前は実際にはつけないです。
でも、他の人のソースで
Moge.HogeHoge();
なんてのが出てくると、Mogeってクラス名? プロパティ名?って悩む自分がいます。

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2007/11/08 20:56 刈歩 菜良

Gushwellさん
> その言語の流儀に合わせるのが僕の主義なので、
わたしもMSの指針に従う派です。
# もちろん、立場上そうしなければいけないというのもありますが、そうじゃなくてもそうしてました。

> Mogeってクラス名? プロパティ名?って悩む自分がいます。
そういう所ってセンス出ますよね。
確かそういうのもガイドラインがあったはず。
ありました。
http://msdn2.microsoft.com/ja-jp/library/ms229002.aspx
クラス…「一般に、型名は名詞句にする必要があります。使用する名詞は、その型によって表されるエンティティです。」
プロパティ…「プロパティの名前には、名詞、名詞句、または形容詞を使用してください。」
って、どっちも名詞やん!
(>_<)

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2008/06/10 17:18 凪瀬

ifがbooleanになって==を=と書き間違えて延々と悩むことをしなくなりました。
古式ゆかしいC言語でプログラムした人の多くが経験していると思う。

# re: バグを少なくシンプルに!C#言語仕様に隠された意図 2008/06/10 23:55 めたぼなら

凪瀬さん
> ifがbooleanになって==を=と書き間違えて延々と悩むことをしなくなりました。
そうなんですよね。
C言語は自由度が高い反面、責任範囲も広くって、なかなか大変なんですよね。
似ている言語ではあっても、そこは真逆な感じですね。

タイトル
名前
Url
コメント