DOBON.NET DOBON.NETプログラミング掲示板過去ログ

インスタンスメソッドと静的メソッドについて

環境/言語:[WindowsXP,VB.NET]
分類:[.NET]

初歩的な質問で恐縮ですが教えて下さい。

メソッドをインスタンスメソッドにするか
静的メソッドにするかで悩んでいるのですが...

1.メソッドがインスタンス変数を使用する場合--------->インスタンスメソッド
2.メソッドが静的変数を使用する場合----------------->静的メソッド
3.メソッドがインスタンス変数も静的変数も使用しない--->?????

3の場合、どちらでも良いと思われますが
どちらが良いという指針みたいなものがあ
るのでしょうか?
こんにちは中博俊です。

値をずっと保持する場合にはインスタンスメソッド、引数と戻り値だけで語れる範囲はスタティックと切り分けてはいかがですか?
うーん…多分私の意見は参考にならない(むしろ反面教師かも…)と思いますが、
書いて見ます(ぇ
> 1.メソッドがインスタンス変数を使用する場合
→A メッセージとして特定のインスタンスを渡す、静的メソッドを作る
 B 自分自身(自己インスタンス?)を使う、インスタンスメソッドを作る

> 2.メソッドが静的変数を使用する場合
→静的メソッドでも、インスタンスメソッドでもいいと思うなぁ…

> 3.メソッドがインスタンス変数も静的変数も使用しない
→ローカル変数だけで動くメソッド?
 これはそのメソッドの挙動にかかわるので、一概にどーとは言えない希ガス…

…良く見ればどっちでも良いことになるなぁ…
ふむ…
こんにちは、じゃんぬ です。

■No12249に返信(ガッさんの記事)
> →A メッセージとして特定のインスタンスを渡す、静的メソッドを作る
>  B 自分自身(自己インスタンス?)を使う、インスタンスメソッドを作る
外部から別のデータを渡すのであれば、それは別のクラスの静的メソッドでやるべきです。
内部データなら、当然インスタンス メソッドです。
カプセル化の概念を考えてみてください。

> →静的メソッドでも、インスタンスメソッドでもいいと思うなぁ…
ダメです。静的メソッドでやりましょう。
Java での反省もあります。

> →ローカル変数だけで動くメソッド?
>  これはそのメソッドの挙動にかかわるので、一概にどーとは言えない希ガス…
どこに含めるかは、動作によって異なります。0
何でもありな Common なんてクラスだけは止めて欲しいところです。
皆様、貴重なご意見ありがとうございます。

補足ですが、「3.メソッドがインスタンス変数も静的変数も使用しない場合」
は下記の(気の利かない)サンプルソースのmethod1,method2のようなメソッド
を想定しています。
中博俊さんの回答にあった「引数と戻り値だけで語れる範囲はスタティックと
切り分けて...」=method1でなくmethod2という事ですよね。

で、もう一つ気になるのが、[呼び出し元]でのmethod2の記述要領なのですが
[部品クラス]の中にインスタンスメソッド(setStr,getStr)が存在するので
[呼び出し元]クラスで[部品クラス]のインスタンスを起こしています。
[呼び出し元]クラスの記述例1、2については、どちらが正しいといった
指針があるのでしょうか?

[部品クラス]
Public Class Class1

Private str As String

Public Sub setStr(ByVal iStr As String)
str = iStr
End Sub

Public Function getStr() As String
Return str
End Function

Public Function method1() As String
Return "B"
End Function

Public Shared Function method2() As String
Return "C"
End Function

End Class

[呼び出し元クラス]
Public Sub TestClass()

Dim c1 As New Class1
Dim str As String

c1.setStr("A")
str = c1.getStr()
str = c1.method1

str = c1.method2 '<----記述例1
str = Class1.method2 '<----記述例2

End Sub
疑問に思うことを。

■No12250に返信(じゃんぬねっとさんの記事)

> ダメです。

完全に否定ですか。
「ダメ」と言い切れる経験と自信をお持ちなのでしょうね。
しかしその、「ダメ」という判断はじゃんぬねっとさん自身の判断ではないのですか?

推奨されていないことなのかもしれないでしょうが、
禁止されていることでもないのでしょう?
状況によりけり、そもそもどちらを使っても問題ない場合もあろうかと思われます。

なおかつ「反面教師」な発言と銘打っているのにもかかわらず、
文面から少しキツい印象を受けます。

煽るつもりではありません。
「そこまで言わなくでも・・・」な感じです。
失礼しました。
本掲示板の趣旨とは外れているので、お気楽でやるべきかもしれませんが、
技術に関することもありますので、少しだけ...

■No12254に返信(ふとさんの記事)
> 「ダメ」と言い切れる経験と自信をお持ちなのでしょうね。
> しかしその、「ダメ」という判断はじゃんぬねっとさん自身の判断ではないのですか?
> 推奨されていないことなのかもしれないでしょうが、
> 禁止されていることでもないのでしょう?
> 状況によりけり、そもそもどちらを使っても問題ない場合もあろうかと思われます。

どちらもできるから良い、のではなく明示化すべきだと思います...
「問題ない」というのは動作上の問題であって、クラス設計上は問題ないとは言えないかなと思いました...

> なおかつ「反面教師」な発言と銘打っているのにもかかわらず、
> 文面から少しキツい印象を受けます。

うーん、そういうニュアンスではなかったつもりなのですが...
今見るとそう見えますね... (。。;)
もっと別の言葉を選ぶべきでした。
不快になられた方がいましたら、申し訳ありません。(*_ _)

> 煽るつもりではありません。
> 「そこまで言わなくでも・・・」な感じです。
> 失礼しました。

ご忠告ありがとうございます。(*_ _)
今回、もっと相手の意見を客観的に見るべきでした...

ただ、以下もキラーフレーズじゃないですか? (^^)

> 「ダメ」と言い切れる経験と自信をお持ちなのでしょうね。

「煽るつもりではありません。」と仰ってますから、意味合いが異なるんですかね。(^^)

# あ、さして経験がないのは認めます。
■No12257に返信(じゃんぬねっとさんの記事)

>
> ただ、以下もキラーフレーズじゃないですか? (^^)
>
>>「ダメ」と言い切れる経験と自信をお持ちなのでしょうね。
>
> 「煽るつもりではありません。」と仰ってますから、意味合いが異なるんですかね。(^^)
>
> # あ、さして経験がないのは認めます。

あぁ・・・すみませんでした。
他の文面が攻撃的にとられてしまったのなら
キラーフレーズになってしまいますね。(;;)

私には、何よりも断言できる理由をもっていませんでしたので
尊敬の念を持って書かせていただきました。
文面に語弊があり、大変失礼いたしました。

以下、純粋な気持ちです。

じゃんぬねっとさんのことはいろいろなところでお見かけし、
また、サイトも参考にさせていただいており、大変感謝しております。

もちろん今回の件に関しましても
明示化させることに反論はおろか、そうしたほうがいいのだろうと思っています。
質問者も初歩的であると思っていらっしゃいますし
基本が肝心なのも重要なことですね。

該当するじゃんぬねっとさんの発言も反面教師の「反面」な部分を
きっぱりと明示化してあると思います。

ただ、ガッさんは自分の発言が「反面」で「参考にならない」と
(反面的な参考にはなるのでしょう。暗黙的な補完ですが。)
わざわざ書かれているのですから、
「ダメです。」と一蹴するべきではないのではないでしょうか。

以上です。

追記:
書きながら思ったことですが、
ガッさんとじゃんぬねっとさんが親しい間柄で、
軽い冗談交じりのコミュニケーション的なものなのでしたら
私の早合点をお許しください。

失礼いたします。
どうもガッです。
下がってるスレを上げてしまうのは少し気が引けますが、
名前が出てきていたので私の言葉を書かせて頂きます(ぇ

> ふとさん&じゃんぬねっとさん
煙がくすぶりそうですが、私は全く気にしていませんのでー
続かるのなら私を出涸らしの出汁袋だと思っておいてくださいー


※技術的にはじゃんぬねっとさんのが気になっていますので、下にまとめてみました。
> 外部から別のデータを渡すのであれば、それは別のクラスの静的メソッドでやるべきです。
→メソッドに外部からメッセージを渡すのはOOPの概念ですよね…
 となると、すべての動作は別のクラスのクラスメソッドになるということですか…??
 →どこか勘違いして読んでる希ガス…

> 内部データなら、当然インスタンス メソッドです。
> カプセル化の概念を考えてみてください。
→ある方向に公開する必要がないものは隠蔽する必要がありますからねぇ…こちらはわかっているつもりです。

> Java での反省もあります。
→Javaは授業で齧ったことがあるくらいなので、できれば詳しく教えていただきたいと思います;;
 (もしかしてクラス変数を複数のインスタンスで共有することで、何か危ないことでもある…
 うーん…有りそうだけど、よくわからんなぁ…)

> 何でもありな Common なんてクラスだけは止めて欲しいところです。
→まぁ、まとめすぎて大きくなったのは見てて気持ち悪いですからね…
 私が大きいのを作ると必ず汚くなるので大きな声ではいえませんけど(TT

以上です。
答えにくい物があったり、質問の意図がわからないときは全く無視して結構です。
長文失礼しました。
■No12262に返信(ガッさんの記事)

>>ふとさん&じゃんぬねっとさん
> 煙がくすぶりそうですが、私は全く気にしていませんのでー
> 続かるのなら私を出涸らしの出汁袋だと思っておいてくださいー

こちらこそ横から失礼いたしました。
他所でもお見かけさせていただいております^^

今回の件、
具体的には技術云々での異論等ではないところでスレを長くしてしまって
申し訳ありませんでした。

>じゃんぬねっとさん、ガッさん。
今後も有意義な情報の共有を期待し拝見させていただきます。
失礼いたします。
抽象的な話になると感情が入りますので、もっと具体的な話をした方がよいのではないでしょうか。

単純にパフォーマンスだけを考えてどちらがよいかということになると、一般的には静的メソッドのほうがよいということになるようです。しかしその差はないに等しく、このことだけを考慮して静的メソッドを使用するということはしないほうがよいでしょう。

このことに関して、ニュースグループの以下のトピックが参考になります。

http://groups.google.co.jp/group/microsoft.public.dotnet.framework.performance/msg/7729fbf6bb775826?hl=ja&

http://groups.google.co.jp/group/microsoft.public.dotnet.framework/msg/d149f1ae99457f6b?hl=ja&

DOBON.NET | プログラミング道 | プログラミング掲示板