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

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

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

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

Q&A

解決済

1回答

979閲覧

画面を遷移する場合のヒストリーの保持方法、どこにどうもつとスマートでしょう?

meshkit

総合スコア72

C#

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

0グッド

3クリップ

投稿2018/01/17 02:22

###前提・実現したいこと
いつもお世話になっております。Classの設計について相談に乗ってください。
画面を遷移する場合のヒストリーの保持方法です。
Visual Studio 2015 でC#でFormアプリケーションを作っています。

下記のようにWindowを遷移するプロジェクトを作っています。
スタートメニュー画面で設定を選択し、複数のそれぞれ異なる設定Windowで設定し、その設定にしたがって処理(Operation)をし、結果を出力するプログラムです。
画面を遷移するため、OperationWindow(とそのあとのOutput)でどの画面から来たかを判定する必要があります。
この判定は、どこにどのようにもつのがスマートでしょう?

[画面(View)]-------------------------
StartMenuWindow(Main)

SettingAWindow
SettingBWindow
SettingCWindow

OperationWindow
(Output)

[Model]------------------------------
BaseModel
AModel
BModel
CModel
OperationModel

C#

1[1] BaseModelに 2public static string nowmode=""; 3AModelのコンストラクタで、 4BaseModel.nowmode="A"; 5BModelのコンストラクタで、 6BaseModel.nowmode="B"; 7 8OperationWindowで、 9if (BaseModel.nowmode=="A") 10else if (BaseModel.nowmode=="B") 11で判定。

C#

1[2] BaseModelに 2 public virtual bool WasThis 3 { 4 get; 5 set; 6 } 7AModelのコンストラクタで、 8 public override bool WasThis 9 { 10 get 11 { 12 return base.WasThis; 13 } 14 15 set 16 { 17 base.WasThis = value; 18 } 19 } 20 21OperationWindowで、 22var bools = new List<bool>(); 23bools.Add(AModel.WasThis); 24bools.Add(BModel.WasThis); 25bools.Add(CModel.WasThis); 26 27string wasmode="A"; 28for(int i=0;i < bools.Count;i++){ 29 if (bool[i]){ 30 if (i==0) wasmode="A"; 31 else if (i==1) wasmode="B"; 32 else if (i==2) wasmode="C"; 33 } 34} 35で判定。

ほかになにかもっといいアイデアありますか?

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2015 Pro

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

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

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

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

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

guest

回答1

0

ベストアンサー

一例とご理解ください。

[回答.1]
案1をもとに考え、判定処理を行うとします。
BaseModelを基底クラスとして各Model子クラスを作るなら、パラメータ(nowmode)を持たせる必要はないと思います。以下のように型の判定だけで分岐することは可能です。
なお、この場合以下の関数はOperationModelに記述するか、別のヘルパークラスを設けるかになると思います。

C#

1private string GetModelName(BaseModel model) 2{ 3 if(model is AModel) 4 { 5 return "A"; 6 } 7 else if(model is BModel) 8 { 9 return "B"; 10 } 11 else if(model is CModel) 12 { 13 return "C"; 14 } 15} 16

[回答.2]
さらにもう少し踏み込んで考えると、OperationModelクラスも継承させる方法が考えられます。(Outputが仮に結果出力用の関数としてください)

C#

1 public class OperationModel 2 { 3 public OperationModel() { return; } 4 5 public virtual string Output() { return string.Empty; } 6 } 7 8 public class AOperationModel : OperationModel 9 { 10 public override string Output() 11 { 12 var result = "Aのルートです。"; 13 return result; 14 } 15 } 16 17 public class BOperationModel : OperationModel 18 { 19 public override string Output() 20 { 21 var result = "Bのルートです。"; 22 return result; 23 } 24 } 25 26 public class COperationModel : OperationModel 27 { 28 public override string Output() 29 { 30 var result = "Cのルートです。"; 31 return result; 32 } 33 }

上のようなクラスを準備したうえで、先に示した条件判定のコードと組み合わせて出力を切り替えます。

C#

1 private OperationModel ChoiceOperationModel(BaseModel model) 2 { 3 if (model is AModel) 4 { 5 return new AOperationModel(); 6 } 7 else if (model is BModel) 8 { 9 return new BOperationModel(); 10 } 11 else if (model is CModel) 12 { 13 return new COperationModel(); 14 } 15 else 16 { 17 return new OperationModel(); 18 } 19 } 20 21 // - - - - - - - - - - - - - - - - - - - - 22 // ChoiceOperationModel使用例 23 var a = new AModel(); 24 Console.WriteLine(ChoiceOperationModel(a).Output()); 25 // 出力 : Aのルートです。 26 var b = new BModel(); 27 Console.WriteLine(ChoiceOperationModel(b).Output()); 28 // 出力 : Bのルートです。

以上です。
meshkit様のご意向に沿えていない場合は申し訳ありません。
MVC、MVVMの概念には疎いため、それらの概念とマッチしない場合もすみません。
少しでもお力になれれば幸いでございます。

投稿2018/01/18 02:14

g_uo

総合スコア212

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問