今天教授的软件工程完全专注于面向对象的编程和面向世界的"自然"面向对象的视图.有一个详细的方法描述了如何将域模型转换为具有多个步骤的类模型以及许多(UML)工件,如用例图或类图.许多程序员已经内化了这种方法,并且很好地了解了如何从头开始设计面向对象的应用程序.
新的炒作是函数式编程,在许多书籍和教程中都有教授.但功能软件工程呢?在阅读有关Lisp和Clojure的文章时,我发现了两个有趣的陈述:
功能程序通常是自下而上而不是自上而下开发('On Lisp',Paul Graham)
函数程序员使用映射,其中OO程序员使用对象/类('Clojure for Java Programmers',Rich Hickley的演讲).
那么功能性应用程序的系统化(基于模型的?)设计的方法是什么,即在Lisp或Clojure中?有哪些常见步骤,我使用哪些工件,如何将它们从问题空间映射到解决方案空间?
lisp functional-programming clojure model-driven-development
UML可以用于自己编程计算机系统,没有支持的实现语言,例如直接到机器代码的图表(可能通过C或C++等),没有人工编码干预.
一段时间以来,我一直对正式方法感兴趣.我使用了正式的方法来推理我一直在研究的一些项目的一些非常具体的子领域.我永远无法说服其他团队成员尝试同样的,更不用说用正式方法指定整个域了.
我发现一种特别有趣的方法是Alloy.我认为它可以作为整个项目的基础更好地"扩展",因为它在概念上和符号上非常接近实际的编程语言.此外,这些工具非常可靠,因此可以轻松获得模型验证的好处.
我非常有兴趣了解您在项目中使用Alloy时可能遇到的任何实际经验.您是否认为它帮助您设计了更好的域模型?在验证期间是否在您的域模型中发现错误?你会再次使用它吗?
我真的很想知道您对Java和/或.NET的模型驱动软件开发的看法.
它能节省时间吗?它是否提高了质量?
我的团队正在使用IBM的Rhapsody工具进行实时嵌入式开发.不幸的是,我们对目前的审核流程不满意.
更具体地说,我们遇到了困难,因为:
有没有人有任何关于在Rhapsody开发上进行同行评审的强大但又轻松的提示?您想分享的任何最佳实践和经验教训?我不是在寻找一个成熟的流程写作; 花絮我不知道会不会很棒.
我目前面临的情况是,我作为测试驱动开发的倡导者必须与模型驱动软件开发(MDSD)/模型驱动架构(MDA)的倡导者竞争.
在我看来,代码生成是我工具箱中的一个有价值的工具,我需要时大量使用模板和自动化.当我认为这有助于理解内部工作或讨论白板上的架构时,我还用UML创建图表.但是,我强烈怀疑通过UML创建软件(创建状态图和序列图以创建工作代码而不仅仅是代码的骨架)对于多层应用程序(数据库层,业务/域层和Gui,甚至可能是分布式的)更有效.在我看来,当谈到MDSD时,CASE工具突然不再仅仅是一种工具,而是满足的要求:一方面,我看到它,
所有这些让我想知道是否有一个成功的故事(产品是及时推出,在变幻无常的时间内,只有少数错误和部分软件已经被重用),以满足现实世界的应用需求.这个creteria并使用严格的模型驱动方法开发:
我参与了一场关于领域模型可见性的有趣辩论,并想知道这里的人是否有任何良好的指导.
希望看到一些关于此的评论和想法.
感谢所有的帮助!
只需阅读关于模型驱动软件开发(MDSD)的(德国)Wiki文章.总结Wiki定义:
因为我知道并使用高阶函数式编程,我想知道,我的实际问题是:MDSD是否只是一种绝望的尝试,将高阶函数式编程提供的强大功能注入(部分)编程语言/范例本身缺乏那些功能?
(或者我误解了MDSD甚至可以用来支持高阶函数编程吗?)
使用Mendix Business Modeler构建Web应用程序与使用Java/Spring/JSF等技术开发Web应用程序有着根本的不同.但是,为了这个问题,我将尝试比较两者:
在基于Java/Spring的应用程序中,我可以将我的应用程序与第三方产品Ehcache集成,以在方法级别缓存数据.例如,我可以配置ehcache来存储给定方法的返回值(具有特定的生存时间).每当调用此方法时,ecache将自动检查先前是否使用相同的参数调用了方法,以及缓存中是否存在存储的返回值.如果是这样,则永远不会实际执行该方法,而是立即返回缓存的方法返回值.
我希望在Mendix中具有相同的功能,但在这种情况下,我将缓存Microflow返回值.此外,我不希望被强制在整个地方添加操作,明确告诉Microflow检查缓存.我想在一个集中的地方注册我的Microflows进行缓存,或者只是标记每个Microflow进行缓存.换句话说,这个问题与Mendix中面向方面编程(AOP)的概念一样多,因为它是关于缓存的:有没有一种方法可以挂钩进入Microflow调用,以便我可以应用前后执行操作?在我看来,同样的原因也就是为什么AOP在Java中有它的目的.
当我使用模型驱动的形式,如:
@Component({
selector: 'my-app',
template: `
<p>
<label>First Name:</label>
<input type="text" [ngModel]="user.firstName" required>
</p>
`,
providers: [myService]
})
Run Code Online (Sandbox Code Playgroud)
当我使用模板驱动形式时,如:
@Component({
selector: 'my-app',
template: `
<p>
<label>First Name:</label>
<input type="text" formControlName="firstName">
</p>
`,
providers: [myService]
})
Run Code Online (Sandbox Code Playgroud)
我认为上面两件事都有相同的功能.所以,在开始新项目的时候,我觉得哪个更好?
我相信在实时和嵌入式软件开发领域中,模型驱动的开发/工程(即OMGs模型驱动架构)已经有了一些提升.人们有哪些工具和工具供应商的经验?
谷歌给了我很多学术论文和一两个供应商(IBM Rational Rose Technical Developer和VisSim).
此外,我们将非常感谢有关模型格式(UML?),平台特定模型的目标语言/环境(C?RTOS?)和测试(基于逻辑的?)的任何信息.
我正准备参加模型驱动开发考试.我遇到了一个特定的数据库触发器:
CREATE TRIGGER tManager_bi
FOR Manager BEFORE INSERT AS
DECLARE VARIABLE v_company_name CHAR(30);
BEGIN
SELECT M.company
FROM Manager M
WHERE M.nr = NEW.reports_to
INTO :v_company_name;
IF (NOT(NEW.company = v_company_name))
THEN EXCEPTION eReportsNotOwnCompany;
END
Run Code Online (Sandbox Code Playgroud)
此触发器旨在防止经理向外部经理报告的输入,即不是来自同一公司的经理.相应的OCL约束是:
context Manager
inv: self.company = self.reports_to.company
Run Code Online (Sandbox Code Playgroud)
相关表格看起来像(简化):
CREATE TABLE Manager
(
nr INTEGER NOT NULL,
company VARCHAR(50) NOT NULL,
reports_to INTEGER,
PRIMARY KEY (nr),
FOREIGN KEY (reports_to) REFERENCES Manager (nr)
);
Run Code Online (Sandbox Code Playgroud)
教科书说当新插入的管理器没有向任何人报告时(即NEW.reports_to是NULL),这个触发器也能正常工作,实际上,在测试时,它确实可以正常工作.
但我不明白这一点.如果NEW.reports_to是NULL,那就意味着变量v_company_name将为空(未初始化??NULL),这意味着比较NEW.company …