问题标签 [code-generation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
7395 浏览

c++ - 我应该如何对代码生成器进行单元测试?

我知道这是一个困难且开放式的问题,但我想我会把它扔到地板上,看看是否有人有任何有趣的建议。

我开发了一个代码生成器,它将我们的 python 接口与我们的 C++ 代码(通过 SWIG 生成)相结合,并生成将其公开为 WebServices 所需的代码。当我开发这段代码时,我是使用 TDD 完成的,但我发现我的测试非常脆弱。因为每个测试本质上都想验证对于给定的输入代码位(恰好是 C++ 标头)我会得到给定的输出代码位我编写了一个小引擎,它从 XML 输入文件中读取测试定义并生成测试来自这些期望的案例。

问题是我根本不敢修改代码。那以及单元测试本身是a:复杂和b:脆弱的事实。

所以我试图想出解决这个问题的替代方法,这让我感到震惊,我可能是以错误的方式解决它。也许我需要更多地关注结果,IE:我生成的代码是否真正运行并执行我想要的操作,而不是代码看起来像我想要的那样。

有没有人有类似的经历,他们愿意分享?

0 投票
5 回答
1813 浏览

python - Visual Studio 的 Python 代码生成器?

我有一个想法,如果我将 python .py 文件添加到我的 C# 项目中,并使用将执行 python 文件的自定义生成器标记该文件,并将输出视为代码生成的结果,即。将其放入 C# 文件中,这将允许我在构建过程中进行大量代码生成。

有谁知道是否存在这样的 Visual Studio 2008 自定义生成器?

0 投票
10 回答
513 浏览

database - 从对象定义生成数据库表

我知道有几种(自动)方法可以创建数据访问层来操作现有数据库(LINQ to SQL、Hibernate 等)。但我有点厌倦了(我相信应该有更好的做事方式),比如:

  1. 在 Visio 中创建/更改表
  2. 使用 Visio 的“更新数据库”创建/更改数据库
  3. 将表导入“LINQ to SQL 类”对象
  4. 相应地更改代码
  5. 编译

从对象/实体定义生成数据库模式的方法怎么样?我似乎找不到像这样的工具的良好参考(我希望至少在某些框架中提供某种内置支持)。

如果我能做到这将是完美的:

  1. 更改对象定义
  2. 更改操作对象的代码
  3. 编译(数据库更改自动完成)
0 投票
3 回答
4209 浏览

c# - 有没有办法生成 WMI 代码/类?

如何生成用于访问 WMI 的 C# 类?

0 投票
3 回答
289 浏览

build-process - 在自动构建中管理生成代码的最佳方式是什么?

在我的自动化 NAnt 构建中,我们有一个步骤从数据库中生成大量代码(使用 SubSonic),并且代码被分隔到与数据库中的模式名称匹配的文件夹中。例如:

  • /生成代码
    • /dbo
      • SomeTable.cs
      • 其他表格.cs
    • /abc
      • 客户.cs
      • 订单.cs

架构名称用于隔离应用程序需要的生成类。例如,有一个 ABC 应用程序,它将从这个中央文件夹中提取生成的代码。我在预构建事件中这样做,如下所示:

del /F /Q $(ProjectDir)Entities\generated*.cs

复制 $(ProjectDir)....\generated-code\abc*.cs $(ProjectDir)Entities\generated*.cs

因此,在每次构建时,Nant 脚本都会运行生成器,将所有代码放入一个中央存放位置,然后启动解决方案构建……其中包括每个需要生成类的项目的预构建事件。

所以这是我看到的摩擦:

1) 每个新应用都需要设置这个预构建事件。不得不这样做有点糟糕。

2)在我们的构建服务器中,我们不生成代码,所以我实际上在每个命令之前都有一个 IF $(ConfigurationName) == "Debug",所以发布版本不会发生这种情况

3) 有时命令会失败,这会导致我们的本地构建失败。如果出现以下情况,它将失败: - 还没有生成代码(只是设置一个新项目,还没有数据库) - 目录中没有现有代码(第一次构建)

通常这些都是次要修复,我们刚刚破解了获得新项目或新机器并与构建一起运行的方法,但这阻止了我的一键构建 Nirvana。

所以我想听听关于如何在更耐用的地方改进它的建议。也许将代码的复制移动到应用程序文件夹到 NAnt 脚本中?这对我来说似乎有点倒退,但我愿意听取有关它的论点。

好的,开火:)

0 投票
12 回答
76268 浏览

c# - 如何从 C# 类生成数据库表?

有谁知道为给定类自动生成数据库表的方法?我不是在寻找整个持久层——我已经有一个正在使用的数据访问解决方案,但是我突然不得不存储来自大量类的大量信息,我真的不想创建所有这些表都是手工制作的。例如,给定以下类:

我期望以下 SQL:

我也想知道你如何处理复杂的类型。例如,在前面引用的类中,如果我们将其更改为:

我怎么能处理这个?

我已经研究过尝试使用反射来枚举每个类的属性,自己自动生成数据库脚本,但它很笨重,而且复杂的数据类型让我很难过。

0 投票
22 回答
1224 浏览

language-agnostic - 生成的代码是否需要人类可读?

我正在开发一个工具,该工具将为一个接口和几个实现该接口的类生成源代码。我的输出并不是特别复杂,所以让输出符合我们正常的代码格式标准并不难。

但这让我开始思考:自动生成的代码需要如何具有人类可读性?什么时候应该花费额外的精力来确保生成的代码易于阅读和理解?

就我而言,我生成的类本质上只是一些与构建的另一部分相关的数据的容器,其中包含获取数据的方法。没有人需要查看类本身的代码,他们只需要调用类提供的各种 getter。因此,代码是否“干净”、格式正确且易于人类阅读可能并不重要。

但是,如果您生成的代码中包含大量简单逻辑,会发生什么情况?

0 投票
6 回答
4801 浏览

language-agnostic - 代码生成器与 ORM 与存储过程

这些软件架构各自在哪些领域发光或失败?

哪些关键要求会促使您选择其中一项?

请假设您有可用的开发人员,他们可以编写良好的面向对象代码以及良好的数据库开发。

另外,请避免圣战 :) 这三种技术各有利弊,我对最适合使用哪种技术感兴趣。

0 投票
4 回答
25417 浏览

visual-studio - 如何在 Visual Studio 中自动生成多个 getter/setter 或访问器

在开始之前,我知道有这篇文章,但它没有回答我的问题:如何在 Visual Studio 中生成 getter 和 setter?

在 Visual Studio 2008 中,可以通过右键单击私有变量 -> 重构 -> 封装字段来自动生成 getter 和 setter(访问器)...

这对于有 2 或 3 种方法的类来说非常棒,但是来 MS 吧!你什么时候用过一个有几个访问器的类?

我正在寻找一种只需单击几下即可生成 ALL 的方法(那里的 Eclipse 人员会知道我在说什么——您可以右键单击一个类并选择“生成访问器”。完成。)。我真的不喜欢在一节课上花 20 分钟点击向导。我曾经有一些会生成类的 .NET 1.0 代码,但它早已不复存在,这个特性应该是 IDE 的标准。

更新:我可能会提到我发现 Linq to Entities 和 SQLMetal 是非常酷的想法,远远超出了我在上一段中的简单要求。

0 投票
13 回答
3534 浏览

garbage-collection - 如何在没有 gc 的情况下实现闭包?

我正在设计一种语言。首先,我想决定生成什么代码。该语言将具有类似于 javascript 的词法闭包和基于原型的继承。但我不是 gc 的粉丝,并尽量避免。那么问题来了:有没有一种优雅的方式来实现闭包,而无需在堆上分配堆栈帧并将其留给垃圾收集器?

我的第一个想法:

  1. 使用引用计数和垃圾收集周期(我不太喜欢这个)
  2. 使用意大利面条堆栈(看起来非常低效)
  3. 将闭包的形成限制在某些上下文中,这样我就可以摆脱返回地址堆栈和本地堆栈。

我不会使用高级语言或遵循任何调用约定,所以我可以随心所欲地粉碎堆栈。

(编辑:我知道引用计数是垃圾收集的一种形式,但我在其更常见的含义中使用 gc)