2

私は単一責任の原則をよりよく守ろうとしていますが、データベースと通信するための一般的なクラス設計をどのように構成するかを理解するのに問題があります。簡略化されたバージョンでは、基本的に次のものを含むデータベースがあります。

メーカー<==プローブ<==>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);
}

ここには多くの問題があります。

  1. Databaseやりすぎです。
  2. これらのオブジェクトは、実際に読み取ったときに不変である可能性があります。唯一の問題は挿入後です。割り当てられたIDがわかりません。また、挿入されたオブジェクトは廃止されました。
  3. クラスがから情報を取得する必要があるときはいつでも、Database特定のクエリを処理するために別のGetメソッドを追加する必要があります。

私はここで正しい実装がどうなるかについて本当に途方に暮れています。改善のための私の唯一の本当のアイデアは、データベースオブジェクトのある種の基本インターフェースですが、それは挿入にしか役立たないかもしれません...

public interface IDatabaseObject
{
    void Insert(Database db);
    bool Delete(Database db);
}

これを実際に実装するための良い方法は何ですか?

4

2 に答える 2

4

SRP(または他の種類の正常なパターン)を維持しながらDBを操作するための最良の解決策は、ある種のORM(たとえば、NHibernate)を使用することです。

これにより、DBとの間で手動でクラスをトスする代わりに、クラスをそのまま操作できるようになります。

たとえば、NHを使用すると、クラスは次のようになります。

public class Manufacturer
{
  public string Name { ... }
  public IList<Probe> Probes { ... }
}

public class Probe
{
  public string Name { ... }
  public int Elements { ... }
  public ProbeSettings Settings { ... }
}

public class ProbeSettings
{
  public int RandomSetting;
}

GetProbesFromManufacturerご覧のとおり、 Manufacturer内でコレクションをナビゲートできるため、すでに必要はありません。

また、ORMはオブジェクトIDを管理して保存します。したがって、必要なのは、LoadById / LoadAllのような少数の固定数の一般的なメソッドだけです。これらのメソッドは、データアクセスであるクラスSRPにうまく適合します。また、DBへの複雑で構成可能なクエリごとにクラスが必要になる可能性があります。

于 2010-01-20T21:29:32.977 に答える
2

ORMを探しているようです。C#で作業しているので、.NETFrameworkの一部としてLinqToSQLにアクセスできると仮定します。Linqは、基本的なCRUD操作を管理する限り、あなたが探していることを実行できます。同様のプロジェクトもチェックする価値があり、CastleActiveRecordNHibernateです。

于 2010-01-20T21:27:46.040 に答える