- PR -

静的メソッドとインスタンスメソッド

投稿者投稿内容
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2006-09-01 12:39
引用:
未記入さんの書き込み (2006-09-01 12:07) より:
あるログインユーザーに対してメソッドを3つ作成しようとしています。
3つのメソッドはログインIDを引数で受け取ります。
使用頻度はあるフォームのOpenでメソッド1を
同じフォームのCloseでメソッド2を
任意の場所(別プロジェクト)でメソッドを3を呼びます。

私の場合は
ログインIDを引数にしたコンストラクタを作成し、メソッド3つはインスタンスメソッドにします。



それってインスタンスメソッドか静的メソッドかの問題じゃなくて
オブジェクト指向設計か否かの問題じゃないですか?
最初の方法が、Iさんの推す方法ならば、Iさんはオブジェクト指向を全く取り入れようとしていないんじゃないですか?
それとも、Iさんもオブジェクト指向を取り入れようとしているけど、方向性が間違ってるんでしょうか?

オブジェクト指向設計なら、ログインユーザーはオブジェクト化できるのだから
未記入さんの言うとおり、ログインユーザークラスにログインIDというフィールドを用意してやって、
3つのメソッドにはログインID引数は不要(ログインIDフィールドを利用)とするのが正しいです。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-09-01 12:56
んー…?認証がらみの話なんでしょうか。

User user = new User(ID, PASS);
認証.Login(user);
:
認証.Logout(user);

こんな感じかなあ、私は…。
もっとも、staticかinstanceかは場合によりますが。

#Open/CloseをLogin/Logoutに修正。フォームでOpenメソッドを…とか空目してたあ。

[ メッセージ編集済み 編集者: mio 編集日時 2006-09-01 17:06 ]
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2006-09-01 12:57
私もけんじさんの書かれた内容に同意で、設計思想的な話題だと思います。

オブジェクト指向設計として「ログインユーザーを表すクラス」があるならば
そのクラスには特定の振る舞いとして3つなりメソッドが用意されるというのは
間違っていないと思います。

Iさんという方が考えているのがオブジェクト指向設計としてという話なのか、
構造化としての観点からの話なのかによって説得するための材料も
変えた方がいいのではないでしょうか。

個人的には、Iさんという方はオブジェクト指向設計ではない設計思想だと思います
のでメソッドのメリット、という観点からの説得は難しいのではないでしょうか。
未記入
大ベテラン
会議室デビュー日: 2006/05/19
投稿数: 125
投稿日時: 2006-09-01 13:34
たぶんIさんは
オブジェクト指向を取り入れたいが、方向性が間違っている。
クラス設計を理解していない。

そして私は
クラス設計やオブジェクト指向をIさんに説明できるほど理解していない。


静的メソッドにするかいなかは
クラス設計の段階で「どのクラスにも含むことができない者達が静的メソッドになる。」と私は理解しております。

masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2006-09-01 13:53
class DataClass {

string GetName() {
// このインスタンス内のフィールド変数などを使って処理
}

static string GetName(DataClass data) {
// 指定されたインスタンスのプロパティなどを使って処理
}

}

同じクラスに書いてしまうとかえって紛らわしいかもしれませんが、
そのメソッドが引数だけで処理ができる内容であれば静的でOK、
インスタンスの状態などに依存した処理をするならインスタンスメソッドかな。

ただ、静的にするとオーバーライドしたくなったときに困ります。


そのクラスの役割などが重要なので、
一般論ではどちらがよいという答えにはたどり着かない気がします。

minminnana
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 246
お住まい・勤務地: 盛岡
投稿日時: 2006-09-01 14:09
引用:
静的メソッドにするかいなかは
クラス設計の段階で「どのクラスにも含むことができない者達が静的メソッドになる。」と私は理解しております。


それはちょっと違うのではないでしょうか。
実際、.NET Frameworkの中にはインスタンスメソッドと静的メソッドの両方を持ったクラスが沢山ありますよね。
FileやDirectory系のようにインスタンスメソッドと静的メソッドを別々に両方用意しているクラスなんてのもありますね。(ここら辺はインスタンスを作るコストと単発で使うか連続して使うかによるんですかね)

[ メッセージ編集済み 編集者: minminnana 編集日時 2006-09-01 14:10 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-09-01 14:10
引用:

未記入さんの書き込み (2006-09-01 12:07) より:
私の場合は
ログインIDを引数にしたコンストラクタを作成し、メソッド3つはインスタンスメソッドにします。


そのコンストラクタと3つのメソッドを持つクラスは、なんという名称でしょうか?どんなことを担うクラスでしょうか?
オブジェクトとして意義のある分担があり、分かりやすい名前が付けられるなら、クラスにしたほうが良いと思います。
しかし、名称が思い浮かばず、ただ、3回呼ばれるというという性格のものならば、「関数」を「乱立」させたほうが良いと思います。

#というようなことを伝説の鈴木さんから聞いたことがあります。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-09-01 15:11
引用:

未記入さんの書き込み (2006-09-01 11:33) より:

私の考えではクラスとしてインスタンスメソッドを使用したいのですが
Iさんの考えではメソッドを呼び出し側では1機能として1度呼び出すだけなのだから関数でよいと、関数を乱立されます。



呼び出し側からみて、1機能として1度呼び出すだけということなら、僕も I さんに賛成です。
逆に、あなたがインスタンスメソッドに拘る理由は何ですか?

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