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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

1回答

2296閲覧

C#で、別のクラスを経由して複数の値を渡したい

K_Hirata

総合スコア0

C#

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/10/01 10:30

前提・実現したいこと

Dataクラスに格納された値を、Managerクラスを経由し、Formクラスに渡すプログラムを作成しています。
ManagerはDataとFormの値を仲介するだけで、値の加工は行いません。

FormがDataから値を取得する際に、以下の様な3つの方法を思いついたのですが、どの方法が正しいのか判断が付きません。
どの方法が正しいのか、もしくは、他に正しい値の渡し方があれば教えて下さい。

1、ManagerでDataの値を取得するメソッドを個別に作成し、Formから呼び出す。
2、outパラメータを使って、一括で呼び出す。
3、DataのインスタンスをFormに渡して処理する。

発生している問題・エラーメッセージ

それぞれで以下のような問題がありました。

1、『ManagerでDataの値を取得するメソッドを個別に作成し、Formから呼び出す』方法
→Managerクラスで、個別にメソッドを作るのが大変。

2、『outパラメータを使って、一括で呼び出す』方法
→引数が膨大になる。

3、『DataのインスタンスをFormに渡して処理する』方法
→一番楽だったが、この方法が正しいのかわからない。

実際のコードではDataクラスのフィールドが10~20程度あるので、1と2の方法はかなり難しいのではないかと思いました。

該当のソースコード

C#

1 // メインフォーム 2  public partial class Form1 : Form 3 { 4 Manager manager = new Manager(3); 5 6 int resultInt; // int型の結果 7 string resultString; // string型の結果 8 bool resultBool; // bool型の結果 9 10 public Form1() 11 { 12 InitializeComponent(); 13 ShowData(); 14 } 15 16 // 結果を表示する処理 17 public void ShowData() 18 { 19 // 個別にメソッドを呼び出す方法(方法1) 20 for(int i=0; i<3; i++) 21 { 22 resultInt = manager.GetDataInt(i); 23 resultString = manager.GetDataString(i); 24 resultBool = manager.GetDataBool(i); 25 Console.WriteLine($"【{i}】{resultInt},{resultString},{resultBool}"); 26 } 27       // outを使用して一括で値を取得する方法(方法2) 28 for (int i = 0; i < 3; i++) 29 { 30 manager.GetAllData(i, out resultInt, out resultString, out resultBool); 31 Console.WriteLine($"【{i}】{resultInt},{resultString},{resultBool}"); 32 } 33 // インスタンスを受け取る方法(方法3) 34 for (int i = 0; i < 3; i++) 35 { 36 var data = manager.GetClass(i); 37 38 resultInt = data.DataInt; 39 resultString = data.DataString; 40 resultBool = data.DataBool; 41 Console.WriteLine($"【{i}】{resultInt},{resultString},{resultBool}"); 42 } 43 44 } 45 }

C#

1 // DataクラスとFormクラスを仲介するクラス 2 class Manager 3 { 4 List<Data> data = new List<Data>(); // Dataインスタンスの格納用リスト 5 6 // コンストラクタ 7 public Manager(int value) 8 { 9 for(int i=0; i<value; i++) 10 { 11 data.Add(new Data(i)); 12 } 13 } 14 15 // int型の値を取得する処理(方法1) 16 public int GetDataInt(int number) 17 { 18 return data[number].DataInt; 19 } 20 21 // string型の値を取得する処理(方法1) 22 public string GetDataString(int number) 23 { 24 return data[number].DataString; 25 } 26 27 // bool型の値を取得する処理(方法1) 28 public bool GetDataBool(int number) 29 { 30 return data[number].DataBool; 31 } 32 33 // outを使用して一括で値を取得する処理(方法2) 34 public void GetAllData(int number, out int dataInt, out string dataString, out bool dataBool) 35 { 36 dataInt = data[number].DataInt; 37 dataString = data[number].DataString; 38 dataBool = data[number].DataBool; 39 } 40 41 // Dataのインスタンスを渡す処理(方法3) 42 public Data GetClass(int number) 43 { 44 return data[number]; 45 } 46 47 }

C#

1 // データを格納するクラス 2 class Data 3 { 4 public int DataInt { get; set; } 5 public string DataString { get; set; } 6 public bool DataBool { get; set; } 7 8 // コンストラクタ 9 public Data(int number) 10 { 11 DataInt = number; 12 DataString = number.ToString(); 13 DataBool = number > 0; 14 } 15 }

試したこと

特になし。

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

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

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

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

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

gentaro

2020/10/01 12:23 編集

> どの方法が正しいのか、もしくは、他に正しい値の渡し方があれば教えて下さい。 回答不能問題です。 「正しさ」の基準を「第三者が理解できる形で」明示してください。 特に基準がない場合、プログラムにバグがなく完全にあなたの意図通りに動いている限り、どのような実装をしても「正しい」です。
退会済みユーザー

退会済みユーザー

2020/10/02 01:48

コードを書く前に、何故Managerを挟んでいるかとか、具体的にどういうデータをやり取りしているか自分で正しくイメージ出来て人に伝えられないとダメです。
K_Hirata

2020/10/04 03:30 編集

変身が遅くなり申し訳ありません。 >>gentaro様 初心者なので、「正しさ」をうまく表現出来ないのですが、このプログラムは今後、別のフォームや、値を加工するクラスを追加する予定です。 ですので、「追加や変更に伴う修正をできる限り減らしたい」、「後からコードを見て値の処理の構造が理解しやすい」の2つの視点から、正しい値の受け渡しの方法を教えていただきたいです。 >>radian様 Managerクラスを挟んでいるのでは、将来的に別のフォームやクラスを追加して、値のやり取りを増やす際に、「Managerクラスを挟んでおけば、処理が複雑にならないのでは?」と考えたためです。 (フォームが3つある時に、それぞれが個別にDataクラスにアクセスしたら混乱するという考えです) 具体的なデータのやり取りについてですが、すみません、「具体的なデータ」の意味がよく分かりません。 ソフトで行いたいことは、ファイルから数値と文字列を取り出してDataクラスに格納、フォームからの操作でそれらを呼び出して表示するといったものです。
gentaro

2020/10/04 03:58 編集

「正しい」という表現を使わず、その2つの視点における最適解(あるいは最適解に至るための考え方)を知りたい、という形に質問文を修正すれば、質問方法として納得はできます。
退会済みユーザー

退会済みユーザー

2020/10/04 04:10 編集

> 具体的なデータのやり取りについてですが、すみません、「具体的なデータ」の意味がよく分かりません。 > ソフトで行いたいことは、ファイルから数値と文字列を取り出してDataクラスに格納、フォームからの操作でそれらを呼び出して表示するといったものです。 まずファイルという情報が後付けで出てきたので、貴方以外の見ている人にはここでやっとDataの元のデータがファイルなのかというのが判った訳です。しかし、ファイルの形式も、フォームにどう対応させたいのかも、どういうデータが入っているかも具体的な事が何も明らかになっていません。(ファイルが複数か、Managerはそれをまとめ上げないといけないのか) この状態で、正しいかとうかという漠然とした質問を投げられても、誰も適切な回答は返せないでしょう。要は、足りない情報で他人に設計を丸投げしているのです。 1、2、に問題があると判って居るなら、とりあえず3でやってみればよいのではないでしょうか。
guest

回答1

0

変数アクセス用のクラスを定義して、そのインスタンスを各フォームに渡してアクセスさせればいいでしょ。
その変数の実体はどこにあるかなんか意識する必要もないですし。

投稿2020/10/01 10:49

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問