C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

Form、データテーブル、クラス構築の方法について /TanuTanu (19/08/08(Thu) 10:20) #91879
Re[1]: Form、データテーブル、クラス構築の方法について /魔界の仮面弁士 (19/08/08(Thu) 11:29) #91883
Re[1]: Form、データテーブル、クラス構築の方法について /とっちゃん (19/08/08(Thu) 10:42) #91881
  └ Re[2]: Form、データテーブル、クラス構築の方法について /TanuTanu (19/08/08(Thu) 14:11) #91888


親記事 / ▼[ 91883 ] ▼[ 91881 ]
■91879 / 親階層)  Form、データテーブル、クラス構築の方法について
□投稿者/ TanuTanu (46回)-(2019/08/08(Thu) 10:20:13)
TanuTanu さんの Web サイト

分類:[.NET 全般] 

いつもお世話になっております。

わんくま同盟の皆様のお力をお借りプログラム勉強しているものです。
見よう見まねで製作している為、動作はするが正しいコードかどうか怪しいです。
何か無駄にメモリを使っている気がします・・・

Form、データテーブル、各種クラスを使った構築は下記の通りです。

改良すべき点がありましたらご教授をお願い致します。


@Form1-DataSet1-DataTable1をデザイナーで製作
ATEST1〜TEST5クラスを製作

■Form1のコード抜粋

Dim TEST1 As New TEST1(Me)
TEST1.Check()

■TEST1〜TEST5クラス

Public Class TEST1

'フォームの参照を保持する
Public _Form1 As Form1

Public TEST1データ As DataTable

Public Sub New(frm As Form)

_Form1 = CType(frm, Form1)

TEST1データ = _Form1.DataSet1.TEST1データ

End Sub

メソッドは割愛

End Class

Public Class TEST2

'フォームの参照を保持する
Public _Form1 As Form1

Public TEST2データ As DataTable

Public Sub New(frm As Form)

_Form1 = CType(frm, Form1)

TEST2データ = _Form1.DataSet1.TEST2データ

End Sub

メソッドは割愛

End Class

TEST3移行は割愛

[ □ Tree ] 返信 編集キー/

▲[ 91879 ] / 返信無し
■91883 / 1階層)  Re[1]: Form、データテーブル、クラス構築の方法について
□投稿者/ 魔界の仮面弁士 (2287回)-(2019/08/08(Thu) 11:29:08)
2019/08/08(Thu) 11:32:24 編集(投稿者)

No91879 (TanuTanu さん) に返信
> 何か無駄にメモリを使っている気がします・・・

メモリの問題は別に考えましょう。


それよりも、「カプセル化」がおろそかになっている点が気にかかります。

Form 上に貼ったコントロールやコンポーネントは、
C# では既定で private になるのですが、
VB では Friend になりますね。
(デザイン時に GenerateMember および Modifiers プロパティで変更できます)


これらは Public なメンバーでないことを前提に設計しましょう。
Public ではない以上、その Form 以外の場所から
直接読み書きされることは避けるべきです。


> Public Class TEST1
>   'フォームの参照を保持する
>   Public _Form1 As Form1

Form1 が TEST1 のインスタンスを管理するのではなく、
TEST1 が Form1 のインスタンスを管理する形なのですね?

その場合、TEST1 のインスタンスをどこで管理するのかとか、
そもとも TEST1 は何のために _Form1 への参照を必要としているのかといった
設計上の「意図」が読めないのが気にかかりますが、それはさておき。


固有の Form1 型を Public フィールドで参照させることは望ましくありません。
それが "_" で始まるメンバー名であるなら尚の事です。

今の実装だと、
 Dim objTEST1 As New TEST1(form1インスタンス)
 objTEST1._Form1 = Nothing
のように、TEST1 の外部から任意のタイミングで
それぞれの参照を張り替えることができてしまいますが、
それは TEST1 側にとって都合が悪くありませんか?



>   Public Sub New(frm As Form)
>     _Form1 = CType(frm, Form1)

この部分もアウト。
コンストラクタ引数に Form2 のインスタンスを渡せてしまいますが、
その場合、TEST1 インスタンスの生成時点で例外となりますよね。

であればそもそも、Form1 以外は受け付けられないよう、
 Public Sub New(frm As Form1)
にしておいた方が素直でしょう。

それと、引数が Nothing であることを許容するかどうかも争点です。
Nothing を受け入れないようにするならば、
 If frm Is Nothing Then Throw New ArgumentNullException(NameOf(frm))
などの「ガード句」を設けておくことが望ましいです。


>     TEST1データ = _Form1.DataSet1.TEST1データ
この実装にも疑問。
この DataTable を管理しているのは、Form1 なのでしょうか。それとも TEST1 なのでしょうか?

これがたとえば、
 Me.CurrentTable = _Form1.DataSet1.TEST1データ
などとなっていて、TEST1 内の別の処理で
 Me.CurrentTable = 別のDataTable
などとなるようなパターンならまだ分からなくも無いのですが。


ただそれにしても、TEST1 が「Form1 の DataSet1 フィールド」を
読み書きすることには違和感があります。DataSet の管理は
Form1 自身に任せるべきでしょうし、もしも TEST1 に一任させたいと
思うのであれば、Form1 と TEST1 の二重管理にしない方が良いです。
(依存性の高い密結合になるので、修正工数などが増大する)


'【案1】Form1 の参照を、呼び出し元で差し替えられないようにする
Public Class TEST1
  Public ReadOnly TanuTanuForm As New Form1()
  Public Sub New(f As Form1)
    Me.TanuTanuForm = f
  End Sub
End Class


'【案2】Form1 は TEST1 専用という位置づけにしてしまう(デザイナと相性が悪いのが難点)
Public Class TEST1
  Private _Form1 As New Form1()
  Partial Private Class Form2
    Inherits Form
  End Class
End Class


'【案3】固有の Form1 型ではなく、汎用の Form 型を使う
Public Class TEST1
  Public ReadOnly Property Owner As Form
  Public Sub New(owner As Form)
    _Owner = owner
  End Sub
End Class

'【案4】特定のインターフェイスのみを受け付けるようにする場合
Public Class TEST1
  Private ReadOnly Foo As ITanuTanu
  Public Sub New(foo As ITanuTanu)
    Me.Foo = foo
  End Sub
End Class
Public Interface ITanuTanu
End Interface
Partial Public Class Form1
  Inherits Form
  Implements ITanuTanu
End Class
Partial Public Class Form2
  Implements ITanuTanu
  Inherits Form
End Class
[ 親 91879 / □ Tree ] 返信 編集キー/

▲[ 91879 ] / ▼[ 91888 ]
■91881 / 1階層)  Re[1]: Form、データテーブル、クラス構築の方法について
□投稿者/ とっちゃん (613回)-(2019/08/08(Thu) 10:42:07)
No91879 (TanuTanu さん) に返信
> 改良すべき点がありましたらご教授をお願い致します。
>
ここに載ってるのだけだとすると。。。

> Public Sub New(frm As Form)

ここは、
Public Sub New( frm As Form1 )
でもよいと思いますよ。
欲しいのは、Form1 だけで、Form2 とか Form3 とかが来ても困るんですよね?
受け取りたいものを明示できるならできるだけ明示したほうが不具合になりにくいです。

あとは、DataSetや、DataTable がどういう内容なのか?
TEST1〜5 がそれに対して具体的に何をしているのか?
というのがわからないと「改良」したほうが良いかどうかはわからないです。

[ 親 91879 / □ Tree ] 返信 編集キー/

▲[ 91881 ] / 返信無し
■91888 / 2階層)  Re[2]: Form、データテーブル、クラス構築の方法について
□投稿者/ TanuTanu (47回)-(2019/08/08(Thu) 14:11:23)
TanuTanu さんの Web サイト
とっちゃん様、魔界の仮面弁士様

ご指導ありがとうございます。
本当に毎々ご親切にして頂き感謝するばかりでございます。

システムイメージは下記となります。

■全体像

Form1:メニュー画面(システム稼動ボタン実装、データセット実装)
 炉orm2:設定画面

・システムクラス:TEST1
・その他クラス:TEST2〜5


■動作

システム稼動ボタンにてシステムクラスのインスタンス作動

システムクラスのインスタンスが主体的に動作し必要に応じて
TEST2〜5のインスタンスを作成し動作させます。

**************************

解釈としては、Form1にDataSet1を読書きするプロパティを作り、
プロパティを通してTEST1から読書きする形に変更で解決すると
思ってよいでしょうか?

宜しくお願いいたします。
[ 親 91879 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -