2009-08-20 17 views
3

今日、同僚から次の電子メールが届きました。私の質問はこれが正確です。ネストビジネスオブジェクトは悪い練習ですか?誰もこれに輝くことができますか?C#(OOP)ネストされたビジネスオブジェクト

ネストされたオブジェクト C#で変数を作成すると、Webサーバー上のメモリが占​​有されます。同じサーバー上で多くのツールを実行するので、オブジェクトを使用する予定がない場合は、オブジェクトを作成しないようにすることがさらに重要です。

上記の2番目の従業員オブジェクトを例として使用する...従業員のスーパーバイザIDを知る必要がある場合(そして、すべてのツールが投入され使用されていた場合)、Employeeクラスに適切な情報また、ツールのメモリとプロセスを考慮しています。

Employeeクラスに 'supervisorId'文字列変数を追加し、適切なGettersとSettersを追加します。

私たちは、従業員オブジェクト内の別のオブジェクトを入れ子にすることを避けたいと考えています。そのような: public class Employee { プライベート文字列firstName; プライベート文字列lastName; プライベート文字列empId; 社員従業員の監督者。この場合

public string FirstName { 
     get { return firstName; } 
     set { firstName = value; } 
    } 

    public string LastName { 
     get { return lastName; } 
     set { lastName = value; } 
    } 

    public string EmpId { 
     get { return empId; } 
     set { empId = value; } 
    } 

public Employee Supervisor{ 
    get { return supervisor; } 
    set { supervisor = value; } 
} 
    } 

我々は常にEmployeeオブジェクトの「スーパーバイザー」インスタンス内の値を使用することはできませんが、変数がメモリ内に作成されます。これは、パフォーマンスに潜在的に壊滅的な影響を与える可能性があります。

オブジェクトの入れ子が必要な場合があります。 例:(カテゴリ::質問)各カテゴリには、割り当てられた質問の配列リストがあります。

答えて

8

のあなたの一般的な質問への短い答えは、巣のビジネスオブジェクトへのそれは悪いですか?

はありません。

長い答えは、あなたのチームが早すぎる最適化に苦しんでいるような音です。ビジネス・ドメインをミラーリングするビジネス・オブジェクトを設計する必要があります。ビジネスドメイン内のすべての動作をビジネスレイヤに例示する必要があります。その目標を達成すれば、パフォーマンステストを行うことができます。実際にシステムのどの部分が遅すぎるかを測定し、それらの部分を最適化します。ビジネスロジックの事前最適化に巻き込まれないようにしてください。

設計と実装の後に、パフォーマンステストとが許容できない遅さを見つけたら最適化します。

0

私の考えでは、ネストされたオブジェクトに対してメソッドをルーチン的に呼び出すときにのみネストする必要があります。

ネストされたオブジェクトで行うことは、そのプロパティをいくつか取得することだけです。ネストしたオブジェクトをネストしてはならず、プロパティを直接格納する必要があります。

0

あなたのコードサンプルから、スーパーバイザEmployeeオブジェクトを外部(つまりプロパティ設定ツール)に設定しているように見えるので、このデザインは問題ないと思います。「外部」従業員オブジェクトを作成するたびに、スーパーバイザオブジェクトを自動的にインスタンス化する(たとえば、データベースにヒットする)場合、潜在的な問題が発生します。

0

私は、次のビジネスオブジェクト(データ転送オブジェクト)は、電子メールを引き起こしたと考えている:モデルは情報なしで完全ではない可能性があるため

/// <summary> 
    /// Manufacturer Data Transfer Object 
    /// </summary> 
    public class MfgBO { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public bool Active { get; set; } 
    } 
    } 

public class TypeBO { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public bool Active { get; set; } 
    } 


public class ModelBO { 
     #region Private Variables 

     private int mmtId = -1; 
     private int id = -1; 
     private string name = String.Empty; 
     private bool active = false; 
     private MfgBO mfg = new MfgBO(); 
     private TypeBO type = new TypeBO(); 

     #endregion 
     // Getter and setters below 

この見れModelBOはMfgBOとTypeBOを保持しています。彼が推奨しているのは、MfgBOまたはTypeBOを持つ代わりにModelBOにあり、int MakeID、string MakeName、int DeviceTypeId、string DeviceTypeNameなどの変数を持つ必要があり、MfgBOおよびTypeBOオブジェクトに既に存在するフィールドを再タイピングします。

私の限られたOOP知識には、MfgBOとTypeBOを使用する方が理にかなっています。私自身の個人的な知識のために良い方法はどれですか? MakeBOのMfgBOとTypeBOが実際にはより多くのメモリを使用し、 "潜在的にサーバをクラッシュさせる"ことになりますか?

+0

モデルの追加プロパティではなく別のオブジェクトとしてMfgとTypeを使用する方法では、オブジェクトごとのメモリオーバーヘッドが小さいため、より多くのメモリを消費しますが、かなりです簡単。サーバーがクラッシュする場合は、最初にサーバーをあまりにも大きく負荷していることになります。 – MusiGenesis

+0

これらの個別のオブジェクトを作成することで、モデルごとに複数のタイプが存在するか、モデルごとに複数のMfgが存在する状況を容易にリファクタリングできます。 – MusiGenesis

+0

私はジョセフの答えが正しいと思います。あなたの同僚は、まったくの愚かさに接する時期尚早な最適化に苦しんでいるだけです。 – MusiGenesis

0

明示的にアクセスする場合にのみ、オブジェクトを作成できます。

public BusinessObject Item 
{ 
    get 
    { 
     if (_Item == null) 
      _Item = new BusinessObject(); 

     return _Item; 
    } 
} 
private BusinessObject _Item;