标签: code-generation

代码生成器或T4模板,它们真的很邪恶吗?

我听说人们说不应该使用代码生成器和T4模板.这背后的逻辑是,如果您使用生成器生成代码,那么通过泛型和模板构建代码有一种更好的更有效的方法.

虽然我略微同意上面的这个陈述,但我还没有真正找到有效的方法来构建模板,例如可以说实例化自己.换句话说,我永远做不到:

return new T();
Run Code Online (Sandbox Code Playgroud)

此外,如果我想基于数据库值生成代码,我发现Microsoft.SqlServer.Management.SMO与T4模板结合使用可以很好地生成大量代码,而无需复制/粘贴或使用resharper.

我在Generics中发现的许多问题都是令我震惊的是,有很多开发人员不了解它们.当我为一个解决方案检查泛型时,有时它会变得复杂,因为C#表明你不能做一些看似合乎逻辑的事情.

你的想法是什么?你喜欢建造发电机,还是喜欢使用仿制药?此外,仿制药可以走多远?我对泛型有很多了解,但是我总是遇到陷阱和陷阱导致我使用T4模板.

处理需要大量灵活性的场景的更合适的方法是什么?哦,作为这个问题的奖励,C#和Generics的优秀资源是什么?

c# generics t4 code-generation

9
推荐指数
5
解决办法
6174
查看次数

使用Python生成C++代码

任何人都可以向我指出一些关于如何用Python(或Perl或任何其他Linux友好的脚本语言)编写脚本的文档,这些脚本从XML生成C++代码或从命令行生成py文件.我希望能够编写一些xml文件,然后运行一个shell命令来读取这些文件并生成带有完全内联函数的.h文件,例如流操作符,构造函数等.

c++ python code-generation

9
推荐指数
2
解决办法
2万
查看次数

Jaxb生成的类使用JAXBElement而不是指定的类型

这个问题已被各种各样的问题提出来 - 但我觉得仍然有进一步编目的空间.

我有一个带有两个元素定义的xsd

<xs:complexType name="elementA">
   <xs:sequence>
      <xs:element name="date" type="xs:string" minOccurs="0"/>
      <xs:element name="lastXdigits" type="xs:string" nillable="true" minOccurs="0"/>
   </xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

这会产生:

protected String date;
@XmlElementRef(name = "lastXdigits", namespace = "http://xxxxxxx", type = JAXBElement.class)
protected JAXBElement<String> lastXDigits;
Run Code Online (Sandbox Code Playgroud)

将xsd更改为:

<xs:element name="lastXdigits" type="xs:string" nillable="true" minOccurs="1"/>
Run Code Online (Sandbox Code Playgroud)

结果是:

protected String date;
@XmlElement(name = "lastXdigits", required = true, nillable = true)
protected String lastXDigits;
Run Code Online (Sandbox Code Playgroud)

和使用:

<xs:element name="lastXdigits" type="xs:string" minOccurs="0"/>
Run Code Online (Sandbox Code Playgroud)

结果是:

protected String date;
@XmlElement(name = "lastXdigits")
protected String lastXDigits;
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪.为什么在第一种情况下将lastXDigits生成为JAXBElement类型,为什么String类型在所有情况下都不够用?另外,当jaxb除了名称之外的定义相同时,为什么jaxb应该区别对待这两个元素呢?

我正在使用jaxb 2.0.5中的jaxb-xjc ant任务.

这看起来是否可疑或是否有充分的理由来解决这些差异?

java code-generation jaxb

9
推荐指数
1
解决办法
6046
查看次数

构建结构化二进制数据解析器的框架?

我有一些Pragmatic-Programmer类型代码生成的经验:以平台中立格式指定数据结构,并为代码生成器编写模板,这些代码生成器使用这些数据结构文件并生成将原始字节拉入特定于语言的数据结构的代码,对数字数据进行缩放,打印出数据等.很好的实用(TM)思想是(a)我可以通过修改我的规范文件和重新生成源(这是DRY和所有这些)来改变数据结构和( b)我可以通过修改模板添加可以为我的所有结构生成的其他函数.

我使用的是一个名为Jeeves的Perl脚本,但它是通用的,我想编写的任何函数来操作我从头开始编写的数据.

是否有任何框架非常适合为结构化二进制数据创建解析器? 我读过的Antlr表明这太过分了.我目前感兴趣的目标语言是C#,C++和Java,如果重要的话.

一如既往地谢谢.

编辑: 我会在这个问题上给予赏金.如果有任何我应该看的区域(搜索的关键词)或其他攻击你自己开发的问题的方法,我很乐意听到它们.

parsing code-generation binary-data

9
推荐指数
1
解决办法
1394
查看次数

为PhoneGap导出ASP.NET MVC应用程序源代码

我和我的团队目前正在使用ASP.NET MVC 4,HTML5和PhoneGap为Android和iOS开发应用程序.开发工作完美无缺; 但是,有一个问题仍然没有答案:从我们的MVC解决方案中生成PhoneGap需要的三个文件(一个HTML页面,一个JavaScript文件和一个CSS样式表)的推荐方法是什么?

您会建议使用基于Razor模板的方法吗?或者您只是在每次构建后自动复制输出HTML源代码?或者你会推荐别的东西吗?

asp.net asp.net-mvc code-generation html-generation cordova

9
推荐指数
1
解决办法
4212
查看次数

如何以编程方式在Visual Studio项目中生成新的Visual Studio项目?

我编写了一个带有数据库表的项目 - 您选择并构建与表列相关的C#类.喜欢,过滤,查询等.

它完全有效,我可以生成6个不同的类,具有完整的功能 - 取决于我的需要 - 只需点击一下即可获得一个表.T4真的很摇滚!

但是,我想为这些类创建一个新项目.如您所知,创建这些文件不是我的最终目标.

现在,我正在尝试以编程方式为这些类生成新的项目/解决方案.

我阅读了与此问题相关的不同问题,但这对我来说还不够.例如,以编程方式创建Visual Studio项目接近我的问题,但它不满足我.我找不到如何选择新项目的类型.

我查看了以编程方式生成Visual Studio解决方案,但我找不到一种方法来为我生成的类提供新的解决方案.我还看了树外科医生.它不满足我.安装之后,我发现它最初是为Visual Studio 2008设计的,它只是从用户那里获取项目名称.因此,树外科医生不是这个问题的解决方案.

我需要的是,学习如何编写新项目的结构并以编程方式创建它.在找到答案之后,我计划有一个项目,当你在浏览器中编写新项目名称,数据库名称,表名和所需类别时,那么T4和C#将适合你和ta-da!您将拥有一个具有控制器,帮助程序和新类的新项目.

可能吗?

c# t4 code-generation database-connection

9
推荐指数
1
解决办法
1167
查看次数

如何在JavaPoet中添加"任何类型"问号?

我正在使用JavaPoet生成代码.

在生成的代码中的某处,我想添加一个具有以下参数的方法.

...
    public B someMethod(final AbstractObjectBuilder<Persoon,?> builder) {
       ...
    }
...
Run Code Online (Sandbox Code Playgroud)

所以我的JavaPoet代码看起来应该是这样的

    //This does not compile, since I don't know what to put as last argument (questionmark)
ParameterizedTypeName parameterizedTypeName = ParameterizedTypeName.get(AbstractObjectBuilder.class, propertyType,?);

ParameterSpec parameterSpec = ParameterSpec.builder(parameterizedTypeName, name+"Builder", Modifier.FINAL).build();

MethodSpec modMethod = MethodSpec.methodBuilder(name)
                        .addModifiers(Modifier.PUBLIC)
                        .addParameter(parameterSpec)
                        .returns(TypeVariableName.get("B"));
...
Run Code Online (Sandbox Code Playgroud)

java code-generation javapoet

9
推荐指数
1
解决办法
3466
查看次数

JOOQ:如何向生成的记录类添加接口

我正在使用JOOQ 3.6.4和Java 8从模式生成一组JOOQ记录.

一些表是类似结构的参考数据,假设它们有ID,CODE和VALUE列(它们可能有其他列,但它们至少都有这些列).

在我的代码中,不是由JOOQ生成的,我有一个接口"ReferenceData",它定义了与JOOQ为这三列生成的代码匹配的访问器.我想告诉JOOQ为"implements ReferenceData"它生成的Record对象添加一个子句(JOOQ已生成的代码将自动实现接口).

我不是要求JOOQ自动找出接口,我很好地列出了每个表应该在XML配置中实现的接口.

问题1:有没有办法配置JOOQ来生成implements子句而无需编写自定义生成器类?

如果我必须编写一个自定义生成器类 - 我仍然希望定义什么表记录实现XML配置中的接口.

问题2:是否有一个在XML中定义自定义数据的示例,该数据被传递到自定义生成器类中?

java sql code-generation jooq

9
推荐指数
1
解决办法
911
查看次数

需要源到源编译器框架

我曾经使用OpenC++(http://opencxx.sourceforge.net/opencxx/html/overview.html)执行代码生成,如:

资源:

class MyKeyword A {
  public:
    void myMethod(inarg double x, inarg const std::vector<int>& y, outarg double& z);
};
Run Code Online (Sandbox Code Playgroud)

产生:

class A {
  public:
    void myMethod(const string& x, double& y);
    // generated method below:
    void _myMehtod(const string& serializedInput, string& serializedOutput) {
      double x;
      std::vector<int> y;
      // deserialized x and y from serializedInput
      double z;
      myMethod(x, y, z);
    }
};
Run Code Online (Sandbox Code Playgroud)

这种代码生成通过编写元级别的程序来直接匹配OpenC++教程中的用例(http://www.csg.is.titech.ac.jp/~chiba/opencxx/tutorial.pdf) "MyKeyword","inarg"和"outarg"并执行代码生成.但是,OpenC++现在已经过时并且处于非活动状态,我的代码生成器只能在g ++ 3.2上运行,并且在解析g ++更高版本的头文件时会触发错误.

我查看了VivaCore,但它没有提供编译元级程序的基础结构.我也在看LLVM,但是我找不到能够帮助我完成源到源编译用法的文档.我也知道ROSE编译器框架,但我不确定它是否适合我的用法,以及它的专有C++前端二进制文件是否可用于商业产品,以及Windows版本是否可用.

任何对特定教程/论文/文档的评论和指示都非常感谢.

c++ code-generation code-translation

8
推荐指数
1
解决办法
1613
查看次数

IntelliJ IDEA Hibernate

我正在学习休眠,我遇到了一些问题.我正在读O'Reilly的"Harnessing Hibernate".他们使用ANT解释所有内容,但由于我想避免编写一个巨大的build.xml文件,我试图让它与IntelliJ一起工作.

我设法根据MySQL数据库中的DB表进行映射,并为其编写bean.它工作,但我找不到任何有关如何生成bean和SQL代码,或如何使用IntelliJ进行逆向工程的信息.我使用JBOSS Hibernate工具插件找到了大量关于Eclipse的教程,并且该网站声称这种生成代码的支持已经在IntelliJ的标准安装中.

我忘记了添加库等配置吗?我试图找到这个,但我现在绝望了.请不要建议我使用Eclipse,我需要IntelliJ作为我当前的角色.

java code-generation hibernate intellij-idea

8
推荐指数
1
解决办法
2万
查看次数