2009-06-03 70 views
0

假设人们有一个像Person这样的类,它在Setting类中实现了一些默认设置。这些设置可能是诸如“默认标题”或“需要名字”之类的东西。相应地,像Address类的其他类也可能有一些默认设置。 Setting类将每个设置保存到持久存储中。静态方法或OO替代方法?

应该在每个类中实现一个静态方法,如包含这些设置的“SetDefaults()”,以便外部方法可以针对每个对象类型调用SetDefaults()?例如Person.SetDefaults()然后Address.SetDefaults()?

或者是否有一些更好的面向对象的方式来做到这一点?

[更新:这不可能是在构造因为SetDefaults()应该从外部类在特定时间点被调用,而不是每一个对象被构造时间]

+0

我认为你需要解释SetDefaults的行为 - 如果当一个对象被超过的IoC构建这些默认值都是只读/工厂显然是一个好答案。如果预计在施工后使用时会出现重置或其他状态变化的影响,那么我认为Mark的扩展建议是最好的答案,但我真的质疑当时的设计 - 这听起来像是两种截然不同的方法。 – annakata 2009-06-03 08:38:28

回答

3

我不能想到很多场合默认是真正的跨越......给所有不同的使用情况,对象可能会经历(并非最不重要的,像反序列化 - 这可能最终设置即使这不是预期的)。

这里的一个选项是IoC;像StructureMap这样的IoC容器可以在初始化后设置属性,然后从调用代码中抽象出来。

另一种选择可能是某种模板实例(静态),该实例可以从中复制值。但我认为这在一些情况下是有风险的。如果不同的线程(可能是Web服务器上的请求)需要不同的默认值,您也会遇到问题。 [ThreadStatic]不是选项(虽然它是一个选项)。

另一种选择(它提供了最大的灵活性)将提供用户设定的工厂......也许通过委托或事件机制 - 但我很难看到为什么您可能希望这种情况。这不是我经常见到的...


重新更新:如果它只被外部类使用;可它或许使用类似的扩展方法(不必知道这事,而不是Person类):

public static class PersonExt { 
    public static void SetDefaults(this Person person) { 
     // your code 
    } 
} 

因为它听起来像原来Person类不关心SetDefaults,这离婚的逻辑从整齐地。

1

为什么不设置这些默认值在创建对象时(在构造函数中)。 默认值是-imho - 当没有为该属性赋予特定值时应该分配给属性的值,因此,我认为在创建对象时设置这些默认值是一个好主意(在构造函数中或者通过工厂)。

或者,我错过了什么?

+0

因为SetDefaults()方法需要由外部类来调用,而不是每次构造对象。 – Aryeh 2009-06-03 08:15:25

+1

@JBadda - 你的意思是设置这些默认值的值是什么?不是重置实例?我认为一个静态(即元方法)是有道理的,但不会比依赖注入一个配置对象更有意义 - 如果需要,接口 – annakata 2009-06-03 08:22:10

-1

您也可以实施Abstract factory pattern并使用您的设置配置工厂。或者,您也可以使用IoC作为injecting dependency进入此工厂类。对于Preson

简单工厂类可以看看以下内容:

public class PersonFactory 
{ 
    private readonly ISettings settings; 

    public PersonFactory(ISettings settings) 
    { 
    this.settings = settings; 
    } 

    public Person Create() 
    { 
    Person p = new Person(); 
    // ... you code for populating person's attributes form settings. 
    return p; 
    } 
} 
+0

我不确定这些直接解决了这个问题。 – Aryeh 2009-06-03 08:22:59

0

我把它们放在构造函数。

class Person 
{ 
    public Person() 
    { 
    this.Settings = MakeDefault(); 
    } 

    public Person(Settings settings) 
    { 
    this.Settings = settings; 
    } 
} 
+0

不能在构造函数中 - 请参阅主题的更新。 – Aryeh 2009-06-03 08:27:28

0

您可以创建一个设置类来封装所有类(人员,地址)的设置。

您可以为说人所设定的默认设置:

// Injected 
Settings settings; 
Setting personSetting = new ...; 

... 
settings.StoreSettingsFor(typeof(Person), personSettings); 
0

你也可以使用一个单来存储这些数据,如果你愿意,尤其是如果从存储的地方检索的值,因为这会降低对访问存储的次数。

(在这种情况下存储可以是数据文件,注册表,数据库)。