Nhibernate 代码生成器坏吗?

Nhibernate 代码生成器坏吗?,nhibernate,code-generation,poco,Nhibernate,Code Generation,Poco,我使用MyGeneration和nHibernate创建基本的POCO对象和XML映射文件。我听一些人说,他们认为代码生成器不是一个好主意。当前最好的想法是什么?是不是因为代码生成程序在生成数千行不可理解的代码时很糟糕?我的立场是代码生成程序不错,但它们的许多用途都不错 如果您使用代码生成器来节省编写好代码的时间,那就太好了,但通常情况下它没有得到优化,或者增加了很多开销,在这些情况下,我认为这是不好的。在某些(不是很多)情况下,它们是有用的。例如,如果您希望根据数据库表中的查找类型数据生成类。

我使用MyGeneration和nHibernate创建基本的POCO对象和XML映射文件。我听一些人说,他们认为代码生成器不是一个好主意。当前最好的想法是什么?是不是因为代码生成程序在生成数千行不可理解的代码时很糟糕?

我的立场是代码生成程序不错,但它们的许多用途都不错


如果您使用代码生成器来节省编写好代码的时间,那就太好了,但通常情况下它没有得到优化,或者增加了很多开销,在这些情况下,我认为这是不好的。

在某些(不是很多)情况下,它们是有用的。例如,如果您希望根据数据库表中的查找类型数据生成类。

当代码生成使编程更加困难(即生成的代码不好或维护噩梦)时,代码生成是不好的,但当代码生成使编程更加高效时,代码生成是好的

它们可能并不总是生成最佳代码,但根据您的需要,您可能会决定节省开发人员的工时来弥补一些小问题


尽管如此,我对ORM代码生成器最大的不满是,如果模式发生变化,维护生成的代码可能是一个PITA。

代码生成器不错,但有时它们用于存在其他解决方案的情况(即,当一个对象数组更合适并且只需几行代码即可完成时,实例化一百万个对象)

另一种情况是它们被错误地使用,或者代码编写得很糟糕。太多的人发誓不使用代码生成器,因为他们有过错误的经历,或者他们对如何正确配置代码有误解

但就其本身而言,代码生成器并不坏


-Adam

它们与其他任何工具一样。有些工具的效果比其他工具更好,但这取决于用户何时使用它们。如果你试图拧入螺钉,锤子是一个糟糕的工具。

这是一个极具争议的问题。我个人认为,由于没有优化的垃圾代码,代码生成器非常糟糕他们中没有一个被淘汰


然而,这个问题实际上只有你才能回答。在许多组织中,开发时间比项目执行速度甚至可维护性更重要。

我们使用代码生成器生成数据实体类、数据库对象(如触发器、存储过程),服务代理等。无论您在何处看到大量重复代码遵循某种模式,并且涉及大量手动工作,代码生成器都可以提供帮助。但是,您不应该过度使用它,因为维护性是一个难题。如果您想重新生成它们,也会出现一些问题


Visual Studio、Codesmith等工具对大多数常见任务都有自己的模板,使此过程更容易。但是,它很容易由您自己推出。

当您不得不返回时,它确实会成为一个维护性问题,无法理解代码中发生了什么。因此,很多时候,您必须权衡其重要性与易于维护相比,快速完成项目更为重要


可维护性简单或快速的编码过程

我使用实体空间生成,我没有任何问题。如果我有架构更改,我只需重新生成类,一切正常。

我遇到的代码生成器的最大问题是在维护期间。如果修改生成的代码,然后使用c更改模式或模板并尝试重新生成可能会出现问题

一个问题是,如果工具不允许您保护对修改后的代码所做的更改,那么您的更改将被覆盖


我看到的另一个问题,特别是RSA for web services中的代码生成器,如果您对生成的代码更改过多,生成器会抱怨代码不匹配,并拒绝重新生成代码。这种情况可能发生在更改变量类型这样简单的事情上。然后,您将无法生成不同的代码t投影并将结果合并回原始代码。

它们作为一个拐杖,可能会使您无法长期维护程序。

如果您想将行为混入类中,代码生成可能会给您带来一些麻烦。同样有效的替代方法可能是属性/注释和运行时反射。

第一个C++编译器是代码生成程序,它吐出C代码(cFAX)。


我不确定这是支持还是反对代码生成器。

如果Fran Tarkenton试图向您推销的是大型机cobol代码生成器,那么绝对是的!

编译器是代码生成器,因此它们本质上并不坏,除非您只喜欢使用原始机器代码编程


然而,我认为代码生成器应该始终完全封装生成的代码。也就是说,您不必手动修改生成的代码,任何更改都应该通过修改生成器的输入并重新生成代码来完成。

我认为Mitchel击中了它的头部。 代码生成有它的位置。在某些情况下,让计算机为您完成工作更有效! 当进行代码更改的时间成本很小时,它可以让您自由地改变对特定组件实现的想法。当然,理解代码生成器的输出可能仍然很重要,但并非总是如此。 我们在一个项目上做了一个例子,在这里我们需要一个C++应用程序来与一个C管道应用程序在命名管道上通信。我们最好使用一个小的、简单的、定义消息的文件,并且为事务的每一个方面生成所有的类和代码。eeded担心的是消息的实现细节以及不可避免的缓存命中
-- =============================================================
-- === Foobar Module ===========================================
-- =============================================================
--
--         === THIS IS GENERATED CODE.  DO NOT EDIT. ===
--
-- =============================================================