- PR -

.NET開発のコーディング規則について

投稿者投稿内容
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2004-07-20 18:51
重複レスになってたので削除しました。

[ メッセージ編集済み 編集者: object 編集日時 2004-07-20 20:30 ]
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2004-07-20 20:15
重複レスになってたので削除しました。


[ メッセージ編集済み 編集者: object 編集日時 2004-07-20 20:31 ]
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-07-20 21:13
ハンガリアン記法とプリフィクスの話がごっちゃになってますね。

いまいち定義がはっきりしないのですが、
ハンガリアン記法=『変数名の先頭に型を表すプリフィクスを付加する記法』でいいのでしょうか?
だとすると、オブジェクト指向言語において、ハンガリアン記法は実現不可能と言えるでしょう。
既に多くの方が述べられているように、型(クラス)は無限に作り出すことができ、その全てに対応するプリフィクスを定義することは非現実的ですから。
# 「プリミティブ型だけ」とかに限定すればハンガリアン記法も可能かなぁ。
# でも、"Integer iPrice"と宣言した変数が、仕様変更で桁数が足りなくなった場合とかどうするんだろう?

それに対して、(ハンガリアン記法以外の)プリフィクスですが、
これは上手く使えば、非常に有効な手段だと思います。
Jittaさんが仰っているような、「画面上に配置するコントロールについては、プリフィックスを決める」などは私も賛成です。

# ところで、.NET Framework SDKでは"ハンガリー表記法"となってますね。
# どうりで検索してもヒットしないと思った。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-07-21 08:11
引用:

オブジェクト指向言語において、ハンガリアン記法は実現不可能と言えるでしょう。
既に多くの方が述べられているように、型(クラス)は無限に作り出すことができ、
その全てに対応するプリフィクスを定義することは非現実的ですから。



すべてのクラスについて個別のプリフィクスを与える必要はないのでは?
適当なスーパークラスまで遡って、スーパークラスをあらわすプリフィクスを
付けるというのは有効だと思います。
型を意識するのは代入可能性やメソッド実装保証を確認したい場合が多いでしょうから、
クラス個別にプリフィクスを付けるよりも、意味のあるレベルでスーパークラスや
インターフェイスに応じたプリフィクスを与えるというのが、賢いやりかただと思います。
この方法は特に GUI コンポーネントでは威力を発揮します。

数値しか入力できない入力欄、半角英数しか入力欄、などのコンポーネントを
作成した場合でも、TextBox のサブクラスであるということで、
tb や txt などのプリフィクスを付けると分かりやすくなると思います。

GUIで有効だと言っている人たちは、どのようにしているのでしょう。
無限に作ることのできるクラスに、それぞれプリフィクスをつけているのでしょうか。
数値しか入力できないテキストボックスに numtb と付けますか?
それとも、スーパークラスの TextBox をあらわす tb を付けますか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-21 08:54
引用:

objectさんの書き込み (2004-07-20 18:43) より:
(前略)


こんなコーディング?
コード:

もし(太郎 が いない) ならば
買い物IF 買い物犬 = new 犬(ポチ)
買い物犬.お使いに行く(買い物メモ, 財布)
そうでなければ
買い物IF ぱしり = new 人(太郎)
ぱしり.お使いに行く(買い物メモ, 財布)
もしおわり


そういう風に理解したのですが…?

追記

つまり、この部分ですけど、
引用:

コードをインスタンスの単なる「リンク」ではなく、「プリフィックス」によって、「型関連情報」を同時に「ソース」に記述したいからです。



 上記例では(名称そのものを変えてしまいましたが)、「買い物IF」というインタフェイスに、「人」または「犬」クラスをキャストして受けています。このときに「『買い物IF』として使うけど、元ものは『人』(または『犬』)クラスのインスタンスなんだよ」というのを明示したいのかな?と。そこで「買い物犬」または「ぱしり」という名称を使い分けることで、型関連情報をソースに記入するのかな?と。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-07-21 10:57 ]
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2004-07-21 09:53
おはようございます。
>GUIで有効だと言っている人たちは、どのようにしているのでしょう。
>無限に作ることのできるクラスに、それぞれプリフィクスをつけているのでしょうか。
>数値しか入力できないテキストボックスに numtb と付けますか?
>それとも、スーパークラスの TextBox をあらわす tb を付けますか?
私の場合、TexBoxを継承して拡張したものでもスーパークラスと同じtxtをつけるだ
けにすると思います。ぱっと見てテキストボックスであるというのがわかればいい
ので、その詳細な機能までわかるような識別子をつける必要もあまりないかなと思
いました。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2004-07-21 12:26
objectです。

>Jittaさん
私が意図したのは以下の様なイメージです。
#例がインターフェースではないですが…。
コード:

abstract class SeibutuHonyu : Seibutu {
public virtual void Shopping(ShoppingMemo sm, Purse p) {}
}

class HonyuNingen : SeibutuHonyu {
public override void Shopping(ShoppingMemo sm, Purse p) {}
}

class HonyuDog : SeibutuHonyu {
public override void Shopping(ShoppingMemo sm, Purse p) {}
}

ShoppingMemo sm = new ShoppingMemo(...);
Purse p = new Purse(...);

#if true
SeibutuHonyu shTaro;
if(...) {
shTaro = new HonyuNingen();
}
else {
shTaro = new HonyuDog();
}
shTaro.Shopping(sm, p)
#else
if(...) {
HonyuNingen hnTaro = new HonyuNingen();
hnTaro.Shopping(sm, p)
}
else {
HonyuDog hdTaro = new HonyuDog();
hdTaro.Shopping(sm, p)
}
#endif
//...は省略を示します
//例に於いて、クラス命名法には、何の意味もありません




[ メッセージ編集済み 編集者: object 編集日時 2004-07-21 14:50 ]
He
大ベテラン
会議室デビュー日: 2002/12/18
投稿数: 141
投稿日時: 2004-07-21 20:45
引用:

未記入さんの書き込み (2004-07-21 08:11) より:
クラス個別にプリフィクスを付けるよりも、意味のあるレベルでスーパークラスや
インターフェイスに応じたプリフィクスを与えるというのが、賢いやりかただと思います。



確認ですが、上記の方法も『ハンガリアン記法』なのでしょうか?
ハンガリアン記法だとすると、
プログラム中の全ての変数に型を表すプリフィクスをつけるということですよね?
変数を宣言するために、スーパークラスを意味のあるレベルまで遡って調べる必要があるということ?
どうもこのあたりがしっくりこないんですが、私のハンガリアン記法の認識が誤ってますか?


前回の投稿でも述べたように、
変数名に意味のあるプリフィクスをつけるという意見には賛成なんです。
ただ、全ての変数に型の情報が必要だとは思いません。

引用:

GUIで有効だと言っている人たちは、どのようにしているのでしょう。
無限に作ることのできるクラスに、それぞれプリフィクスをつけているのでしょうか。
数値しか入力できないテキストボックスに numtb と付けますか?
それとも、スーパークラスの TextBox をあらわす tb を付けますか?


この場合ですと、プリフィクスよりもサフィクスを好んで使います。
↓こんな感じで。
userId = UserIdBox.Text
regionCode = RegionList.SelectedValue
この場合の"Box"や"List"は型の情報ではありません。
純粋にテキストボックスであること、リストであることを表しています。

つまり、UserIdBoxの型情報としてBoxというサフィクスをつけるのではなく、
TextBoxでもHtmlInputTextでもInputManでもテキストボックスとして表示されるものにはBoxというサフィクスをつけます。


# 最後の例が分かりづらかったので追記。

[ メッセージ編集済み 編集者: He 編集日時 2004-07-21 21:09 ]

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