自动代码生成器


13

我的一位同事喜欢使用自动代码生成器,该代码生成器会创建大量的文档,这些文档记录不善,而且很难维护。

为了减少创建时间,使用代码生成器的成本值得进行维护吗?

Answers:


10

让我们改写一下:

一个好的自动代码生成器的成本值得吗?

是。

劣质的自动代码生成器的成本是否值得为其他人创造更多的工作,但值得作者付出?

绝对不。不好的代码没有任何借口。如果有人想变得聪明并使用自动代码生成,那么他们应该花一些时间来确保生成的代码是好的代码。否则,这有什么意义?它只是在推动代码生产,而在代码生产方面,美元应该停止在编写它的开发人员身上。


16
我不同意你的第二点。生成的代码只需要足够好就可以正常工作,并且不会产生性能/安全性或任何其他问题。由于您永远不应该手工维护生成的代码,因此,如果它不符合通常的编码标准也没关系。
希拉2010年

4
您可以不同意。但是,如果您要花时间创建代码生成器,那么为什么不花时间使生成的代码漂亮呢?生成后,我不知道它是由谁制作的,如何制作的,也不知道它的意图,除非它与所有其他部分一样可读/可维护。有时,生成器只是为了创建一个起点,而不是提供完整的成品。
小麦色的

1
同样,如果代码的生成是构建的一部分(即,每次构建都会重新生成),那么生成“美丽”的代码就没有多大意义。但是,如果您只生成一次代码,仅此而已,那就是另一回事了。
Dean Harding

5
希拉,您永远不要手工维护生成的代码,但是当由于新的/不断变化的要求而需要更改该代码的日子到来时,您需要代码清晰易懂,以便可以轻松地对生成器进行必要的更改,然后重新生成。
Carson63000

6
生成的代码不必足够维护即可,但对于调试和验证也应足够清楚。
2010年

23

生成器生成的代码绝不能手工维护。如果需要更改,则必须调整发生器和/或其设置,然后再次运行。考虑到这一点,只要生成机制本身非常清晰,生成的代码是否令人费解且没有文档记录都没关系。(请确保记录以下事实:生成代码,生成器在哪里以及其工作方式。)

打个比方:虽然我的计算机的处理器始终在执行机器代码,但只要知道如何使用高级语言和编译器创建该机器代码,我就无需了解任何信息。我听说GCC有时会产生低于标准的机器代码,但是只要它能完美运行,谁会在乎。数据库抽象层会生成与DB引擎一起运行的SQL,但是只要抽象层清晰且有效,谁会关心SQL的外观?

如果使用得当,代码生成器无疑不仅可以节省创建成本,而且可以节省维护成本。


4
问题就变成了,只有一个人拥有该工具,其他人没有,因此必须手动维护代码。
喃喃自语

这正在推卸责任。作为软件开发人员,无论我们如何生产,我们的业务都是代码。
史蒂文·埃弗斯

12
@David,如果只有一个人拥有该工具,则不应在涉及多个人的项目中使用它。
Matt Olenik

2
@Matt,完全是。生成器是项目的一部分(可与构建脚本相比),应存储在版本控制或类似的中央存储库中。
乔纳斯·普拉卡

2
@SnOrfus:我认为我们的业务是生产人们愿意使用和购买的工作产品。那就是我们的薪水来源。代码只是一种媒介。
乔纳斯·普拉卡

6

代码生成器是一种编译器。您不必担心编译器输出的美观程度,只需使用源代码即可。使用它然后进行手工修改输出通常比仅仅以人类可以理解的形式从头开始编写更难,并且这意味着您无需大量工作就无法再次使用代码生成器,因为您必须应用对相同的难以理解的代码进行相同的更改。

因此,如果它们是构建过程的一部分,并且如此进行记录,则可能会很好。生成器的输入就是源代码,生成的任何内容都是中间结果,不要被弄乱了。

但是,如果某人使用一个人生成了难以理解的代码(该代码原本应该用作源代码),那么该人就会生成错误的代码。人们是通过机械方式还是手工方式生成错误代码都没有关系,这仍然是错误代码,并且您仍然会遇到质量问题。

因此,您需要将此视作其他开发人员偷工减料并编写错误的代码。我不知道你在商店里怎么处理。


3

从其他答案的评论看来,您似乎是在问团队标准,而不是代码生成器本身。

代码生成工具应包括在项目中,并且(在适当情况下)应作为构建过程的一部分。我们团队中的一个例子就是我们使用Subsonic 2.2,我们已经从构建时的数据库对象生成了类。

执行此操作的exe作为项目的一部分检入SVN,以便团队的新成员可以从svn获取新项目并立即进行构建,而不必弄清楚所有这些数据库类的来源(在本示例中,甚至不将生成的代码包含在svn中)。

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.