2009-10-10 63 views
0

我有一个班级,它返回三个属性。第一个属性依赖于某个参数,第二个属性依赖于第一个属性,第三个属性依赖于第二个属性。如何设计我的班级

实现这种类型的最佳方式是什么?对于这个类型有没有合适的设计模式?下面我粘贴了我的代码的两个版本,这两个版本都工作,我不知道哪个更好(或者我太复杂了)?

第一招:

class Initializer 
{ 
    private string lastCode; 
    private int lastPackage; 
    private int lastBox; 

    public Initializer(int machineNumber) 
    { 
     lastCode = GetLastCodeFromDatabase(machineNumber); 
     lastPackage = GetLastPackageByLastCode(lastCode); 
     lastBox = GetLastBoxByLastPackage(lastPackage); 
    } 

    public string LastCode 
    { 
     get { return lastCode; } 
    } 

    public int LastPackage 
    { 
     get { return lastPackage; } 
    } 

    public int LastBox 
    { 
     get { return lastBox; } 
    } 

    private string GetLastCodeFromDatabase(int machineNumber) 
    { 
     using (InitializerTableAdapter adapterGetLastCode = new InitializerTableAdapter()) 
     { 
      return Convert.ToString(adapterGetLastCode.GetLastCodeByMachineNumber(machineNumber)); 
     } 
    } 

    private int GetLastPackageByLastCode(string lastCode) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastPackageByLastCode(lastCode)); 
     } 
    } 

    private int GetLastBoxByLastPackage(int lastPackage) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastBoxByPackageNumber(lastPackage)); 
     } 
    } 
} 

二:

class Initializer 
{ 
    public static string LastCode(int machineNumber) 
    { 
     return GetLastCodeFromDatabase(machineNumber); 
    } 

    public static int LastPackage(string lastCode) 
    { 
     return GetLastPackageByLastCode(lastCode); 
    } 

    public static int LastBox(int lastPackage) 
    { 
     return GetLastBoxByLastPackage(lastPackage); 
    } 

    private static string GetLastCodeFromDatabase(int machineNumber) 
    { 
     using (InitializerTableAdapter adapterGetLastCode = new InitializerTableAdapter()) 
     { 
      return Convert.ToString(adapterGetLastCode.GetLastCodeByMachineNumber(machineNumber)); 
     } 
    } 

    private static int GetLastPackageByLastCode(string lastCode) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastPackageByLastCode(lastCode)); 
     } 
    } 

    private static int GetLastBoxByLastPackage(int lastPackage) 
    { 
     using (InitializerTableAdapter adapterGetLastPackage = new InitializerTableAdapter()) 
     { 
      return Convert.ToInt32(adapterGetLastPackage.GetLastBoxByPackageNumber(lastPackage)); 
     } 
    } 
} 

回答

2

其他答案已经回答了你的问题的机制,但也有一个设计问题,如果我没有指出,我会失职。

如果你的第一个例子更适合数据的含义,你最好使用一个简单的对象,它不知道它是如何存储的,还有一个ORM将它映射到数据库和从数据库映射它。据推测,你将有其他代码使用这个对象。如果你编写期望这个类的代码,在构造函数中查询数据库等,那么将很难测试和难以重用。

如果第二个更好的匹配,你应该研究依赖注入,这样你可以注入一个不同的数据源进行测试(或者当你从SQL后端更改为本地数据库等)。

1

,如果你想起来前初始化所有的变量,或只在需要时才执行它依赖。我认为最好的方式完全取决于你期望如何使用课堂。如果您将使用这些属性,并且该值不会改变,那么可以执行初始化(您的第一个选项),或者执行Lazy Loading。另一方面,如果您的属性不会被使用太多,可能是一次或两次,或者方法返回的值会因呼叫而不同,第二个选项将是最好的。如果来自函数的值变化很大,那么您无法真正进行初始化并获得预期的结果。

延迟加载是两个想法之间的一个很好的折衷方案,但只有在值不变时才能使用。当您使用Lazy Load时,如果没有人使用这些属性,则不必支付初始化变量的性能。

+0

在这个类的帮助下,我在启动时设置了我的应用程序的GUI,所以它只运行一次,我需要一次获取所有属性。 – sventevit 2009-10-10 16:20:12

1

您的代码的一个版本使用缓存值,而另一个版本直接从底层数据源中检索值。首先有更好的性能,因为往返数据源只执行一次,后者始终是最实际的数据。我认为你的情况取决于班级的使用情况。

除此之外,我想知道为什么你的域模型有这样的平面视图。这对我来说似乎不寻常。

+0

您对'我的域名模型的平面视图'有什么含义?我是新来的设计模式,这就是为什么我问这样的问题...... – sventevit 2009-10-10 16:21:22

+0

凯文进一步详细了一点。你应该有两个类:Package和Box。包装盒上有一个IList 。像NHibernate/Entity Framework这样的O/R-Mapper应该关注你的类的持久性。然后,您将使用内存方法来确定最新的方框。对于平面视图,我的意思是说对于实体的某些属性(包,盒)只有非常特定的视图,并且当您需要更多信息时,您会很容易地遇到问题。另一件事:你应该抽象你的数据访问层,以便能够测试你的代码;) – 2009-10-10 16:30:02