Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >你使用代码生成工具吗?

你使用代码生成工具吗?
EN

Stack Overflow用户
提问于 2008-09-27 07:43:37
回答 18查看 5K关注 0票数 10

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

您会生成应用程序的哪个(哪些)部分?

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

我目前正在做一些不同的项目,这些项目都使用一个自定义的代码生成器来处理从生成数据库结构、业务实体、DAL和BLL的所有事情。我对其他人使用这些工具的经验感到好奇。

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2008-09-27 10:21:59

我属于哲学阵营,他们认为代码生成器是“错误的”,因为它们表明了一些应该成为语言一部分的东西。

但写代码是实用主义程序员道德的重要组成部分,实际上,如果生成的代码在默认情况下是隐藏的,那么代码生成就会工作得很好。无论你想要多么纯粹的哲学,语言永远不会像你想要解决的问题那样快速发展。

在Visual Studio中生成Windows窗体时生成的代码就会出现在脑海中。如果愿意,您可以查看生成的代码,但最好不要这样做。但是,使用WPF迁移到声明性语言更好,因为以编程方式操作声明性代码比命令式代码更干净、更可靠。

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

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

  1. .NetTiers非常臃肿,并且生成的代码非常庞大。我认为代码生成工具使得创建feep。
  2. 变得太容易了,因为模式正在积极地开发和修改,我们也必须重新生成很多东西,这最终使得将所有内容保持在源代码控制中变得非常困难,因为所有的文件都在重新生成和替换。我最终不确定生成的代码是否应该在源代码控制中。

代码生成的最佳位置应该在编译器或构建阶段,而不是设计阶段。在C#中使用匿名类型或方法时,编译器会动态生成代码。如果您在设计阶段生成代码,那么每次底层参数更改时,您都会得到一大块必须重新生成的内容。

票数 9
EN

Stack Overflow用户

发布于 2008-09-27 12:12:57

不是说我们在.net/web领域工作,而是来自各种自制语言的自制代码生成工具是我们开发工具链中至关重要的一部分。我们有两个主要的这样的工具(带有语法、解析器和形式化定义),还有一大堆次要的工具,它们是基于宏构建的,比如m4和perl。它们最终都会生成原生编译的纯C语言。

根据我的经验,特定于领域的语言是程序员在任何大规模软件工作中提高工作效率的关键工具之一。如果您正在构建编译器、模拟器或其他具有许多在basic语言中根本不支持的循环模式的非常复杂的软件(这通常意味着可移植的C,有时是C++),则代码生成工具是可行的。我认为特定于域的语言是泛化的下一步:首先将常见的计算分解为函数(或历史上的子例程),然后将常见的函数分解为模板或泛型(如果有这样的工具可用),然后将更多的通用性和重复代码分解为成熟的自定义语言。

这一切都是为了减少您实际编写的代码量,并从编程过程中删除任何形式的乏味重复和无价值的代码。一旦模式重复,就应用一种特定领域的语言!

票数 7
EN

Stack Overflow用户

发布于 2008-09-27 07:59:36

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

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

不同的是,使用CodeSmith,我为我的应用程序生成了大量的代码,这些代码都是通用的,而且是一次性生成的。当改变模板的源(即表结构)时,这对于边缘情况和重新生成变得有问题。我还遇到了这样的情况,即有大量我不使用的代码,但这些代码是从我的模板中生成的。所有这些方法都有效吗?可能会,也可能不会。进入并清理生成的代码将是一项巨大的工作(即在同一代码库上花费了一年多的时间)。

相比之下,微代码生成允许我在我想要的正确场景中生成我需要的类。我用来做这件事的主要工具是ReSharper。我这样做的方法是先编写单元测试,然后再编写生产代码。在该场景中,ReSharper使用我的单元测试作为模板,为生产代码自动生成框架。然后,这只是一个填补空白的问题。

对于数据访问,我不再生成任何内容。我发现一个好的O/R取代了我过去放在我的数据访问层中的所有东西(即NHibernate)。鉴于此,在我的生活中,我再也不会编写或生成另一个数据访问层(我拒绝这样做)。

此外,我还获得了拥有大型单元测试套件以及其他功能的好处。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/143855

复制
相关文章
Koa/Express+TypeScript扩展类型
在我们使用Koa或者Express进行开发时会经常使用中间件进行访问权限过滤或者属性加工,很多时候我们需要把中间件的属性传递给下一个路由函数,但是因为TS类型的限制我们无法直接获取扩展的元素或者无法获取正确的类型。本文讲解了在使用Koa/Express+TypeScript开发时如何扩展中间件上的属性。
用户6256742
2022/07/11
8280
Koa/Express+TypeScript扩展类型
TypeScript入门——扩展类型之枚举
在上一篇文章中聊到了很多TS基础类型,那为什么又出现了扩展类型枚举,我们都知道任何东西都不是平白无故就出现的,都是为了解决特定的问题。枚举只是扩展类型其中之一,比如说还有类型别名,接口,类
程序员法医
2022/08/11
9970
TypeScript入门——扩展类型之枚举
TypeScript系列教程四《扩展类型》
TypeScript 最好玩的应该就是类型系统,随意组合创造,提供基础联合类型、交叉类型,还有一系列的高级函数可以玩转类型。
星宇大前端
2021/07/19
1.1K0
TypeScript系列教程四《扩展类型》
《现代Typescript高级教程》扩展类型定义
在 TypeScript 中,我们可以通过声明文件(.d.ts 文件)来为现有的 JavaScript 库提供类型定义,或者为现有的类型添加额外的属性和方法。这个过程通常被称为“类型声明扩展”。在这篇文章中,我们将详细探讨如何通过声明文件扩展类型定义。
linwu
2023/07/27
6110
TypeScript中的类型
基本类型布尔类型 (boolean)布尔类型表示一个值为真或假的逻辑值。let isDone: boolean = false;数字类型 (number)数字类型表示整数或浮点数。let count: number = 10;let price: number = 3.99;字符串类型 (string)字符串类型表示一串字符。let message: string = "Hello, TypeScript!";数组类型 (array)数组类型表示一个元素的集合。let numbers: number[] =
堕落飞鸟
2023/05/22
1.9K0
TypeScript 在 Vue2 中的类型声明问题
最近在一个新项目中,尝试了vue2+typescript的组合,碰到一个问题,在data属性中,我怎么声明一个变量的类型。
2022/02/25
4.7K0
TypeScript中的类型断言
本文是关于 TypeScript 中的 type assertions 的,它与其他语言中的类型强制转换有相似之处,并通过 as 运算符执行。
疯狂的技术宅
2020/06/19
3.8K0
实现TypeScript中的互斥类型
有这样一个对象,它有两个属性:name与title,在赋值的时候这两个属性只有一个能出现,例如:name出现的时候title就不能出现,title出现的时候name就不能出现。
神奇的程序员
2022/04/11
3.1K0
实现TypeScript中的互斥类型
TypeScript 中的数组类型定义
在 TypeScript 中声明和初始化数组也很简单,和声明数字类型和字符串类型的变量也差不多,只不过在指定数组类型时要在类型后面加上一个中括号 []
Qwe7
2022/03/19
5.4K0
【TypeScript 演化史 -- 8】字面量类型扩展 和 无类型导入
在我上一篇更好的类型推断的文章中,解释了 TypeScript 如何用 const 变量和 readonly 属性的字面量始化来推断字面量类型。这篇文章继续讨论这个,扩展和非扩展字面量类型之间的区别。
前端小智@大迁世界
2022/06/15
1K0
【TypeScript 演化史 -- 8】字面量类型扩展 和 无类型导入
Typescript 中,这些类型工具真好用
你是否曾经用 TypeScript 写代码,然后意识到这个包没有导出我需要的类型,例如下面这段代码提示 Content 在 @example 中不存在:
前端修罗场
2023/10/07
2180
Typescript 中,这些类型工具真好用
Typescript中的复杂类型声明
Typescript为javascript加入了众多类型声明语法,灵活使用可使代码变得健壮,不严谨的类型声明会带来后期的维护麻烦。本篇假设读者已经学会ts的基础类型声明语法,包括type、interface、extends和泛型,在此基础上,聊一聊一些更加复杂的类型声明场景以及解决办法。
腾讯IVWEB团队
2020/06/28
7.2K1
03-TypeScript中的强类型
在js中不能定义类型,而是根据赋值后,js运行时推断类型。在ts中支持强类型,强类型包括string、number(浮点型,不是整型)、boolean、any(任意类型)、Array<T>、自定义类型(枚举、类等) 除了能给变量申明为强类型,参数也可以申明为强类型,方法也可以定义返回类型,方法如果没有返回值,定义为void类型。 var username:string; var age:number; var descrption:any; var isman:boolean; var schools:Ar
用户1910585
2018/05/04
1.9K0
PHP中Redis扩展无法加载问题
phpredis编译出来的redis.so也需要拷贝到"/usr/lib64/php/modules/"中;
叫我可儿呀
2019/11/16
2K0
TypeScript 类型保护
这时就需要用到类型保护,类型保护允许你使用更小范围下的对象类型,常见的类型保护如下:
Leophen
2020/08/05
7190
TypeScript 类型保护
TypeScript 类型系统
针对 JavaScript 上面的问题,聪明的同学就想那我们就给 JavaScript 加个类型吧,和 Java 一样,能够对变量的类型进行定义,这个想法就是 TypeScript 的类型系统, 在很大程度上弥补了 JavaScript 的带来的困惑。
HoneyMoose
2021/11/16
8570
TypeScript 类型系统
TypeScript函数类型
通过如下代码我们实现了一个返回值为number类型的方法,同时我们也对返回值和参数进行了约束
HueiFeng
2020/04/09
7560
TypeScript函数类型
通过如下代码我们实现了一个返回值为number类型的方法,同时我们也对返回值和参数进行了约束
HueiFeng
2020/04/10
7920
TypeScript 类型系统
TypeScript 的学习资料非常多,其中也不乏很多优秀的文章和教程。但是目前为止没有一个我特别满意的。原因有:
lucifer210
2020/08/20
1.4K0
TypeScript 类型系统
点击加载更多

相似问题

TypeScript在扩展语法函数调用中无法推断数组类型

21

在Typescript中扩展泛型类型

141

无法在TypeScript中扩展快速请求

434

在Typescript中扩展外部类型声明

110

在TypeScript中扩展特定类型的数组

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文