我正在开发一个工具,它将生成一个接口的源代码和几个实现该接口的类.我的输出并不是特别复杂,因此输出符合我们正常的代码格式标准并不难.
但这让我想到:自动生成的代码需要多么可读?什么时候应该花费额外的努力来确保生成的代码很容易被人类阅读和理解?
在我的例子中,我生成的类本质上只是与构建的另一部分相关的一些数据的容器,其中包含获取数据的方法.没有人需要查看类本身的代码,他们只需要调用类提供的各种getter.因此,如果代码"干净",格式良好且易于人类阅读,则可能并不太重要.
但是,如果您生成的代码中包含少量简单逻辑,会发生什么?
我们在自己的设计师中使用DesignSurface和所有优秀的IDesignerHost优点.然后,设计的表格将以我们自己的定制格式保存,并且所有这些都非常有用.我们还希望将表单导出为基于文本的格式(我们已经完成了,因为它并不困难).
但是,我们还希望将该文本导入设计器的文档中,该文档涉及将设计器代码重新放回CodeCompileUnit.不幸的是,Parse方法没有实现(毫无疑问,很好的理由).还有其他选择吗?我们不想使用标准.NET安装中不存在的任何东西(比如用Visual Studio安装的.NET库).
我目前的想法是编译导入的文本然后实例化表单并将其属性和控件复制到设计表面对象,并只捕获新的CodeCompileUnit,但我希望有更好的方法.谢谢.
更新:我可能会对我们的进展感兴趣.到目前为止,还不是那么好.我发现的一个简要概述是Parse方法没有实现,因为它被认为太难了,开源解析器存在,但是它们不完整,因此无法保证在所有情况下都能工作( NRefactory是SharpDevelop项目中的一个,我相信,并且从实例到设计器的控件复制工作尚未完成.我相信这是因为虽然控件被添加到设计器表面包装的表单实例中,但设计者表面并未意识到它们的包含.我们的下一个尝试是模仿剪切/粘贴,看看是否能解决它.显然,这是一个巨大的讨厌的解决方法,但我们需要它工作,所以我们'
你生成数据字典吗?如果是这样,怎么样?
我在SQL Server 2005中使用扩展过程来保存表和字段信息.我有一些查询可以创建一个字典,但它是......嗯.您是否使用了特定的查询或工具?你是从数据库图表中生成的吗?
谷歌搜索"数据字典SQL服务器"提出了许多查询,但它们都同样具有吸引力.也就是说,良好的起点,但不准备生产.
很长一段时间,我已经阅读并理解了有关Web开发的以下事实:
这通常都很好,我发现当我严格遵循这些指导并使用外部.css和.js文件时,它使我的整个网站更易于管理.但是,我认为我发现了一种打破这种思路的局面.
我有一个自定义论坛系统,我为我的一个网站建立.除了这种系统的常用格式(链接,图像,粗体斜体和下划线等)之外,我还允许用户设置文本的格式,包括颜色,字体系列和大小.所有这些都由论坛消息数据库保存为格式化代码,然后在查看页面时转换为相应的HTML.(有点效率低,技术上我应该在保存前翻译,但这样我就可以在系统上工作.)
由于这个和其他类似系统的性质,我最终在生成的HTML代码周围浮动了很多标签,我认为这是非正式弃用的,因为我应该使用CSS进行格式化.这打破了规则1和规则2,它规定HTML不应包含格式信息,而是更喜欢将信息放在CSS文档中.
有没有办法在CSS中实现动态格式化而不在标记中包含该信息?这值得吗?或者,考虑到正确代码的隐含限制,我可以限制用户可以执行哪些操作以遵循"正确"格式化代码的方式?
html css code-generation code-formatting standards-compliance
有没有工具将LLVM IR代码转换为Python代码?我知道有可能将它转换为Javascript(https://github.com/kripken/emscripten/wiki),转换为Java(http://da.vidr.cc/projects/lljvm/),我很乐意转换它也适用于Python.
另外如果这样的工具不存在,你可以提供任何信息,什么是最好的工具(也许我应该用其他语言扩展emscripten - Javascript和Python在某些方面相似;))
关于我的域对象中生成的getter和setter方法,我有一个小问题.我想为我的源代码使用一个通用的样式指南.该样式指南的一部分说我开始使用前缀'm'作为成员的每个类成员名称.
class User{
String mName;
List<Call> mAllCall;
List<Geo> mAllGeo;
Run Code Online (Sandbox Code Playgroud)
不幸的是,我有几个有更多成员变量的类.我遇到的问题是我是一个非常懒惰的开发人员,我在Eclipse中创建了getter和setter方法
"来源" - >"生成吸气剂和二传手".
结果是
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public List<Call> getmAllCall() {
return mAllCall;
}
public void setmAllCall(List<Call> mAllCall) {
this.mAllCall = mAllCall;
}
public List<Geo> getAllGeo() {
return mAllGeo;
}
public void setmAllGeo(List<Geo> mAllGeo) {
this.mAllGeo = mAllGeo;
}
Run Code Online (Sandbox Code Playgroud)
那不是我想要的结果.我需要这个:
public String getName() {
return mName;
}
public void setName(String pName) {
this.mName = pName;
}
public …Run Code Online (Sandbox Code Playgroud) 我想将我用C#编写的类暴露给javascript等价物.
例如,我有一个类:
// C# class to represent an Appriaser
public class Appraiser
{
public Appraiser(appraiserId, appraiserName)
{
AppraiserId = appraiserId;
AppraiserName = appraiserName;
}
public int AppraiserId { get; set; }
public string AppraiserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在javascript中自动生成此类的一个版本
// javascript class to represent an Appraiser
function Appraiser(appraiserId, appraiserName) {
var self = this;
self.appraiserid= appraiserId;
self.appraisername= appraisername;
}
Run Code Online (Sandbox Code Playgroud)
这可能与JSON.NET或其他方法有关吗?
是否可以创建一个扩展方法来返回对象列表中的单个属性或字段?
目前我有很多功能,如下所示.
public static List<int> GetSpeeds(this List<ObjectMotion> motions) {
List<int> speeds = new List<int>();
foreach (ObjectMotion motion in motions) {
speeds.Add(motion.Speed);
}
return speeds;
}
Run Code Online (Sandbox Code Playgroud)
这是"硬编码",仅在单个对象类型中提供单个属性.它很乏味,我确信有一种方法可以使用LINQ/Reflection来创建一个可以通用和可重用方式执行此操作的扩展方法.像这样的东西:
public static List<TProp> GetProperties<T, TProp>(this List<T> objects, Property prop){
List<TProp> props = new List<TProp>();
foreach (ObjectMotion obj in objects) {
props.Add(obj.prop??);
}
return props;
}
Run Code Online (Sandbox Code Playgroud)
除了使用LINQ的最简单的方法,我也在寻找最快的方法.是否可以使用代码生成(和Lambda表达式树)在运行时创建这样的方法?我确信这比使用Reflection更快.
我正在使用.properties文件进行邮件国际化.例如:
HELLO_WORLD = Hello World
HELLO_UNIVERSE = Hello Universe
Run Code Online (Sandbox Code Playgroud)
然后在Java代码中:
String foo = resourceBundle.getString("HELLO_WORLD");
Run Code Online (Sandbox Code Playgroud)
字符串文字是"HELLO_WORLD"有问题的,因为它们容易出错并且无法自动完成.我想从属性文件中的键生成代码,如下所示:
public interface Messages { // Or abstract class with private constructor
public static final String HELLO_WORLD = "HELLO_WORLD";
public static final String HELLO_UNIVERSE = "HELLO_UNIVERSE";
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
String foo = resourceBundle.getString(Messages.HELLO_WORLD);
Run Code Online (Sandbox Code Playgroud)
有没有标准的方法来做到这一点?我更喜欢Maven插件,但我可以手动运行的任何独立工具都足以满足我的需求.
Let's consider this trivial code:
#include <atomic>
std::atomic<int> a;
void f(){
for(int k=0;k<100;++k)
a.load(std::memory_order_relaxed);
}
Run Code Online (Sandbox Code Playgroud)
MSVC, Clang and GCC all perform 100 loads of a, while it seems obvious it could have been optimized away. I expected the function f to be a nop (See generated code here)
Actually, I expected this code generation for a volatile atomic:
volatile std::atomic<int> va;
void g(){
for(int k=0;k<100;++k)
va.load(std::memory_order_relaxed);
}
Run Code Online (Sandbox Code Playgroud)
Why do compilers not optimize away unnecessary atomic loads?
code-generation ×10
c# ×3
java ×2
.net ×1
atomic ×1
c++ ×1
converter ×1
css ×1
designer ×1
eclipse ×1
html ×1
javascript ×1
json.net ×1
llvm ×1
oop ×1
python ×1
readability ×1
reflection ×1
sql-server ×1
volatile ×1
winforms ×1