web-dev-qa-db-ja.com

スタンドアロンアプリケーションでランタイムが使用するデータを保存する正しい方法は?

C#を使用する場合は、「チームビルダー」タイプのアプリケーションを含むプロジェクトに取り組んでいます。

簡単にするために、ユーザーが「チーム」を作成する必要があるとします。 3つのチームから選択できます。

たとえば、各チームにはキャプテン、シューター、ランナーなどの「役職」があります。

各キャプテンには、「名前」、「スキル」、「年齢」などの異なる属性を持つ3つの選択肢があります。

これを視覚的に表現するには:

  • チーム1
  • => CaptainATeam1
  • ===>名前
  • ===>スキル
  • ===>年齢

  • => CaptainBTeam1

  • ===>名前
  • ===>スキル
  • ===>年齢

  • => CaptaniCTeam1

  • ===>名前
  • ===>スキル
  • ===>年齢

  • チーム2

  • => CaptainATeam2
  • ===>名前
  • ===>スキル
  • ===>年齢

  • => CaptainBTeam2

  • ===>名前
  • ===>スキル
  • ===>年齢

  • => CaptaniCTeam2

  • ===>名前
  • ===>スキル
  • ===>年齢

現在、これらの属性はすべて事前定義されており、決して変更されません。したがって、CaptainATeam1は常に「James」、「Skillful」、「22」になります。

以上のことをすべて述べた上で、この情報は実行時に使用するために必要です。このアプリケーションは、なんらかの種類のデータベースに接続されることはなく、厳密にスタンドアロンアプリケーションとして実行されます。

私の質問は、これを行うための正しい方法は何ですか?

私が現在持っている考えは、チームとポジションごとにフラットファイルの形式でアプリケーションと共にデータをパッケージに格納し、必要に応じて実行時にアプリケーションにメモリに読み込ませることです。

しかし、これに類似したものを個別のクラス内にデータセットを作成することも検討しました(テストされておらず、メモ帳ですぐに記述されていませんが、コンセプトはそこにあります)。

class Team1


var Captain;
var Shooter;
var Runner;

DataSet ds_team1 = new DataSet();
//used to populate a dataset to be used for a DropDown style selection list
public void PopulateCaptains()

{
DataTable dt_caps = new DataTable("Capitans");

dt_caps.Columns.Add("Name");
dt_caps.Columns.Add("Skill");
dt_caps.Columns.Add("Age");


DataRow dr_cap1 = new DataRow("Cap1");
DataRow dr_cap2 = new DataRow("Cap2");
DataRow dr_cap3 = new DataRow("Cap3");

dt_caps.Rows.Add(dr_cap1);
dt_caps.Rows.Add(dr_cap2);
dt_caps.Rows.Add(dr_cap1);

dr_cap1["Name"] = "James";
dr_cap1["Skill"] = "Skillfull";
dr_cap1["Age"] = "22";

//so on and so forth.

}

上記の例は、アプリケーションのフォルダに保存されているフラットファイルをforeachループで書き込むだけではなく、コーディングが非常に面倒になることは明らかです。ただし、これにより、ユーザーがこのファイルの情報を操作できるようになり、プログラムが破損します。

それで、これに対処するための正しいアプローチは何でしょうか?

これに対処する正しい方法はありますか?

これが主観的または広義の質問のあまりに多いと考えられる場合は、私に知らせてください。そうすれば、より多くの情報を探すか、より多くの情報を提供するか、何かを明確にすることができます。

お時間ありがとうございます。

2
Gary.Taylor717

まず第一に、あなたのコードはまともで読みやすいと思います。この実装で私がここで間違っていると思われるいくつかのこと:

  1. グローバル空間でvarを使用して暗黙的に変数を定義しています。これらを実際のタイプに変更することをお勧めします。 varはローカルの暗黙的な定義のために予約されており、実際にはコンパイルされません。これについてのより詳細な説明は この質問 を参照してください。

  2. あなたがしているのは、プログラムにデータをハードコーディングすることです。これは可能な限り避けたいものです。 XMLまたはJSONのシリアライゼーション/デシリアライゼーションでうまくいくので、それを実現するためにデータベースは必要ありません。このデータをデータベースで実際に使用することをいつか決めるかもしれません。または、将来、この同じデータを別のアプリケーションで使用したい場合があります。したがって、これら2つのイベントのいずれかで、シリアル化を行うことにより、このプロセスが10倍簡単になります。 XMLシリアル化 または JSONシリアル化 を参照してください。

お役に立てれば。

3
Snoop

あなたのニーズに基づいていくつかの選択肢があります。

  1. データをハードコーディングできます。これは単体/統合テストで頻繁に行われ、このデータを保存する有効な方法です。特にBA /非開発者にとっては、変更が非常に難しくなります。
  2. なんらかのファイルに保存できます。必要に応じて、形式はJSONまたはXMLまたはCSVにすることができます。このファイルの変更を防止したい場合は、チェックサムチェックを追加して、チェックサムが異なる場合は中断できます。
  3. データベースに保存できます。これにはSQL Liteが適しています。これは軽量で高速であり、OracleやSQL Serverのような大掛かりな面倒なインストールを必要としません。時間の経過とともにデータを変更する必要がある場合は、このオプションをお勧めします。

今日のプロトタイプは明日の量産コードであることを忘れないでください。 考えるデータを変更する必要がないからといって、しないデータを変更する必要があるわけではありません。あなたはほぼ間違いなくそうするでしょう。どのソリューションを選択しても、しばらくは行き詰まっている可能性が高いため、慎重に選択してください。

3
Stephen