tk-engineering.com Technical blog

To explore strange new systems.
To seek out new bugs and new coding horrors.
To boldly go where no man has not wanted to go before.
Shared のメンバ変数を公開しないこと
先日、こんなソースを見かけまして。
[VB.NET]
Public Class Hoge
 Public Shared fugafuga as String
 '...以下略

思わず寒気を感じた訳です。Shared変数は「そのような変数を Shared で宣言した場合、すべてのインスタンスがストレージ内の同じ場所にアクセスするため、あるインスタンスが変数の値を変更すると、すべてのインスタンスが変更後の値にアクセスするようになります。」[出典:MSDN ライブラリ- Shared(Visual Basic)] なので、昔のグローバル変数なみに訳の判らないことになる恐れがあるのです。
例えばこんなコード(及び改善例)
[VB.NET]
Module Module1

  Sub Main()
    '---ダメな方のHogeの例
    
    Dim objHoge1 As New HorrorHoge
    objHoge1.mstrHoge = "Instance"'---←コンパイラが警告を出します
    HorrorHoge.mstrHoge = "DirectHoge"
    Console.WriteLine("Via Instance")
    objHoge1.PrintHoge()'---←コンパイラが警告を出します

    HorrorHoge.mstrHoge = "DirectHoge"
    Console.WriteLine("DirectHoge")
    HorrorHoge.PrintHoge()

    Console.WriteLine("Hit any key...")
    Console.ReadKey()

    '---マシなほうのHoge
    Dim objBetterHoge1 As New BetterHoge
    objBetterHoge1.Hoge = "hoge"
    Dim objBetterHoge2 As New BetterHoge
    objBetterHoge2.Hoge = "fuga"
    Console.WriteLine("Better Hoge1")
    objBetterHoge1.PrintHoge()
    Console.WriteLine("Better Hog2")
    objBetterHoge2.PrintHoge()

    Console.WriteLine("Hit any key...")
    Console.ReadKey()

  End Sub

End Module

'ダメな方のHoge
Public Class HorrorHoge
  'Sharedなメンバ変数をPublicで公開します
  Public Shared mstrHoge As String

  Public Shared Sub PrintHoge()
    Console.WriteLine("mstrHoge=" & mstrHoge)
  End Sub

End Class

'マシな方のHoge
Public Class BetterHoge

  'とりあえずPropertyにしておきます
  Private mstrHoge As String
  Public Property Hoge() As String
    Set(ByVal value As String)
      mstrHoge = value
    End Set
    Get
      Return mstrHoge
    End Get
  End Property

  Public Sub PrintHoge()
    Console.WriteLine(mstrHoge)
  End Sub

End Class
で、実行結果は…
Via Instance
mstrHoge=DirectHoge
DirectHoge
mstrHoge=DirectHoge
Hit any key...
Better Hoge1
hoge
Better Hog2
fuga
Hit any key...
…ダメな方の
objHoge1.mstrHoge = "Instance"
は、ビット列の彼方に消え去っていきました。

そんな訳で、Sharedのメンバ変数には十分に気をつけましょうというお話でした。


で、問題のそのクラス、全てのメソッドがSharedで宣言されていたのですが、全てのメソッドがSharedなら、何故メンバ変数を公開する必要があるの??等など、疑問の尽きないコードでありました。
| tkinugaw | 下らんグチ話 | 17:45 | comments(0) | trackbacks(0) |









http://blog.tk-engineering.com/trackback/800937
   1234
567891011
12131415161718
19202122232425
2627282930  
<< September 2010 >>
# RECOMMEND
# RECOMMEND
ピープルウエア 第2版 − ヤル気こそプロジェクト成功の鍵
ピープルウエア 第2版 − ヤル気こそプロジェクト成功の鍵
トム・デマルコ, ティモシー・リスター, 松原 友夫, 山浦 恒央
# RECOMMEND
コンサルタントの秘密―技術アドバイスの人間学
コンサルタントの秘密―技術アドバイスの人間学
G.M.ワインバーグ,木村 泉,ジェラルド・M・ワインバーグ
# RECOMMEND
プログラミングの心理学―または、ハイテクノロジーの人間学
プログラミングの心理学―または、ハイテクノロジーの人間学
ジェラルド・M.ワインバーグ, 木村 泉, 角田 博保, 久野 靖, 白浜 律雄
# RECOMMEND
ソフトウェア開発のダイナミズム
ソフトウェア開発のダイナミズム
ジム マッカーシー, Jim McCarthy, 三浦 明美, 福崎 俊博
# RECOMMEND
熊とワルツを - リスクを愉しむプロジェクト管理
熊とワルツを - リスクを愉しむプロジェクト管理
トム・デマルコ, ティモシー・リスター, 伊豆原 弓
# RECOMMEND
人月の神話―狼人間を撃つ銀の弾はない
人月の神話―狼人間を撃つ銀の弾はない
Jr.,フレデリック・P. ブルックス, Frederick Phillips,Jr. Brooks, 滝沢 徹, 富沢 昇, 牧野 祐子
# RECOMMEND
Code Complete第2版〈上〉―完全なプログラミングを目指して
Code Complete第2版〈上〉―完全なプログラミングを目指して
スティーブ マコネル, Steve McConnell, クイープ
# RECOMMEND
Code Complete第2版〈下〉―完全なプログラミングを目指して
Code Complete第2版〈下〉―完全なプログラミングを目指して
スティーブ マコネル, Steve McConnell, クイープ
# RECOMMEND
デッドライン―ソフト開発を成功に導く101の法則
デッドライン―ソフト開発を成功に導く101の法則
トム デマルコ, Tom DeMarco, 伊豆原 弓
# RECOMMEND
新訳 ソフトウェアプロジェクトサバイバルガイド
新訳 ソフトウェアプロジェクトサバイバルガイド
スティーブ マコネル, Steve McConnell, アルテアジャパン, 久手堅 憲之
# RECOMMEND
ソフトウエア開発 55の真実と10のウソ
ソフトウエア開発 55の真実と10のウソ
ロバート・L・グラス, 山浦 恒央
# RECOMMEND
ソフトウェア開発201の鉄則
ソフトウェア開発201の鉄則
アラン・M. デービス, Alan M. Davis, 松原 友夫
# RECOMMEND
リファクタリング―プログラムの体質改善テクニック
リファクタリング―プログラムの体質改善テクニック
マーチン ファウラー, Martin Fowler, 児玉 公信, 平澤 章, 友野 晶夫, 梅沢 真史
# RECOMMEND
Joel on Software
Joel on Software
Joel Spolsky, 青木 靖
# RECOMMEND
デスマーチ 第2版 ソフトウエア開発プロジェクトはなぜ混乱するのか
デスマーチ 第2版 ソフトウエア開発プロジェクトはなぜ混乱するのか
エドワード・ヨードン, 松原 友夫, 山浦 恒央
# RECOMMEND
# RECOMMEND
# RECOMMEND
# RECOMMEND
プログラミングMicrosoft ADO.NET
プログラミングMicrosoft ADO.NET
David Sceppa, 日本ユニテック
# RECOMMEND
# RECOMMEND
デスマーチ 第2版 ソフトウエア開発プロジェクトはなぜ混乱するのか
デスマーチ 第2版 ソフトウエア開発プロジェクトはなぜ混乱するのか
エドワード・ヨードン, 松原 友夫, 山浦 恒央
# RECOMMEND
ライト、ついてますか―問題発見の人間学
ライト、ついてますか―問題発見の人間学
ドナルド・C・ゴース, G.M.ワインバーグ, 木村 泉
# RECOMMEND
コンサルタントの道具箱
コンサルタントの道具箱
ジェラルド・M・ワインバーグ, 伊豆原 弓
' RECENT COMMENTS
# RECENT TRACKBACK
# CATEGORIES
# ARCHIVES
-> LINKS
# COUNTERS
カウンタ設置以来…
今日…
昨日は…


Stats [since 09/09/06]
- PROFILE