管理对象跨多个软件版本的构造函数

时间:2011-04-12 14:49:09

标签: .net oop api-design

我正在设计一个我正在讨论的库,如果我应该使用构造函数来初始化api模型中的对象。我的考虑是:

  1. 通过使用构造函数,我可以根据模型强制执行有效对象所需的数据。

  2. 但是,通过使用构造函数,我很好奇如何修改代码,以便在不破坏代码库中的现有代码的情况下维护此要求。

  3. 我可以避免在对象设计中使用构造函数,但我需要库使用它与开发人员进行通信,以使对象满足其模型所需的字段。

  4. 如何创建一个对象模型来表达正在初始化的特定属性的要求,并提供与代码维护相关的可伸缩性?

    dim objV1 as new ObjectOfSomeType(Param1, Param2, Param3)
    

    VS

    dim objV1 as new ObjectOfSomeType()
    
    objV1.Property1 = Param1
    objV1.Property2 = Param2
    objV1.Property3 = Param3
    

4 个答案:

答案 0 :(得分:2)

如果对象状态的有效性需要初始化某些属性,那么这些属性必须由构造函数初始化并设为只读

这将对课程及其用户施加一个要求,这将使更改变得更加困难但是你不能吃蛋糕并且吃掉它

一个可能的折衷方案是设计一个带有受保护构造函数的抽象基类,而其他实现可以从其他实现派生并定义其他构造函数并改变行为。

答案 1 :(得分:2)

对象的最小所需初始状态,即对象以确定方式运行所需的数据,应在构造期间设置。

如果您质疑客户使用您的API成功构建对象的能力,那么您应该发布一个包含Factory Method Pattern的类,并鼓励和/或限制使用它。

答案 2 :(得分:0)

总结一下,构造函数是确保只实例化有效对象的最简单方法。

  

但是,通过使用构造函数,我很好奇如何修改代码,以便在不破坏代码库中的现有代码的情况下维护此要求。

我不太确定你指的是什么:以后你可能意识到你需要额外(或更少)参数来创建有效对象的风险?恕我直言应该在发布图书馆之前通过精心设计,原型设计和测试来缓解。公共API很难改变。在广泛使用的情况下,甚至需要无限期地支持破碎和过时的功能(在Java中见证Object.clone())。无论您(或客户端)如何构建对象,如果缺少必需参数,那么这是一个错误。 IMO最好是检测这种情况编译时间而不是运行时,构造函数提供了最简单,最简单的方法来实现这一点。

您可能需要考虑的其他选项:

  • 使用Factory Method(您仍然需要在创建方法中包含所有必需参数,但您可以使用一些默认值来删除参数,从而避免破坏客户端代码),
  • 使用Builder(与上述类似,但它可以更灵活地设置构造参数或提供默认值)。

答案 3 :(得分:0)

我不熟悉设计模式;所以,在我决定使用它之前,请考虑一下我的建议,并且可能会看看我的答案是否上调/下调。

我建议只关注这些指导原则:

  1. 构造函数中应该包含的参数是期望在对象的整个生命周期内保持不变的任何数据。你不应该为这些提供设置者。
  2. 除此之外,您可以选择性地提供常用设置的变量的其他参数,只是为了使api使用者的代码更容易。这是你知道在调用构造函数后会立即使用的东西。所以,比如说,如果你有一个User对象和nickName变量,你可能想在构造函数中为它提供一个选项,这样消费者就不必总是调用new User();然后是user.setNickName(“name”);每次他们实例化对象。
  3. 另外值得注意的是,如果您使用的是c#,那么您应该能够执行我所描述的仅使用可选参数定义一个构造函数的内容。 http://msdn.microsoft.com/en-us/library/dd264739.aspx