我正在设计一种语言.首先,我想决定要生成什么代码.该语言将具有类似于javascript的词法闭包和基于原型的继承.但我不是gc的粉丝,尽量避免.所以问题是:有没有一种优雅的方法来实现闭包而不需要在堆上分配堆栈帧并将其留给垃圾收集器?
我的第一个想法:
我不会使用高级语言或遵循任何调用约定,所以我可以尽可能多地粉碎堆栈.
(编辑:我知道引用计数是垃圾收集的一种形式,但我使用gc的更常见的含义)
我读过Robert Martin的"清洁代码",它在80年代的Emacs中已经能够录制和播放你的编码会话.
我刚刚意识到我从这种练习中学到了多少,我很想了解自己!
但是我真的不认为录制屏幕(如视频)会非常有效,特别是因为Visual Studio已经无法忍受的速度慢,而且在播放器中寻找视频也很无聊.
相反,有一些插件可以记录我编码的内容(所以不是调试和视觉设计师等)真的很棒,并且可以回放给我看看我有多吮吸和在哪里.
这可能吗?
编辑:只是从书中引用,以显示这可能是多么有趣:
鲍勃进入模块.
他向下滚动到需要改变的功能.
考虑到他的选择,他停顿了一下.
哦,他正在向上滚动到模块的顶部以检查变量的初始化.
现在他向下滚动并开始输入.
哎呀,他正在抹掉他打字的东西!
他再次打字.
他再次擦掉它!
他输入了其他一半的东西但随后删除了!
他向下滚动到另一个函数,该函数调用他正在改变的函数以查看它是如何被调用的.
他向上滚动并键入他刚删除的相同代码.
他停顿了一下.
他再次删除了那段代码!
他弹出另一个窗口,看着一个子类.这个功能被覆盖了吗?
...
我遇到了DRY原则(不要重复自己)的问题,并最大限度地减少了围绕Rete规则引擎的依赖性.
大型IT组织中的规则引擎往往是企业(注意资本"E" - 这是严肃的业务).所有规则必须表达一次,很好和DRY,并集中在昂贵的规则引擎中.一个组维护规则引擎,并且是规则集的守护者.
当该IT组织是美国保险公司的一部分时,往往会有很多规则.有些规则适用于所有州和产品,但每个州都倾向于为不同的产品制定自己的法律,因此规则需要反映这些怪癖.这些类别很多:精算,承保,甚至是来自第三方机构的订购信用和机动车报告.
从设计的角度来看,我所面临的问题是集中规则和处理当然是好的和干的,但是有成本:
许多其他企业技术(例如,B2B网关,ESB等)都会出现这些问题.
相同的企业集团也将SOA视为基本原则.但我对正确的服务设计的理解是,它们应该平铺业务空间并且是幂等的,独立的和孤立的.如果服务规则在其他地方维护,服务如何独立和隔离?
我想在简单性方面犯错,认为如果规则只能在孤立的情况下应用,那么消除依赖关系应该优先于集中化.我不确定这个论点会赢得胜利.
所以我的问题是:
假设您有两个相同bean类型的实例,并且您希望显示两个实例之间已更改内容的摘要 - 例如,您在应用程序中有一个表示用户设置的bean,并且您希望能够显示用户正在提交的新设置(实例#1)中已更改内容的列表与已为用户存储的内容(实例#2)的列表.
对于诸如此类的任务,是否存在常用的算法或设计模式,可能是可以抽象并重用于不同类型的bean的东西?(我很难想到这类问题的好名字,知道谷歌会怎么做).我检查过commons-beanutils,没有任何东西弹出我.
宏扩展和代码生成都有利弊.你最喜欢的方法是什么?为什么?我们何时应该选择其中一个?请提出建议.谢谢!
宏扩展可以非常方便和有用:http: //dtemplatelib.sourceforge.net/table.htm
VS
代码生成为您提供了大量优秀的代码:http : //code.google.com/p/protobuf/ http://incubator.apache.org/thrift/
我正在回想起我在大学一年级的那一年(五年前),当时我参加了一个考试,从而完成了计算机科学的入门课程.有一个关于循环不变的问题,我想知道如果循环不变是真的有必要在这种情况下,或者如果问题只是一个坏榜样......问题是写一个迭代定义为一个阶乘函数,然后证明功能是正确的.
我为阶乘函数提供的代码如下:
public static int factorial(int x)
{
if ( x < 0 ){
throw new IllegalArgumentException("Parameter must be >= 0");
}else if ( x == 0 ){
return 1;
}else{
int result = 1;
for ( int i = 1; i <= x; i++ ){
result*=i;
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我自己的正确性证明是一个案例的证明,并且每一个我断言它的定义是正确的(x!对于负值是未定义的,0!是1,x!是1*2*3 ......*x对于x)的正值.教授希望我用循环不变量来证明循环; 但是,我的论点是"按定义"是正确的,因为"x!"的定义 对于正整数x是"1 ... x的整数的乘积",而else子句中的for循环只是该定义的字面翻译.在这种情况下,真正需要一个循环不变量作为正确性的证明吗?在循环不变量(以及正确的初始化和终止条件)成为正确性证明之前,循环必须有多复杂?
另外,我想知道......行业中使用这种正式证据的频率是多少?我发现我的课程大约有一半是非常理论性和证据性的,大约一半是非常实施和编码,没有任何正式或理论材料.这些在实践中重叠多少?如果您确实使用了行业中的样张,那么何时应用它们(总是,只有它很复杂,很少,从不)?
编辑
如果我们自己,相信这一块的代码是正确的,可以说服别人(非正式)它是正确的,并有到位的单元测试,以被正确性的形式证明需要什么样的程度?
我正在寻找一种UI功能建模语言(类似于UML的“事物”,但用于用户界面),该语言已经被接受并且可能具有其设计模式,并且比状态图或活动图更好地处理了问题。
由于发现UML及其图表无法描述具有事件驱动的执行流的复杂UI功能(例如javascript / jQuery大项目)而导致想到此问题
编辑:我一直在考虑使用BPMN,但它不是为此目的而创建的。
格雷格威尔逊的谈话"一些证据"(http://www.slideshare.net/gvwilson/bits-of-evidence-2338367)讨论了以下声称背后的证据,即Martin Fowler已经提出使用DSL的好处:
"[使用领域特定语言]带来两个主要好处.第一个,也是最简单的是提高程序员的工作效率.第二个......是......与领域专家的沟通." - 2009年7月/ 8月IEEE Software的 Martin Fowler
问题:是否有任何实证研究提供证据证明程序员的工作效率得到提高或与使用DSL的领域专家的沟通得到改善?
许多构建DSL的人无法为"你为什么要构建DSL?"提供合理的答案.并且"为什么DSL会帮助你而不是一个考虑周全的对象模型呢?"
我听到很多"我这样做是因为它很酷而其他人都在做" - 这不是一个理性的答案.
我认为DSL至少在某些时候是有用的,但它们不太可能成为应该不加选择地使用的"银弹".我希望看到一些科学着作,描述何时应该和不应该使用DSL--基于实证研究.
我正在教Java EE,尤其是JPA,Spring和Spring MVC.由于我在大型项目方面没有太多经验,因此很难知道如何向学生介绍ORM的优化.
目前,我提出了一些经典的优化技巧:
社区是否还有其他方面可以了解优化ORM的其他方法?我对DAO模式特别感兴趣......
我最近一直在研究一个点云播放器,理想情况下应该能够从激光雷达捕获中可视化地形数据点并以大约30fps的顺序显示它们.然而,我似乎已经因PCI-e IO而陷入困境.
我需要为每一帧做的是加载存储在内存中的大点云,然后根据高度计算颜色图(我使用的东西类似于matlab的喷射图),然后将数据传输到GPU.这适用于云捕获,点数<100万.然而,在大约200万点时,这开始减慢到每秒30帧以下.我意识到这是很多数据(每点200万帧*[每点3个浮点数+每个颜色点3个浮点数]*每个浮点数4个字节*每秒30帧=每秒约1.34千兆字节)
我的渲染代码现在看起来像这样:
glPointSize(ptSize);
glEnableClientState(GL_VERTEX_ARRAY);
if(colorflag) {
glEnableClientState(GL_COLOR_ARRAY);
} else {
glDisableClientState(GL_COLOR_ARRAY);
glColor3f(1,1,1);
}
glBindBuffer(GL_ARRAY_BUFFER, vbobj[VERT_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, vertData, GL_STREAM_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbobj[COLOR_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, colorData, GL_STREAM_DRAW);
glColorPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_POINTS, 0, numPoints);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
每帧都会更改vertData和colorData的指针.
我希望能够做到的是,即使以后使用每帧可能达到700万点的大点云,也能够以每秒至少30帧的速度播放.这甚至可能吗?或者也许更容易网格化并构建高度图并以某种方式显示它?我对3D编程还很陌生,所以任何建议都会受到赞赏.