クラスの共有メソッドについて への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 葉月  () 投稿日時 2008/7/23 01:08:00
>>>刈谷勇さん 
 どうも、始めまして。 
 GOFのデザインパターン本を立ち読みして、私には難しく値段も高かったので違う本を買ってしまいました。 
 今は日立エンジニアリングの社員が書いた初心者向けの本(java)で勉強しています。 
 二週目に入り、一部自分の書いたコードに利用させてもらっている感じです。 
 
 私は趣味でプログラムをやっている程度ですが、同じデザインパターンを勉強している方と会えるのは嬉しいですね。 
 これからもよろしくお願いします。
投稿者 刈谷勇  () 投稿日時 2008/7/23 00:25:00
>>るしぇさん 
フォローありがとうございます。 
マルチスレッドについては、singletonパターンを勉強するにあたって少し調べた程度だったので、確かにスレッドセーフで調べてもらったほうがよかったです。 
 
>>葉月さん 
私もやっと、デザインパターンの本を一通り読み終わったところです。 
ただ、実際に使いこなせるようになるのはいつになるやら・・・ 
お互いがんばりましょう。
投稿者 葉月  () 投稿日時 2008/7/23 00:00:00
 .NETは、オブジェクト指向言語になります。 
 私もオブジェクト指向を勉強中ですが、とても奥が深い分野だと思っております。 
 カプセル化、ポリモフィズムを使った応用、デザインパターンなど覚えることが多くついてきているのか疑問です。 
 オブジェクト指向の手法を一通り覚えてからマルチスレッドに入れば理解も深まり、質問内容の解答が自然と理解していると思います。 
 マルチスレッドについては、デリゲートを使って処理を行っていると、そのうち問題に遭遇すると思います。 
 
>>>マルチスレッドの一例 
 プログレスバーを表示する機能をデリゲートで処理して、汎用的に使えるクラスを作りましたが…… 
 Formがスレッドセーフ(複数のスレッドからのアクセスが保障)な作りになっておらず、 
 プログレスバーを表示する機能を使う場合だけ例外が起こるようになりました。 
 VS2005以降だと例外が出るようになっているようですが、私の場合は初め例外が起らずに途方にくれました。フリーズしたように、処理が止まった感じになった気がします。 
 例外が出てから、参考ページを見つけて解決にいたりました。  
 参考ページを見てもらえるとマルチスレッドの概要が掴めて、MSDNなど他のスレッドセーフなページを見る際の事前準備になると思います。 
  
参考ページ: 
ttp://www.atmarkit.co.jp/fdotnet/vblab/appqa_06/appqa_06_01.html
投稿者 るしぇ  () 投稿日時 2008/7/22 21:46:00
>>1 
>メソッドの処理が自分の中のみに影響するもの 
『スレッドセーフ』という単語をからめて検索してみると 
色々な情報が引っ掛かると思います。
投稿者 刈谷勇  () 投稿日時 2008/7/21 18:54:00
Asiansさん、はじめまして。 
自分もVB勉強中なので、わかる範囲でお答えします。 
 
>>下手に共用メソッドを使っているとバグのもとになると知人に指摘されました  
 
処理の内容によると思います。 
概略でいうと、 
メソッドの処理が自分の中のみに影響するもの、 
たとえば、引数で与えられた金額の消費税を計算する関数では、いくら並列処理になっても問題ないと思います。 
 
逆に、自分の関数外へ影響を及ぼすものには注意が必要だと思います。 
たとえば、メソッド内でSQLのテーブルを更新するような処理の場合、ほぼ同時にこの関数を呼ばれた場合、ロジックによっては、実際にSQLを書き出すタイミングが関数を呼ばれた順序と逆転してしまうこともあると思います。 
 
>>更に調べてみるとマルチスレッドの同期を取るためにSyncLockステートメントというのが存在し,これを共用メソッドの入り口と出口で利用すれば重複して実行されるのが防げるのではないかと思うのですが 
 
実は自分もつい最近調べたばかりなので、実際に検証はしていないのですが、 
[MethodImpl(MethodImplOptions.Synchronized)] 
をメソッドの頭に書いておけばいいと思います。 
 
有識者の方 
間違った発言がありましたら、ご指摘願います。
投稿者 Asians  () 投稿日時 2008/7/20 17:22:00
お世話になってます 
VB6の頃は標準モジュールに色々な関数を作った物を利用してプログラムを作っていましたが内容にもよるのでしょうがVB.Netではクラスを利用して同様のことをする方が効率が良いように聞きました 
クラスに記述するメソッドには共用メソッドと非共用メソッドがあって共用メソッドはインスタンスに属するメンバへのアクセスをしないのであればインスタンスを生成せずにメソッドが利用できるのですよねぇ 
この感覚はVB6の頃の標準モジュールの雰囲気に近く馴染みやすいのでVB6の頃に作った関数をこのクラスの共有メソッドで作ろうと思うのですがVB.Netはマルチスレッドがあって下手に共用メソッドを使っているとバグのもとになると知人に指摘されました 
この知人も別の人に注意されただけでマルチスレッドの場合の共有メソッドの危険性やマルチスレッドそのものがよく理解できていないそうなので,私なりにマルチスレッドを調べたところマルチスレッドによってメソッドが重複して実行されることがこの危険性なのかなぁと考えました. 
更に調べてみるとマルチスレッドの同期を取るためにSyncLockステートメントというのが存在し,これを共用メソッドの入り口と出口で利用すれば重複して実行されるのが防げるのではないかと思うのですがこの方法で良いのでしょうか 
また共用メソッドの危険性は他にもあるのでしょうか