質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

4084閲覧

クラス設計について

mat777

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2017/01/20 04:39

C#初心者です。

例えば、社員マスターをメンテする画面、社員マスターを使って給与計算を行う
画面を作る場合
・社員マスターを管理するクラスを作成(ファイルからの読み出し・保存を担当)
・frmMenteにDataGridViewを作って、そこで社員マスターデータを表示・編集
・frmKyuuyoが社員マスターを読み出して給与リストを表示・印刷
とするのかなと想像しています。

その場合、社員マスター管理クラス と frmMenteのDataGridView 間のデータの
やりとりはどのような感じになるのでしょうか?
社員マスター管理クラス内では例えばDataTableでデータを取り扱うとして、
frmMainから社員マスター管理クラスに、frmMainに実体があるDataTableを
渡してコピーしてもらう、とか。
そもそも、クラスの分担の考え方が違いますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

予備知識が分からないため質問の内容が曖昧です。
他の画面のコントロールに直接アクセスする、という設計は普通ありません。
このため、FrmMente(これFrmSyainでは…)のDataGridViewにFrmKyuuyoからアクセスするのは不自然です。

また、ファイルからの読み出し、保存を担当とありますがデータベースの利用の予定等はありませんか?

自分の場合マスター管理クラスを給与、社員それぞれに作り、対応する画面を取り付ける形にします。


追記

質問の内容が把握できたので自分も回答のお手伝いを…

社員マスタークラスがNGと判断したデータの場所をfrmMenteに伝えるのって難しくないでしょうか?

DataAnnotationsを使うというのはこういうものです。

public class Employee { [Display(Name="氏名")] public string Name { get; set; } [Display(Name="カナ")] [RegularExpression(@"[ァ-ヶ]+", ErrorMessage = "全角カタカナのみ入力できます。")] public string Kana { get; set; } [Display(Name="社員番号")] [Range(1, int.MaxValue, ErrorMessage="社員番号を設定して下さい。")] public int EmployeeNumber { get; set; } }

こういうプロパティを公開しているモデルのコレクションを、データバインドするとエラー検証を自動的にやってくれるという優れものです。もしDataGridViewが対応していれば自動的にエラーがある場合表示されると思います。自分はWindows Formを使っていないのでどのようにエラー表示されるかまではわかりませんが…

もしもDataAnnotationsが使える場合は、Employeeモデルが直接上限値の範囲などを知っている状態なのでFormMenteは上限値などを知る必要がないわけです。

あるフォームがそのクラスを利用して画面表示する場合に、「社員マスター管理クラス」からどうやって

データを受け取る事が正しい姿か知りたいと思います。

基本的に、より中核的な部分に対して、より外側のクラスからアクセスするのが基本です。
中核的な部分とはビジネスドメインのことであり、この場合社員管理クラスのことです。
そして、外側のクラスとはFormMenteなど画面クラスのことです。

FormMente側が管理クラスを参照するのはOKです。

最近はこの関係が何事も前提になっていて、先ほど言っていたデータバインドなんかも、モデルを直接操作すれば画面に反映される、という形になっています。DataTableは画面側のクラスですから、社員管理マスタにDataTableを渡す、ということはあまりしませんね。

投稿2017/01/20 04:57

編集2017/01/21 17:09
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mat777

2017/01/20 05:11

ありがとうございます。 質問が曖昧で申し訳ございません。 下から3行 > frmMainから社員マスター管理クラスに、frmMainに実体があるDataTableを > 渡してコピーしてもらう、とか。 正しくは frmMenteから社員マスター管理クラスに、frmMenteに実体があるDataTableを 渡してコピーしてもらう、とか。 です。 「社員マスター管理クラス」は画面を持たない、ファイルへのI/O(データチェック含む) の役割を持たせようと考えてます。 > 自分の場合マスター管理クラスを給与、社員それぞれに作り、対応する画面を取り付ける形にします。 このシステムに唯一登場するデータとして、社員マスター.csvがあり、それを管理するクラスを 「社員マスター管理クラス」と考えています。 あるフォームがそのクラスを利用して画面表示する場合に、「社員マスター管理クラス」からどうやって データを受け取る事が正しい姿か知りたいと思います。
haru666

2017/01/21 17:13

直接社員マスター管理クラス…を、画面が参照し、操作する形で良いと思います。 たぶん検証内容には「一意な社員番号の管理…」とかも含まれていると思うので、実コードは省略しましたが…
mat777

2017/01/21 23:20

有難う御座います。 DataAnnotations、非常に便利そうです。判りやすい解説有難う御座います。 > DataTableは画面側のクラスですから、社員管理マスタにDataTableを渡す、 > ということはあまりしませんね。 管理クラスがcsvからデータを読み出して、自分が持つListなりDataTableなりに格納して、それをpublicにすることでフォームがそれを直接触る(バインドする)、という考えがオブジェクト指向的にNGかと思ってました。 実際はあまり厳密に考える必要はないのかもしれませんが、お手本的な設計とはどのような物かと、また、実際の現場ではどう処理されているのかが知りたくて。
haru666

2017/01/22 14:30

オブジェクト指向的には問題無いでしょう。データのまとまりというオブジェクトを操作して、操作された側がValidationを行い、保存まで行うわけですから。そのためにモデルとバインドするという手法が発展してきているわけですし。 ただ状態を持つということはあまりオススメ出来ないので、プロパティを公開するよりも一連のデータをやり取りするメソッドにしてしまうことがほとんどです。
mat777

2017/01/23 01:57

なるほど、問題ないのですね。ありがとうございます。 最後にひとつだけ。 > ただ状態を持つということはあまりオススメ出来ないので、プロパティを公開するよりも一連のデータ > をやり取りするメソッドにしてしまうことがほとんどです。 この部分だけ教えて頂けないでしょうか?いまひとつピンときませんでした。。 今回のケースなどで具体例など挙げてもらうと助かります。
haru666

2017/01/23 02:13

…いや、止めましょう。この話はちょっと複雑で自分でも説明するのが難しかったです。 社員管理マスタが内部で保持している情報を直接公開してしまうと、複数のフォームから社員マスタ参照するのは問題が起きそうだよね、ぐらいに思って頂ければ。。。
mat777

2017/01/23 04:15

ありがとうございます。 色々あるんですね。頑張って勉強します。
guest

0

社員マスター管理クラス と frmMenteのDataGridView 間のデータの

やりとりはどのような感じになるのでしょうか?

社員を社員マスター管理クラスで扱うのなら、frmMenteのDataGridViewが社員の一覧だと思うので、社員マスター管理クラスのコレクションをDataSourceに設定してあげるようにすればよいだけなので、なにも難しく考えることないと思いますよ

あと普通こういうのはデータベースにして、社員マスター管理クラスにあたる社員テーブルと、給与関係の情報を扱う給与テーブルにして、社員IDあたりでリレーションするようにする感じになるかと

投稿2017/01/20 05:49

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mat777

2017/01/20 06:15

ありがとうございます。 という事は、社員マスター管理クラスが ファイルから読み込んだデータを格納する メンバ変数(リスト)をfrmMenteやfrmKyuuyoに対してpublicで見せてしまう、ということでしょうか? で、DataGridViewにバインドして表示・編集はお任せ、一部のデータだけ給与計算で利用したければ そのデータのプロパティを提供する、といった形が一般的なのでしょうか? でも、DataGridViewで好き勝手変更されて、その妥当性を判断するには、社員マスタークラスに 「妥当性判断メソッド」等を別途に作って、それをコールするボタンをfrmMenteに配置する? だとしても社員マスタークラスがNGと判断したデータの場所をfrmMenteに伝えるのって難しくないでしょうか?
dojikko

2017/01/20 07:05

> 社員マスター管理クラスが ファイルから読み込んだデータ(以下略) やり方はいろいろあろうかと思いますが、もし社員マスター管理クラスで社員のリストを管理するようにするならそうならざるを得ないですよね
dojikko

2017/01/20 07:06

> DataGridViewで好き勝手変更されて、その妥当性を判断するには(以下略) 普通入力されたデータをそのまま受け入れませんよね そしたらValidationは要りますよね ただValidationはユーザーがコールするというより、変更を検知して行われるようにすべきでしょうね
dojikko

2017/01/20 07:16

> だとしても社員マスタークラスがNGと判断したデータ(以下略) 別に難しく無いと思いますよ DataGridViewならわざわざ * CellValidating ってイベントが用意されているくらいですから 他の入力コントロール(例えばTextBox)にもValidatingイベントがあります
mat777

2017/01/20 07:22

ありがとうございます。 Validationするにしても、例えばそれぞれの変数の上下限値などをDataGridViewを貼ってるfrmMenteが知る必要があると思いますが、その場合、変数のチェックを行うメソッドを全変数分、管理クラスが提供するような事をするのでしょうか?
dojikko

2017/01/20 07:24

もちろんクラス側に制約を掛ける方法もありますよね 制約はゴリゴリ書いていってもいいでしょうし、DataAnnotationsを使ってスマートにやってもいいでしょう
mat777

2017/01/21 23:19

有難う御座います。 だいぶ謎が解けてきました。 Validatingイベントを捕まえてそのセル内容のチェックを行うメソッドを用意すればいいのかな、と漠然と考えてましたが、DataAnnotationsとかいう便利機能があるんですね。 ただ、大前提としてクラスが持っている社員データ(List/DataTable)をpublicにしてフォームから直接触らせる(実際はバインドしてもらう)事が特に問題ないようですが、どちらかと言うと消極的な選択なのですかね? そもそも、そのようなクラス分けを行う設計がイマイチってとこでしょうか。
dojikko

2017/01/23 05:14

> 設計がイマイチってとこでしょうか イマイチかどうかはコンテキストに依存するのでなんともです うちではという前置きをさせていただいた上で話をさせていただくと、OOP派の方に怒られるかもですが Itemというクラス: データフィールド代わりのプロパティ 値検証のメソッド IEquatable、INotifyPropertyChangedあたりを必要に応じて Itemsというクラス: Itemのコレクション(List(T)なりObservableCollection(T) なりReadOnlyCollection(T)なり) FileIO(csv,xmlへの書き出し読み込み)はItemsに実装 みたいな感じで済ますことが多いですね
mat777

2017/01/23 07:41

なるほど~なんかスッキリする感じがします。 型の定義と実データ操作という役割分担ですか。今度そういう感じでやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問