私は単一責任の原則をよりよく守ろうとしていますが、データベースと通信するための一般的なクラス設計をどのように構成するかを理解するのに問題があります。簡略化されたバージョンでは、基本的に次のものを含むデータベースがあります。
メーカー<==プローブ<==>ProbeSettings
プローブにはメーカーがあります。プローブには1セットの設定があります。関連するオブジェクトはアプリケーション全体でアクセスされ、率直に言って、現在の実装は混乱しています。
現在、通信とオブジェクトがどのように実装されているかについての一般的な見方は次のとおりです。
public class Manufacturer
{
public int ID; // Primary key, auto-incrementing on insert
public string Name;
}
public class Probe
{
public int ID; // Primary key, auto-incrementing on insert
public int ManufacturerID;
public string Name;
public int Elements;
}
public class ProbeSettings
{
public int ProbeID; // Primary key, since it is unique.
public int RandomSetting;
}
// This class is a mess...
public static class Database
{
public static string ConnectionString;
public static void InsertManufacturer(Manufacturer manuf); // ID would be ignored here, since it's auto-incrementing.
public static void InsertProbe(Probe probe); // Again, ID generally ignored.
public static void InsertProbeSettings(ProbeSettings probeSet);
public static Manufacturer[] GetAllManufacturer();
public static Probe[] GetProbesFromManufacturer(int manufacturerID);
public static Probe[] GetProbesFromManufacturer(Manufacturer manuf);
}
ここには多くの問題があります。
Database
やりすぎです。- これらのオブジェクトは、実際に読み取ったときに不変である可能性があります。唯一の問題は挿入後です。割り当てられたIDがわかりません。また、挿入されたオブジェクトは廃止されました。
- クラスがから情報を取得する必要があるときはいつでも、
Database
特定のクエリを処理するために別のGetメソッドを追加する必要があります。
私はここで正しい実装がどうなるかについて本当に途方に暮れています。改善のための私の唯一の本当のアイデアは、データベースオブジェクトのある種の基本インターフェースですが、それは挿入にしか役立たないかもしれません...
public interface IDatabaseObject
{
void Insert(Database db);
bool Delete(Database db);
}
これを実際に実装するための良い方法は何ですか?