你使用代码生成工具吗?

时间:2008-09-27 15:43:37

标签: .net visual-studio code-generation

您是否使用代码生成工具(除了那些用于生成代理的工具和内置于visual studio的设计人员)?

您生成的应用程序的哪些部分?

您通常会自己动力发电机吗?如果是这样,你会写什么类型的生成器(asp模板,代码等)。如果没有,你使用什么第三方工具?

我目前正在开发一些不同的项目,它们都使用自定义代码生成器来处理生成数据库结构,业务实体,DAL和BLL的所有内容。我很好奇其他人的经历是用这些工具。

21 个答案:

答案 0 :(得分:23)

是的,但我们称他们为实习生。

答案 1 :(得分:9)

我在哲学阵营中认为代码生成器是“错误的”,因为它们表明应该成为语言的一部分。

但是编写编写代码的代码是实用程序员的道德规范的一个重要部分,并且在实践中,如果生成的代码默认隐藏,代码生成也很有效。无论你想要多么纯粹的哲学,语言都不会像你想要解决的问题那样快速地发展。

在Visual Studio中构建Windows窗体时生成的代码会浮现在脑海中。如果需要,您可以查看生成的代码,但最好不要这样做。然而,使用WPF转换为声明性语言是优越的,因为以编程方式操作声明性代码比命令式代码更清晰,更可靠。

他们应该对LINQ-To-SQL类做同样的事情。对于只具有属性且没有自定义行为的类,它们需要声明性语言。它可能会使这些实体类更容易动态 - 当底层数据库模式发生变化时自动更改。

我们尝试使用CodeSmith为数据库中的所有表生成.NetTiers类,但遇到了两个问题:

  1. .NetTiers臃肿,生成的代码非常庞大。我认为代码生成工具太容易让人感到烦恼。

  2. 由于架构正在积极开发和修改,我们也不得不重新生成,最终使得很难将所有内容保存在源代码控制中,因为所有文件都在重新生成和替换。我最终不确定生成的代码应该是否完全处于源代码管理中。

  3. 代码生成的最佳位置应该是编译器或构建阶段,而不是设计阶段。在C#中使用匿名类型或方法时,编译器会动态执行代码生成。如果您在设计阶段生成代码,则会获得一大块 stuff ,每次基础参数更改时都必须重新生成

答案 2 :(得分:6)

不是我们在.net / web域工作,而是来自各种家庭设计语言的自制代码生成工具是我们开发工具链的重要组成部分。我们有两个主要的这样的工具(带有语法和解析器以及正式定义),以及一些基于m4和perl等宏构建的小工具。它们最终都生成了纯C,这是本机编译的。

根据我的经验,领域特定语言是程序员生产力的关键工具之一,适用于任何大型软件。如果您正在构建诸如编译器,模拟器或其他非常复杂的软件,这些软件具有许多在基本语言中完全不支持的重复模式(通常意味着可移植的C,有时候是C ++),那么代码生成工具就是最佳选择。我将领域特定语言视为概括的下一步:首先将常见计算分解为函数(或子程序为历史),然后将常用函数分解为模板或泛型(如果有这样的工具可用),然后中断更加通用,并将代码重复为完整的自定义语言。

这一切都是为了减少您实际编写的代码量,并从编程过程中删除任何形式的繁琐重复和非增值代码。一旦模式重复,请应用特定于域的语言!

答案 3 :(得分:5)

当我做经典的asp工作(大约2001年)时,我开始回滚我自己的生成器(数据访问,sprocs等)。我慢慢转移到CodeSmith,因为它更容易处理。我仍然主要为我的.NET代码生成所有数据访问层类型(包括sprocs)。

几年前,我从宏代码生成(即CodeSmith)跳到微代码生成。

与CodeSmith不同的是,我为我的应用程序生成了大量代码,所有代码都是通用的,并且一次性完成。这对于边缘情况变得有问题,并且在改变模板的源(即表结构)时重新生成。我还遇到了一些案例,其中有很多我没有使用的携带代码,但是是从我的模板生成的。所有这些方法都有效吗?也许,也许不是。进入并清理生成的代码将是一项巨大的工作(即在相同的代码库上超过一年)。

相比之下,微代码生成允许我完全按照我想要的正确方案生成我需要的类。我用来做这个的主要工具是ReSharper。我这样做的方法是在编写生产代码之前编写单元测试。在这种情况下,ReSharper使用我的单元测试作为模板来自动生成生产代码的骨架。然后,这只是填补空白的问题。

对于数据访问,我不再生成任何内容。我发现一个好的O / R M取代了我以前放入数据访问层(即NHibernate)的所有内容。鉴于此,我将永远不会在我的生活中编写或生成另一个数据访问层(我拒绝)。

另外,我获得了拥有大型单元测试套件的好处

答案 4 :(得分:5)

由于Fog Creek Software的内部语言Wasabi内置了编译时代码生成器,我们使用它们自动创建映射到数据库表的实体类。因此,我们可以写下:

,而不是用十几个不同的属性和方法编写一个类
<ActiveRecord("Kiwi")> _
Class CKiwi
End Class

和CKiwi将为其Kiwi表的基础模式中定义的每个列具有Load(ix As Int32),Commit()和fields / properties。它使我们不必拥有庞大的O / R M库,但仍允许我们快速为我们的产品添加表格。

答案 5 :(得分:4)

编译器精神的代码生成可能很棒。以“巫师”为精神的代码生成统一证明是一个坏主意。

答案 6 :(得分:1)

我们曾经使用CodeSmith生成我们的NHibernate hbms,我们的实体和其他一些东西。过了一会儿,我们厌倦了这种流动,所以我们放弃了它。

T4发电机是免费的,值得研究一代。

我们仍然使用Castle CodeGenerator进行MonoRail链接生成。

答案 7 :(得分:1)

  1. 我们使用代码生成器进行例外
  2. 为CRUD操作生成DAO
  3. 使用JAXB生成代码
  4. 使用XDoclet生成EJB本地/家庭接口
  5. 使用Velocity模板生成商业模式的文档
  6. 使用Apache Axis生成WSDL存​​根

答案 8 :(得分:1)

我们使用LLBLGen来制作我们的数据访问层。您将生成器指向您正在使用的数据库,选择要使用的表,并生成所需的类。这一切都非常快捷方便。

答案 9 :(得分:1)

几个月前我遇到了ActiveWriter这对我非常有帮助,我喜欢的是这种方法的灵活性,它生成了处理数据访问问题的部分类,它让我可以编写业务部分代码的课程。我感到非常满意,因为我节省了很多工作,改变架构,重新生成并继续下去非常好。

答案 10 :(得分:1)

我为某些任务创建了自己的工具。从长远来看,它很有趣,甚至可以节省时间。 对于非常沉闷的任务,它甚至可以挽救你的理智。

答案 11 :(得分:1)

自制代码生成器非常适合从最终用户电子表格构建单元测试用例,其中包含 应该如何工作的示例。

有关示例,请参阅Tooling to Build Test Cases

答案 12 :(得分:0)

我创建了一个自定义代码生成框架,它以多种语言生成Web服务的代理类,例如Java Script,Action Script,Java,C#和Objective C,我不使用模板或工具只使用生成代码的纯C#代码一些辅助类,代码生成确实可以节省大量时间,但我认为生成的代码应尽可能简单,不应过度使用。

答案 13 :(得分:0)

我编写并使用了基于Xslt的代码生成工具。 http://perfectstorm.codeplex.com/

这使用单个根xml模型来生成dal,procs,tables。

答案 14 :(得分:0)

如果对优秀的LLBLGEN感兴趣,您也可以评估亚音速。甚至可以看看Rob Conery对亚音速和t4之间的任何重叠或相互作用有什么看法。

答案 15 :(得分:0)

与此处的其他人一样,我们还创建了自己的代码生成器(Inon Datamanager / Viewmanager),用于数据访问,HTML表单处理和某些业务逻辑操作。完成这项工作的关键是设计它,这样您就不必触摸或查看生成的代码。

通过这种方式,它几乎成为了语言的一部分 - 语言(在我们的例子中是Java)被扩展为包括域模型规范和视图模型,然后您只需用真正的Java代码填充自定义业务逻辑。

这为我们提供了与分析师和业务用户进行通信的正确工具,同时仍具备Java的强大功能来设置基础行为的详细信息。

答案 16 :(得分:0)

我写了一个可爱的工具,其中我编写了解析器的数据格式的专家,可以通过Web表单提交自己的样本,查看输出,并告诉我它是否正确。

由此,将生成jUnit测试。可爱。

除了没有一个人打扰使用它,并且我没有收集任何测试用例。

答案 17 :(得分:0)

我用过一个生成可序列化的数据对象,可以在不同的平台(windows,linux,solaris,mac,bsd等)上进行改造。这是一个内部解决方案。

答案 18 :(得分:0)

我们刚开始在办公室使用Grails。以前,我们有一套内部JSF / Hibernate CRUD生成脚本。

...... Grails胜出。 Grails的代码生成非常好,可以在大约15分钟内为您提供CRUD应用程序,而无需将代码放入代码文件中!

当然,当您想要修改它时,它可以在代码文件中生成实际代码。大多数情况下,对于常规CRUD,只需更改视图即可逃脱。

答案 19 :(得分:0)

在之前的雇主,我们有一个本土的VB.NET应用程序,它将XML模式定义文件(XSD)转换为静态C ++库。这使得使用C ++数据类型(bool,std :: string等)变得更加容易,并且所有有趣的XML代码都隐藏在这些生成的类中。

答案 20 :(得分:0)

我们有一个内部构建的代码生成器,负责数据库访问。一个人编写存储过程并获取在网关类中抽象的相应方法。

我们还生成Web服务以便与Flash正确连接 - 即以理智的方式处理异常。

最后,我们有一个异常生成器,可以消除异常最佳实践(大量构造函数等等)的苦差事。