class内とForm内でのFunctionの違いを教えてください

解決


ヴェスパ  2009-12-02 22:41:16  No: 142913

class内の情報を使って処理を行おうとしているのですが、それをclass内のFunctionで作成するべきか、Form内のFunctionで作成するべきか悩んでいます。

たとえば以下の様にclassを設定しています。
Class Data
    Public A As Integer
    Public B As Integer
End Class

このclassの内容を使ってA+Bの計算をするFunctionを作成するとします。
Form内でFunctionを作成するした場合と、class内でFunctionを作成した場合、それぞれどういうメリット、デメリットが有るのでしょう。

処理速度、メモリ使用量など変わってくるのでしょうか?

概念、classの適切な使用方法などの話しになると思うのですが、ご教示いただけませんか。

よろしくお願いいたします。


こうしろう  2009-12-02 22:59:39  No: 142914

class内のFunctionで作成するべきか,と


特攻隊長まるるう  2009-12-02 23:18:58  No: 142915

Form も Class ですし、Form の中にも Class を作れることは知っていますか?
結局は「クラス設計」でしかないと思います。

既存の .NET Framework をよく観察してみてください。
例えばデータベースを扱う場合は System.Data.OleDb クラス
ファイルを操作する場合は System.IO.File クラス
画面を操作する場合は System.Windows.Forms.Form クラス

じゃあ、
System の直下にはどんなクラスがありますか?
System.Windows の直下には?
System.Windows.Forms の直下には?
(※ 名前空間とクラスの違いも勉強しておいた方がいいですね)

厳密に言えば、処理速度、メモリ使用量は変わりますが、
同じサイズのデータを扱うのであれば、まず、気にする必要は
ありません。

使い回せばいいクラスのインスタンスを何度も生成したり、
共通化すれば良いデータのコピーをたくさん作ったり、
「クラス設計」では無く、「クラス操作」の知識の無い人が
効率の悪いプログラムを書くことは良くあります。
処理速度、メモリ使用量が目に見えて変化するのは、こちらの
方でしょう。

「クラス設計」に関して言えば、メリットは
「便利に使えるように設計できる」
ということです。
もちろん、便利に使えないような設計をする人も居ます。
プログラマの腕次第ですね。Form 内にあるか別の Class 内に
あるかでは結論は出ません。Form も Class ですから、自分の
Class 内にあったほうが良いように設計されているか?
別 Class にあったほうが良いように設計されているか?
であり、どちらも正解に成り得ますし、どちらも不正解に
成り得ます。
家を建てるときに1つの建物にした方がいいですか?
別宅を建てたほうがいいですか?
答えはありません。使い方次第でしょう?

「クラス設計」のノウハウを掲示板で教えられるとは
思っていませんし、勉強し、実践しないと理解できないこと
だと思います。
まずは「クラス設計」というキーワードを絡めてどんな
事を考えられているのか調べてみては?


魔界の仮面弁士  2009-12-02 23:36:10  No: 142916

> Class Data
>     Public A As Integer
>     Public B As Integer
> End Class
> このclassの内容を使ってA+Bの計算をするFunctionを作成

そのクラス/構造体が持つ意味によって異なるかと思います。

データを表すオブジェクトと計算処理とを、分離した方が良いものや、
分離せざるを得ない場合もあるでしょう。ただ、クラス名「Data」が、
メンバ名「A」「B」を統括する名前になっているのであれば、
関連する処理はクラス内に実装しておいた方が分かりやすい事が多いかと。

たとえば、
  Public Class 有効期間
    Public 開始日時 As Date
    Public 終了日時 As Date
  End Class
に対して、期間(2つの日付の差)を TimeSpan 型として取得したいとすれば、
算出処理は、このクラス上に実装しておくという実装パターンもあるでしょう。

このような実装パターンは、例えば、Rectangle 構造体などに見ることができます。

Rectangle を New する際には、左上の座標と矩形領域のサイズは指定しますが、
右下の座標は指定しません。しかし、Rectangle 構造体が内部でそれを計算して、
Right / Bottom プロパティとして公開するようになっていますよね。

また、インスタンスメンバーとして実装するパターン以外にも、
Rectangle.Inflate や Rectangle.Union のように、
Shared として実装するような場合もあるかと思います。
実際に管理するデータにあわせて、適切と思えるパターンを選択してみてください。

> それぞれどういうメリット、デメリットが有るのでしょう。
メリット、デメリットというわけではありませんが、API や COM など、
外部にマーシャリングされる可能性があるクラスや構造体では、
新たなメンバを追加することが制限される事があります。
(ただし、ある程度は属性等で制御する事ができます)

> 処理速度、メモリ使用量など変わってくるのでしょうか?
微妙に変わりますが、それは実装手法とは別の話として検討した方が良いでしょう。

パフォーマンスを気にするのであれば、実際にそれぞれの実装にて処理してみて、
どの程度の差があるのかを実際に測定してから検討してみてください。

大きな差が出るようであれば、実装手法を変更する必要が出るかも知れませんが、
ごく僅かな差しか出ないなら、パフォーマンスの差を気にするよりも、
「実装が容易な方」「使いやすい/わかりやすい方」「修正しやすい方」など、
都合が良いと思われるパターンを選択していけば良いかと思います。


特攻隊長まるるう  2009-12-03 00:04:17  No: 142917

使いやすさの点から例を考えれば、
> A+Bの計算をするFunctionを作成するとします。
・・・そもそもそんなことしませんね。ボクは。
普通に A + B とコードで直接書きます。
クラス化すれば、クラスを操作する手順が必要になるので
面倒ですよね。
モジュール化とかも考えられるけど「足し算」の意味しか
無いのであれば、+ 演算子があるんだからそれで十分じゃない?
って結論になって Function なんか作成しません。

ボクは、これに数値の妥当性チェックがあればクラスを使います。
例えば、A も B も256階調の色の要素で、結果もその範囲内で
ある必要があるとか。

「クラス設計」から言えば、
1)数値1つを渡せば256階調内に変換(もしくはエラー判定)するクラス
2)数値2つを渡せば256階調内で変換後に加算するクラス
3)1)2)を関数として持ってる256階調制御クラス

1)だけにするか、2)だけにするか、3)を作るかは目的次第。
一般には1)2)なら共通関数レベルなので Form 内の関数にします。
別の場所でも使ってて、共通化したいならモジュールレベルの
関数を用意するかな。
3)は確実にクラスを作りますね。
Form1 でしか使ってないなら Form1 の子供として作って外部に
公開しないかな。
他画面でも使うなら、完全に独立したクラスにします。


ヴェスパ  2009-12-04 01:13:24  No: 142918

ご回答ありがとうございます。
rectangleの例えは理解しやすかったです。
汎用性の問題も考慮すると言うことですね。

A+Bはあくまで例えであり、当然そのレベルなら必要時に計算します。
現実は多数の座標データを持っていて、ある座標データの範囲内に別の座標データが入りきるかの判断や、入りきらない例外も判断など必要です。
(更に特定条件では座標を圧縮して持つなど)
手法や概念の質問なので、複雑な例を出しても仕方ないと思い簡潔化しました。

クラスに含めると、「.」をつけて明示的に表示させる事が出来るので便利なのですが、やりすぎて膨大化したら一体どうなるのかが気になりました。

ありがとうございました。


特攻隊長まるるう  2009-12-04 01:42:36  No: 142919

> 手法や概念の質問なので、複雑な例を出しても仕方ないと思い簡潔化しました。
質問内容を相手に分かるように簡潔にするのは良い事です。
しかし、簡潔化しすぎても逆に意味が無くなりますよね。

> A+Bはあくまで例えであり、当然そのレベルなら必要時に計算します。
その「当然」をどう判断しているかが答えの一つですよ?
つまりclass内のFunctionで作成するべきか、Form内のFunctionで作成するべきか
迷わないのですね?・・・しかもFunctionさえ作らないのですね?
それは、質問の条件を満たさない例になりますよね?
なぜ迷ったのか?その原因こそが重要なはずです。
簡潔化する際に、必要な条件まで落としていないかチェックすることをお勧めします。

> クラスに含めると、「.」をつけて明示的に表示させる事が出来るので便利なのですが、
> やりすぎて膨大化したら一体どうなるのかが気になりました。
.NET Framework のようになると思います^^;


小牧りん  2009-12-04 04:22:37  No: 142920

むだだと思うよ。
引数がなにか理解してない。
入門の本で基礎構築することが肝要ですね。
とゆうか、サポートをどんだけしてもムダな感じのレベルにみえるけど♪


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加