![]() |
1
4
如果您使用的是.NET 4.0, 你可以用 optional/named parameters 简化接受多个参数(其中一些参数是可选的)的对象的创建。当您希望避免许多不同的重载以提供有关对象的必要信息时,这很有帮助。
你可以使用
我发现构建器模式在组装层次结构时最有效,而不是一个具有一堆属性的类型。在后一种情况下,我通常使用重载或可选/命名参数。 |
![]() |
2
4
因此,如果您想返回,工厂方法模式是有意义的
子类
属于
|
![]() |
3
3
您提到的CreateMovie()方法是另一个选项,以防您需要将内部构造函数与创建电影实例的行为分开。 你有许多选择,可供你安排构造器。使用那些可以让你设计你的系统没有气味和许多原则(干,雅格尼,SRP) |
![]() |
4
2
这些参数似乎不是可选的,因此没有一种方法可以用更少或更少的参数来提供重载 使用可选参数。
工厂的目的是为您提供一个可定制的具体接口实例,而不仅仅是为您调用构造函数。其思想是,在构造时不需要硬编码确切的类。这真的更好吗?
需要考虑的一件事是如何改进这一点,以便调用代码更容易理解。对我来说,最明显的问题是,不看代码就不清楚150意味着什么
使用流畅的界面,您的通话看起来
坦白说,这一切对你的案子来说似乎都是杀伤力过大。如果您使用的是.NET4.0,那么命名参数是合理的,因为它们不需要太多代码,而且可以改进调用方的代码。 |
![]() |
5
1
你对自己的问题回答得很好,这是工厂模式。使用工厂模式,您不需要庞大的构造函数来进行封装,您可以在工厂函数中设置对象的成员并返回该对象。 |
![]() |
6
1
这是完全可以接受的,伊莫。我知道静态方法有时是不受欢迎的,但我通常会将代码放入一个返回类实例的静态方法中。我通常只对允许有空值的对象这样做。 如果对象的值不能为null,请将它们作为参数添加到构造函数中,这样就不会出现任何无效对象。 |
![]() |
7
1
我认为让公众保持现状没什么错。以下是我在决定是否使用工厂方法时遵循的一些规则。
所以根据我个人的规则,我会让构造器保持原样。 |
![]() |
8
1
如果您可以区分核心数据成员和配置参数,那么可以创建一个构造函数,该构造函数只接受所有核心数据成员,而不接受其他任何内容(即使是具有默认值的配置参数也不考虑可读性)。将配置参数初始化为sane默认值(在方法体中)并提供setter。在这一点上,工厂方法可以为您购买一些东西,如果您需要对象的公共配置的话。 更好的是,如果你发现你有一个对象,需要大量的参数列表,对象可能太胖了。您已经意识到您的代码可能需要重构。考虑分解对象。关于OO的优秀文献强烈支持小对象(例如Martin Fowler, 重构 鲍勃马丁, ). 福勒解释如何分解大型物体。例如,配置参数(如果有的话)可能表示需要更多的多态性,特别是当它们是布尔或枚举时(重构“Convert Conditional to polymorphics”)。 在给出更具体的建议之前,我需要看看你的对象是如何使用的。Fowler说,一起使用的变量应该成为它们自己的对象。因此,为了举例说明,如果您是基于类型、年份和长度来计算某些事物,而不是基于其他属性,那么这些属性一起可能需要分解为各自的对象,从而减少必须传递给构造函数的参数数量。 |
![]() |
9
0
至于我-所有取决于您的域模型。如果你的域模型允许你创建简单的对象-你应该这样做。 但通常我们有很多复合对象,每个对象的创建都太复杂了。这就是为什么我们在寻找封装复合对象创建逻辑的最佳方法。实际上,我们只有上面描述的两种选择——“工厂方法”和“对象生成器”。通过静态方法创建对象看起来有点奇怪,因为我们将对象创建逻辑放入对象中。反过来,对象生成器看起来很复杂。 我认为答案在于单元测试。这正是TDD非常有用的情况—我们逐步建立领域模型,并了解领域模型复杂性的需要。 |
![]() |
Xavier Font · 如何将我的web域设置为转到特定端口? 2 年前 |
![]() |
kjubus · 带重定向和包含的SPF记录 6 年前 |
![]() |
Tamas · docker compose中的域配置 6 年前 |
![]() |
Bill Greer · 如何使用c正确检查DNS条目是否存在# 6 年前 |
![]() |
Frank · 什么证明你是域名的所有者[已关闭] 6 年前 |