【问题标题】:Do you generate code? If so, what do you use and what do you generate? [closed]你会生成代码吗?如果是这样,您使用什么以及生成什么? [关闭]
【发布时间】:2010-09-10 18:02:22
【问题描述】:

我使用过 MyGeneration,我喜欢它生成代码,该代码使用 Microsoft 的数据访问应用程序块作为我的数据访问层,并使我的数据库概念与我正在建模的领域保持同步。不过,它花了一个周末比预期更陡峭的学习曲线才能使其富有成效。

我想知道其他人在做什么与代码生成有关。

http://www.mygenerationsoftware.com

http://www.codesmithtools.com/

其他?

早在 2000 年左右,我工作的公司就使用了 Veritas Software 的产品(我相信是这样)来为组件建模并生成集成组件 (dll) 的代码。我没有太多经验,但似乎代码生成长期以来一直是“圣杯”。实用吗?其他人如何使用它?

谢谢!

【问题讨论】:

  • 添加了 LLBGen 和 Subsonic。谢谢!关于实用和如何使用的问题?您是否将代码生成严格用于数据访问?它与表示正在建模/实现的域(业务对象)有多接近?项目规模(团队规模、持续时间等)也是一个很好的衡量标准吗?

标签: java .net database code-generation


【解决方案1】:

T4 是 Microsoft 的 CodeSmith 杀手!!!!

去看看吧。 Microsoft 不想破坏他们的合作伙伴,因此他们不会宣传它,但这是一件不可忽视的事情,它是免费的,并且安装在 Visual Studio 2008 中。

www.olegsych.com

codeplex.com/t4toolbox

www.t4editor.net

【讨论】:

    【解决方案2】:

    我已成功使用 LLBLGen 和 nHibernate 生成实体和 DAL 层。

    【讨论】:

      【解决方案3】:

      我们使用 Codesmith 并取得了巨大的成功。我现在一直在努力寻找我们可以在哪里实施模板来加速平凡的流程。

      【讨论】:

        【解决方案4】:

        我已经完成了 CSLA 的工作,并通过 codesmith 使用 CSLA 模板生成了我的代码。

        codesmithtools.com

        【讨论】:

          【解决方案5】:

          如果您的数据库是您的模型,SubSonic 有一个出色的代码生成器,从 v2.1 开始,不再需要 ActiveRecord(您可以改用存储库模式)。它不如其他灵活,但可以在库存模板中进行自定义。

          【讨论】:

            【解决方案6】:

            我使用过 CodeSmith 和 MyGeneration,两者都不太热衷,感觉使用起来有些简洁,学习模板语言等。

            SubSonic 是我们有时在这里用来生成数据访问层的工具。用于合适规模的项目,它是一个极好的节省时间的工具。 clicky

            【讨论】:

              【解决方案7】:

              我认为代码生成也有害,但前提是您使用 codesmith 和 mygeneration 等 3rd 方工具。我有 2 个存储过程来生成我的域对象和域接口

              例子

              GenerateDomainInterface 'TableName'

              然后我将其复制并粘贴到 Visual Studio 中。对于我讨厌做的那些任务来说非常棒。

              【讨论】:

              • 一条评论,您所描述的正是 MyGeneration 的工作原理(并且 MyGeneration 是免费和开源的)。它是一个模板环境,可以生成刚刚添加到项目中的代码。有趣的是,您正在从 SPROC 生成代码。感谢您的回答。
              【解决方案8】:

              我经常使用的两个框架。

              拉格尔

              值得一试的是Ragel。它用于为状态机生成代码。

              您只需在源代码中添加一些简单的标记,然后在其上运行生成器 Ragel 为 C、C++、Objective-C、D、Java 和 Ruby 生成代码,并且很容易将它与您的常规源代码混合。

              Ragel 甚至允许您在状态转换等方面执行代码。它使创建文件格式和协议解析器变得容易。

              用户 Ragel 的一些值得注意的项目是,Mongrel,一个很棒的 ruby​​ Web 服务器。还有 Hpricot,一个基于 ruby​​ 的 html 解析器,有点受 jQuery 的启发。

              Ragel 的另一个重要功能是它可以生成基于graphviz 的图表,以可视化您的状态机。下面是从 ragel 状态图上的 Zed Shaw's article 获取的示例。


              (来源:zedshaw.com

              XMLBeans

              XMLBeans 是一个基于 java 的 xml 绑定。它的工作流程很棒,我经常使用它。

              XMLBeans 将描述模型的 xml 模式处理成一组表示该模型的 java 类。您可以以编程方式创建模型,然后将它们与 xml 序列化。

              【讨论】:

                【解决方案9】:

                我使用过 CodeSmith。很有帮助。

                【讨论】:

                  【解决方案10】:

                  我喜欢用 SubSonic。我认为开源是代码生成的方式,因为修改模板和核心非常容易,因为它们总是有错误或者你想做的一两件事不是内置的。

                  【讨论】:

                    【解决方案11】:

                    我在向量数学库中使用了 swizzle 函数的代码生成。我为此使用了一个自定义的 PERL 脚本。我看过的 FLOSS 生成器似乎都不适合创建 swizzle 函数

                    我一般使用 C++ 模板,而不是代码生成。

                    【讨论】:

                      【解决方案12】:

                      我主要使用LLBLGen Pro 来生成代码。它提供了多种用于生成的模式,您可以提供自己的模式,就像 CodeSmith 一样。客户支持非常好。

                      基本上,我使用 LLBLGen 生成我的业务对象和 DAL 并保持它们是最新的。代码模板有一些部分,您可以在其中添加自己的逻辑,这些逻辑在重新生成期间不会被清除。绝对值得一看。

                      【讨论】:

                        【解决方案13】:

                        我们使用 linq 和 XML 文字 (VB) 自定义构建代码生成。 我们还没有找到将解决方案分解为模板的方法;然而,这两种技术使这项任务变得如此微不足道,我认为我们不会这样做。

                        【讨论】:

                          【解决方案14】:

                          我认为代码生成是有害的,因为它会在没有添加新逻辑或洞察力的情况下使代码库膨胀。理想情况下,应该提高抽象级别,使用数据文件、模板或宏等,以避免生成大量样板代码。它可以帮助您快速完成工作,但从长远来看会损害可维护性。

                          如果您选择的编程语言通过从某种模板语言生成而变得不那么痛苦,这似乎表明您可以通过使用另一种可能更动态的语言进行更高级别的工作来节省更多时间。 YMMV。

                          【讨论】:

                          • 如果您可以自己设计用于生成代码的模板,我认为这是一个有争议的问题。抽象级别完全取决于您。
                          【解决方案15】:

                          LLBLGen Pro 是一款出色的工具,可让您编写与数据库无关的解决方案。掌握基本功能真的很快。高级功能并没有太大的挑战性。我强烈建议您检查一下。

                          【讨论】:

                            【解决方案16】:

                            我在一家网络代理公司担任了四年的主要开发人员,当我从头开始编写我的前两三个网站时,我很快意识到一直做这将是一项非常无聊的任务.所以我开始编写自己的网站生成器引擎。

                            我的出发点是这个网站http://www.codegeneration.net/。我将他们的一个示例用于简单的 crud 生成,并扩展到我用它生成整个站点的水平。

                            我使用 xml 来定义网站的各个部分(页面、数据列表、连接、表格、表单管理)。生成的网站与生成器完全分离,因此生成的网站也可以手动修改。

                            这是他们的文章http://www.codegeneration.net/tiki-read_article.php?articleId=19

                            【讨论】:

                              【解决方案17】:

                              我已经使用 Castor 完成了几次一次性的代码生成,以创建基于 XSD 的 Java 源代码。最新的用途是为 Open Travel Association 实现创建 Java 类。 OTA Schema 非常复杂,手工操作会很麻烦。考虑到架构的复杂性,Castor 做得很好。

                              【讨论】:

                                【解决方案18】:

                                Python

                                我使用了 MyGeneration,它使用 C# 来编写代码模板。然而,我开始使用 Python,我发现我可以用那种语言编写生成其他代码的代码,比用 C# 编写的代码更快。随后,我使用 Python 编写了生成 C#、TSQL 和 VB 的代码。

                                通常,生成其他代码的代码往往更难遵循其本质。 Python 更简洁的语法通过使其比 C# 中的同等语法更具可读性和可维护性而大有帮助。

                                【讨论】:

                                • 你有没有运气使用 SQLAlchemy + Python 来生成 NHibernate 映射? (或其他典型的代码生成器)
                                【解决方案19】:

                                .net 的 codesmith

                                【讨论】:

                                  【解决方案20】:

                                  我编写了一个实用程序,您可以在其中指定一个表,它会生成一个 Oracle 触发器,记录对该表的所有更改。让日志记录变得非常简单。

                                  还有一个我写的,它生成一个 Delphi 类,它可以模拟你给它的任何数据库表,但我认为它是一个 code smell 来做到这一点,所以我很少使用它。

                                  【讨论】:

                                    【解决方案21】:

                                    在公司,我们编写了自己的代码来生成大部分实体/dalc/业务类和相关的存储过程,因为它只需要一点时间,而且我们有一些特殊要求。虽然我确信我们可以使用现有的生成器实现相同的目标,但这是一个有趣的小项目。

                                    Codesmith 得到了很多人的推荐,而且看起来确实不错。就我个人而言,我对代码生成器所需要的只是让修改模板变得容易。

                                    【讨论】:

                                      【解决方案22】:

                                      我使用 myEclipse 中的休眠工具从我的数据模型生成域模型和 DAO 代码。它似乎工作得很好(如果你在 DAO 中编写自定义方法会出现一些问题,这些似乎在覆盖时会丢失),但通常它似乎工作得很好——尤其是与 Spring 结合使用。

                                      【讨论】:

                                        【解决方案23】:

                                        亚音速太棒了!!查询能力很容易掌握,存储过程的实现真的很棒。我可以继续下去。它让您立即高效工作。

                                        【讨论】:

                                          【解决方案24】:

                                          我主要在 C# 中编写代码,当我需要代码生成时,我在 XLST 中进行,当源代码可以简单地转换为 XML 或更复杂的 ruby​​ 脚本时。

                                          如果代码生成部分需要多个开发人员频繁修改,CodeSmith 工作得很好(并且比 XSLT 或新开发人员的 ruby​​ 更容易学习)。

                                          【讨论】:

                                            【解决方案25】:

                                            Outsystems 的Agile Platform 可用于生成开源、文档齐全的 C# 和 Java 应用程序。由于它还具有与部署、管理和更改相关的多项功能,因此大多数人最终不仅使用它来生成代码,而且实际上还用于管理 Web 应用程序的整个生命周期。

                                            【讨论】:

                                              【解决方案26】:

                                              一段时间以来,我一直使用一种本土的脚本/模板语言来生成代码。 (我使用这种语言主要是为了找到我的小宠物项目的用途)

                                              最近,我创建了一些 SQL*PLUS 脚本来创建数据库访问代码(我们没有 Hibernate...)

                                              【讨论】:

                                                【解决方案27】:

                                                MyGeneration一路!

                                                MyGeneration 是一个非常灵活的基于模板的代码生成器,用 Microsoft.NET 编写。 MyGeneration 擅长为 ORM 架构生成代码。您的数据库中的元数据可通过 MyMeta API 提供给模板。

                                                【讨论】:

                                                  猜你喜欢
                                                  • 2021-07-30
                                                  • 2010-12-19
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 1970-01-01
                                                  • 2020-07-17
                                                  • 2021-11-03
                                                  • 1970-01-01
                                                  相关资源
                                                  最近更新 更多