C# 为什么建设者是邪恶的?
我记得我读过一篇关于构造函数是邪恶的(但无法放置它)的文章。作者提到构造函数是方法的一个特例;但是有限制(例如它们不能有返回值) 建设者是邪恶的吗?没有构造函数,而是依赖于像C# 为什么建设者是邪恶的?,c#,java,constructor,C#,Java,Constructor,我记得我读过一篇关于构造函数是邪恶的(但无法放置它)的文章。作者提到构造函数是方法的一个特例;但是有限制(例如它们不能有返回值) 建设者是邪恶的吗?没有构造函数,而是依赖于像Initialize这样的方法,以及成员变量的默认值,这样更好吗 (如果必须确定一种语言,您的答案可以针对C#或Java。)构造函数允许初始化列表和其他有用的东西。没有复制构造函数,无法动态初始化数组中的对象(不使用指向对象的指针) 不,他们不是邪恶的 它们是特殊情况。它们不是。事实上,有一种称为控制反转的特定模式,它巧妙地
Initialize
这样的方法,以及成员变量的默认值,这样更好吗
(如果必须确定一种语言,您的答案可以针对C#或Java。)构造函数允许初始化列表和其他有用的东西。没有复制构造函数,无法动态初始化数组中的对象(不使用指向对象的指针) 不,他们不是邪恶的
它们是特殊情况。它们不是。事实上,有一种称为控制反转的特定模式,它巧妙地使用构造函数来很好地解耦代码并简化维护。此外,某些问题只能通过使用非默认构造函数来解决 构造器不是邪恶的。它们的存在是为了在初始化类的实例时可以运行代码。就像任何其他编程概念一样,如果没有正确使用它们,它们可能会成为一场灾难。但是,如果使用得当,它们可以成为一个伟大(而且是必不可少的)工具
)听起来像艾伦·霍卢布。有人可能会说,构造函数仅仅是为了驱动web流量而邪恶的:)它们并不比任何其他语言构造更邪恶。它们有好的和坏的影响。当然你不能消除它们——没有它们就无法构造对象 但是,您可以做的是,这是Allen提出的情况,您可以限制对它们的实际调用,而在合理的情况下,支持工厂方法,如
初始化。这样做的原因很简单:它减少了类之间的耦合,并且在测试期间或应用程序开发时更容易用一个类替换另一个类
想象一下,如果您的应用程序执行以下操作
DatabaseConnection dc = new OracleDatabaseConnection(connectionString);
dc.query("...");
想象一下,这种情况在应用程序中的一百个地方发生。现在,您如何对任何这样做的类进行单元测试?当你为了省钱而切换到Mysql时会发生什么
但如果你这样做了:
DatabaseConnection dc = DatabaseConnectionFactory.get(connectionString);
dc.query("...");
然后要更新应用程序,只需更改DatabaseConnectionFactory.get()
返回的内容,这可以由配置文件控制。避免显式使用构造函数使代码更加灵活
编辑:我找不到“构造函数”的文章,但这是他的一篇,这是他的一篇。邪恶?没有
调用构造函数确实需要调用“new”,这会将您绑定到特定的实现。工厂和依赖项注入允许您对运行时类型更加动态,但它们需要对接口进行编程
我认为后者更灵活,但构造函数邪恶吗?这太过分了,就像拥有一张适合一切事物的iterface太过分了 我不会说构造函数是邪恶的
构造函数返回对正在实例化的对象的引用,并应用于将对象设置为默认状态。我可以看到使用Initialize方法的好处,但没有太多意义。除非在为对象分配堆栈空间和初始值后需要初始化某些逻辑。构造函数是而不是邪恶的。无论你读什么文章都是错误的,最好忘记链接。构造函数既不是邪恶的,也不是善良的。构造函数是一种工具,如果在正确的上下文中正确使用,它会非常有用。事实上,至少在.NET语言(如C)中,如果您没有在代码中显式声明构造函数,编译器将为您创建一个没有任何功能的构造函数。当遵循正常的OO编程范例时,构造函数是很好的。在某些情况下,您可能需要对对象的创建方式设置额外的约束,因此在某些情况下,使用私有的构造函数的工厂模式可能更适合。还有一种理念/最佳实践认为对象实例化应该与初始化相同,在这种情况下,构造函数是工厂之外唯一的实际选项
(当然,工厂仍然在内部使用构造函数)问题可能不是Java或C#中的构造函数,而是javascript中的构造函数。在Javascript中,构造函数可能是细微错误的来源。许多Javascript书籍建议初学者避开构造函数
要更详细地讨论构造器的邪恶,以及javascript中的新关键字look:我在某种程度上从Miško Hevery的谈话“不要寻找东西”中获得了这种氛围,该演讲可在上获得。在他概述的部分讨论中,我将其解释为对“胖构造函数”的批评,如果不是一般的构造函数的话
这个论点的要点,至少在我的理解中,是接受对象想要的一切的构造函数鼓励您使用构造函数强制执行正确性,而不是通过测试强制执行正确性。构造函数确实会膨胀来完全做到这一点,所以如果这困扰了你,你可以认为它是构造函数概念中的一个邪恶条纹。在演讲中,他说他更喜欢只要求一个对象在需要做某事时“拥有”另一个对象,而不是在构造时要求它。构造函数不是坏事,但(至少在Java中)通常最好使用静态工厂方法(当然在内部使用构造函数)
下面是第1项中的一些引用:考虑静态工厂方法而不是构造函数:
静态工厂的一大优势
方法不同于构造函数,
他们有名字。如果参数为
构造函数不在和中
他们自己,描述对象bein
Map<String, List<String>> m =
new HashMap<String, List<String>>();