Questions tagged «constructors»

6
如何编写可能无法正确实例化对象的构造函数
有时您需要编写可能会失败的构造函数。例如,假设我要实例化带有文件路径的对象,例如 obj = new Object("/home/user/foo_file") 只要路径指向适当的文件,一切都很好。但是,如果字符串不是有效路径,则应该中断。但是如何? 你可以: 抛出异常 返回空对象(如果您的编程语言允许构造函数返回值) 返回一个有效的对象,但带有一个标志,指示其路径设置不正确(ugh) 其他? 我假设各种编程语言的“最佳实践”将以不同的方式实现此目标。例如,我认为ObjC更喜欢(2)。但是(2)不可能在C ++中实现,在C ++中,构造函数必须将void作为返回类型。在这种情况下,我认为使用(1)。 您可以使用您选择的编程语言来说明如何处理此问题并解释原因吗?

2
创建唯一目的是隐式转换为另一个类的类是否不好?
想象一下一种情况,我们正在使用一个允许您创建Circle对象的库,您可以在其中指定半径和圆心来定义它。但是,由于某些原因,它也需要一个必需的flavour参数。现在,我们确实需要Circle在自己的应用程序中使用,但是出于我的应用程序的目的,我可以将风味设置为Flavours.Cardboard每次。 为了“解决”这一问题,我Circle在另一个命名空间中创建了自己的类,该命名空间仅将radius和center作为参数,但具有一个隐式转换器,可以直接转换为Circle仅创建Circle(this.radius, this.center, Flavours.Cardboard)对象的外部库类。因此,在任何需要其他类型的的地方Circle,我都会进行自动转换。 创建这样一个类的后果是什么?有更好的解决方案吗?如果我的应用程序是在此外部库的基础上构建的供其他程序员使用的API,会有所不同吗?

3
使用专用设置器存根属性以进行测试
我们有对象 public class MyObject{ protected MyObject(){} public string Property1 {get;private set;} public string Property2 {get;private set;} public string Property3 {get;private set;} public string Property4 {get;private set;} public string Property5 {get;private set;} public string Property6 {get;private set;} public string Property7 {get;private set;} public string Property8 {get;private set;} public string Property9 {get;private …

4
CQRS + ES中的对象应该在哪里进行完全初始化:在构造函数中,还是在应用第一个事件时?
在OOP社区中似乎已经达成广泛的共识,即类构造函数不应将对象部分或什至完全未初始化。 我所说的“初始化”是什么意思?粗略地讲,原子过程将新创建的对象带入其所有类不变式都成立的状态。它应该是发生在对象上的第一件事(每个对象只能运行一次),并且任何内容都不应该拥有未初始化的对象。(因此,经常建议在类构造函数中执行对象初始化。出于同样的原因,Initialize方法常常被皱眉,因为这些方法打破了原子性并使得可以持有和使用尚未使用的对象成为可能。处于定义良好的状态。) 问题:当CQRS与事件源(CQRS + ES)结合使用时,对象的所有状态变化都被捕获在一系列有序的事件(事件流)中,我想知道对象何时真正达到完全初始化的状态:在类构造函数的末尾,还是在将第一个事件应用于对象之后? 注意:我避免使用“聚合根”一词。如果愿意,在阅读“对象”时将其替换。 讨论示例:假定每个对象由某个不透明Id值唯一标识(请考虑GUID)。可以使用相同的Id值在事件存储中标识表示该对象状态变化的事件流:(不用担心正确的事件顺序。) interface IEventStore { IEnumerable<IEvent> GetEventsOfObject(Id objectId); } 进一步假设有两种对象类型Customer和ShoppingCart。让我们关注ShoppingCart:创建时,购物车为空,必须与一个客户完全关联。最后一点是类不变式:ShoppingCart与a无关的对象Customer处于无效状态。 在传统的OOP中,可以在构造函数中对此建模: partial class ShoppingCart { public Id Id { get; private set; } public Customer Customer { get; private set; } public ShoppingCart(Id id, Customer customer) { this.Id = id; this.Customer = customer; } } …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.