C#(OOP)嵌套的Business Objects

时间:2009-08-20 00:27:48

标签: c# asp.net oop

我今天收到了一位同事发来的电子邮件。我的问题是准确的。嵌套Business Objects是不好的做法?任何人都可以对此发光吗?

嵌套对象 在C#中创建任何变量时,它会占用Web服务器上的一块内存。由于我们将在同一台服务器上运行许多工具,因此如果我们不打算使用它们,确保我们不创建对象更为重要。

使用上面的第二个员工对象作为示例...如果我们还需要知道员工主管ID ..(这是所有工具都填充和使用),我们希望确保Employee类包含适当的信息,并考虑工具中的内存和进程。

我们将'supervisorId'字符串变量添加到Employee类,并添加适当的Getters和Setters。

另一方面,我们希望避免在员工对象中嵌套另一个对象。如:     公共类员工{         private string firstName;         private string 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对象的'Supervisor'实例中的值,但是变量是在内存中创建的。这可能会对性能产生潜在的灾难性影响。

在某些情况下,需要嵌套对象:         示例:( Category :: Question)每个类别可以分配一个问题的数组列表。

5 个答案:

答案 0 :(得分:8)

对您的一般性问题的简短回答

  

嵌套业务对象是不是很糟糕?

不是。

很长的答案是,听起来你的团队正在遭受过早的优化。您需要设计业务对象以镜像业务域。您的业​​务领域中的所有行为都应在您的业务层中进行说明。一旦达到目标,就可以进行性能测试。实际测量系统的哪些部分太慢,然后优化这些部分。在你甚至没有机会完成它之前,不要陷入预先优化你的业务逻辑的境地。

设计并实施,然后进行性能测试,然后在发现不可接受的缓慢时进行优化。

答案 1 :(得分:0)

我的意见是,只有当你经常在嵌套对象上调用方法时才应该嵌套。

如果你要对嵌套对象做的只是获取它的一些属性,那么你不应该嵌套它并且应该直接存储属性。

答案 2 :(得分:0)

从您的代码示例中可以看出,您正在外部设置主管Employee对象(即通过属性设置器),所以我认为这个设计没问题。如果您每次创建“外部”Employee对象时都自动实例化主管对象(例如,通过命中数据库),那么您可能会遇到潜在的问题。

答案 3 :(得分: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,因为如果没有信息,模型就无法完成。他推荐的是在ModelBO而不是MfgBO或TypeBO,我们应该有一个int MakeID变量,字符串MakeName,int DeviceTypeId,字符串DeviceTypeName等,基本上重新输入MfgBO和TypeBO对象中已经存在的字段。

对于我有限的OOP知识,使用MfgBO和TypeBO更有意义。哪种方式更适合我个人的知识?在MakeBO中使用MfgBO和TypeBO实际上会使用更多内存并“可能使服务器崩溃”吗?

答案 4 :(得分:0)

只有在明确访问对象时才能创建对象。

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

        return _Item; 
    }
}
private BusinessObject _Item;