在我的阅读狂欢中,我偶然发现了一个名为Intentional Programming的东西。 我有点理解,但我并不完全。如果有人能够更详细地解释它,请做。它是否在任何实际应用中使用?
答案 0 :(得分:9)
你让我开始这个... ...
看起来像C. Simonyi想要从高级语言进入下一级抽象。减少客户对开发人员的依赖,以便在代码中进行每项更改(对于未处于开发阶段的人来说,这是一种神秘感)。
因此,他发明了这种名为IP的新产品,它具有 WYSIWYG类型的GUI编辑器来创建特定于域的模型。 (即IP有一个GUI来为您的应用程序创建构建块.LISP允许您创建元/构建块,但不是域专家可以轻松地创建它。)
与UML中的模型一样,承诺是您可以在“按下按钮”自动生成相应的源代码。因此,领域专家可以在将来调整模型,然后按下“烘焙”按钮以提供下一版本的应用程序。
它似乎利用了DSL,但增加的好处是多个用户创建的DSL可以通过内置的IP机制相互通信 ...这意味着财务模型和销售模型可以交互和重用根据需要阻止。与DSL一样,您可以获得传达开发人员意图的代码,而不是满足实现语言约束。
这个想法是为了更好地控制实际知道需要的BA和领域专家......
<强>更新强>: 真实世界的使用看起来像“还没有”..虽然西蒙尼认为'absolutely in the long term' 短篇小说:MS为了支持.Net框架而破坏了IP,Simonyi离开了MS并组建了他自己的公司“Intentional Software”..他的合同是他可以使用知识产权的想法,但他会必须从头开始重写他的工作原型..(这应该让他慢下来)。它仍然是正在进行的工作我认为..并且正在用C#编写(启动)
来源:
想到昨天......我对这件事情一无所知。调查记者签字。回到白天工作:)
答案 1 :(得分:6)
与我在凌晨2点回家后酒吧爬行并启动笔记本电脑时发生的情况相反“只是为了快速查看我的电子邮件,很明白。”
然后,第二天,当我睁开一只眼睛,找到我去中午裂缝的 的方式 时,我开始刷牙,意识到,牙膏从我嘴里运球,昨晚我做了4次SVN提交,关闭了3个bug,并想出如何解决我们分布式锁定协议的饥饿问题。而且我 不知道 它是如何运作的。
或许这就是workmad3所说的。
答案 2 :(得分:4)
它似乎是一种编程方法,允许程序员扩展语言中的实际内容,以更加严格地遵循其原始意图,而不是强迫程序员意图使用该语言的受约束语法。
它明确提到LISP是一种支持这种语言的语言,所以我建议你阅读这篇伟大的语言:) LISP宏正是本文所描述的内容,允许你无限期地扩展语言以涵盖几乎任何东西你会关心表达。 (大型LISP系统的一个相当普遍的结果是,你最终得到了一种非常适合编写特定应用程序的领域特定语言,即编写文字处理器最终会使用文字处理器特定语言)。
对于你的最后一部分,是的LISP(以及故意编程)在某些项目中使用。 Paul Graham是LISP的伟大支持者,其他例子包括最初的Crash Bandicoot(一个游戏对象创建系统是在LISP中为此创建的,包括一个LISP PlayStation编译器)
答案 3 :(得分:3)
对我而言似乎又是一种软件工程。我们已经看过数千个:元编程,生成编程,可视化编程等等。在很短的时间内,它们变得非常时尚,人们在任何地方都使用它,然后它们总是回到创建软件的旧方法。
为什么呢? 20多年前,弗雷德里克·布鲁克斯已经回答了这个问题:有No Single Silver Bullet杀死狼人......
答案 4 :(得分:3)
我对故意编程的理解略有不同(作为一个更通用的术语,不仅仅是Charles Simonyi正在做的事情)。它与流畅的界面密切相关,可以在现代面向对象的语言中以各种难度实现。
其中一些概念来自领域驱动设计(事实上,术语“流畅的界面”已经被“蓝皮书”的作者埃里克埃文斯推广 - 领域驱动设计:解决中心的复杂性软件)。
目的是使业务层代码可由非程序员(即业务人员)读取。这可以通过显式声明操作的 intent 的类和方法名称来实现。在我看来,明确和有意识地产生高度可读和可维护的代码。
考虑以下两个实现相同目标的示例 - 为客户创建10%折扣的订单并向其添加几个产品。
//C#, Normal version
Customer customer = CustomerService.Get(23);
Order order = new Order();
//What is 0.1? Need to look at Discount property to understand
order.Discount = 0.1;
order.Customer = customer;
//What's 34?
Product product = ProductService.Get(34);
//Do we really care about Order stores OrderLines?
order.OrderLines.Add(new OrderLine(product, 1));
Product product2 = ProductService.Get(54);
order.OrderLines.Add(new OrderLine(product2, 2)); //What's 2?
Order.Submit();
//C#, Fluent version
//byId is named parameter, states that this method looks up customer by Id
ICustomerForOrderCreation customer =
CustomerService.GetCustomerForOrderCreation(byId: 23);
//Explicit method to create a discount order and explicit percentage
Order order = customer.CreateDiscountOrder(10.Percent())
.WithProduct(ProductService.Get(byId: 34))
.WithProduct(ProductService.Get(byId: 54))
.WithQuantity(2); //Explicit quantity
Order.Submit();
通过稍微改变您的编程风格,您可以更清楚地传达您的意图,并减少在其他地方查看代码以了解正在发生的事情的数量。
答案 5 :(得分:2)
故意编程是对您的意图或目标进行编码。因此,它是面向目标的编程或计划。加强管理。
答案 6 :(得分:0)
这是您打算编程的地方,您不仅仅是意外地进行编程。 ;)