我想知道最好的方法是在使用类之前验证类是否具备所有必需的细节。
例如,假设我有一个Book
类,我希望将有关该书的一组属性传递给Book
构造函数。
Book book = new Book(bookProperties);
我想确保BookProperties
是完整的,也就是拥有所有的信息。
假设在本例中,我有以下内容:
一种方法是,我可以创建一个只接受所有3项的默认构造函数:
BookProperties bookProperties = new BookProperties("2001: A Space Odyssey",
"Arthur C. Clarke",
1968);
现在可以了,如果我们只有三个值,但是假设我的类有10个或更多的属性,这些属性需要用户在创建Book
类之前进行初始化。
我在想的一件事是在BookProperties中有一种叫做isValid
的方法。然后,在Book
类的构造函数中,我将查看返回是否为bookProperties.isValid
并断言是否为false。
这是个好主意还是我搞错了?
发布于 2009-06-07 00:15:36
如果需要 10值,那么将10个值传递给构造函数并不是闻所未闻的事情--但您所描述的更像是一个实体对象。为了方便起见,通常只使用属性设置程序。使用C# 3.0,您可以使用初始化器语法来方便和清晰地执行此操作:
Book book = new Book {
Title = "2001: A Space Odyssey",
Author = "Arthur C. Clarke",
PublishedYear = 1968
};
您可以使用BookProperties
对象(作为某种构建器),但是在这种情况下,为什么不将构造作为构建器上的一个方法呢?然后,构建器在创建Book
(大概是通过internal
构造函数)之前进行验证,并在出现问题时抛出异常。我假设使用BookProperties
是为了(例如)允许一个不可变的Book
,但是构建器不需要是不可变的:
var bookProperties = new BookProperties(); // builder?
bookProperties.Title = "2001: A Space Odyssey";
...
Book book = bookProperties.CreateBook();
就我个人而言,在大多数情况下,我只使用Book
方法(最上面的方法)--例如,这种方法与常见的.NET序列化引擎和绑定框架(它们都像无参数构造函数和get
/set
属性一样)非常适用。如果您想要验证,那么只需向Validate()
添加一个IsValue {get;}
方法(或IsValue {get;}
属性)即可。或者实现IDataErrorInfo
。
发布于 2009-06-07 00:13:00
如果这些属性确实是必需的,那么它们应该在构造函数中。当然,您可以使用重载来省略具有可接受的默认值的属性。
10甚至20个参数可能不是很漂亮,但它比备选方案要好。
https://stackoverflow.com/questions/961464
复制相似问题