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

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

ただいまの
回答率

91.01%

  • C#

    5772questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 3
  • VIEW 117

meshkit

score 62

前提・実現したいこと

いつもお世話になっております。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

[案1] BaseModelに
public static string nowmode="";
AModelのコンストラクタで、
BaseModel.nowmode="A";
BModelのコンストラクタで、
BaseModel.nowmode="B";

OperationWindowで、
if (BaseModel.nowmode=="A")
else if (BaseModel.nowmode=="B")
で判定。
[案2] BaseModelに
        public virtual bool WasThis
        {
            get;
            set;
        }
AModelのコンストラクタで、
        public override bool WasThis
        {
            get
            {
                return base.WasThis;
            }

            set
            {
                base.WasThis = value;
            }
        }

OperationWindowで、
var bools = new List<bool>();
bools.Add(AModel.WasThis);
bools.Add(BModel.WasThis);
bools.Add(CModel.WasThis);

string wasmode="A";
for(int i=0;i < bools.Count;i++){
    if (bool[i]){
        if (i==0)    wasmode="A";
        else if (i==1)    wasmode="B";
        else if (i==2)    wasmode="C";
    }
}
で判定。

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

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

Visual Studio 2015 Pro

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

一例とご理解ください。

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

private string GetModelName(BaseModel model)
{
    if(model is AModel)
    {
        return "A";
    }
    else if(model is BModel)
    {
        return "B";
    }
    else if(model is CModel)
    {
        return "C";
    }
}

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

    public class OperationModel
    {
        public OperationModel() { return; }

        public virtual string Output() { return string.Empty; }
    }

    public class AOperationModel : OperationModel
    {
        public override string Output()
        {
            var result = "Aのルートです。";
            return result;
        }
    }

    public class BOperationModel : OperationModel
    {
        public override string Output()
        {
            var result = "Bのルートです。";
            return result;
        }
    }

    public class COperationModel : OperationModel
    {
        public override string Output()
        {
            var result = "Cのルートです。";
            return result;
        }
    }

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

    private OperationModel ChoiceOperationModel(BaseModel model)
    {
        if (model is AModel)
        {
            return new AOperationModel();
        }
        else if (model is BModel)
        {
            return new BOperationModel();
        }
        else if (model is CModel)
        {
            return new COperationModel();
        }
        else
        {
            return new OperationModel();
        }
    }

    // - - - - - - - - - - - - - - - - - - - - 
    // ChoiceOperationModel使用例
    var a = new AModel();
    Console.WriteLine(ChoiceOperationModel(a).Output());
    // 出力 : Aのルートです。
    var b = new BModel();
    Console.WriteLine(ChoiceOperationModel(b).Output());
    // 出力 : Bのルートです。 

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    5772questions

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

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