17

在我的阅读狂潮中,我偶然发现了一种叫做Intentional Programming的东西。我有点理解它,但我并不完全理解。如果有人可以更详细地解释它,请做。它是否在任何实际应用中使用?

4

7 回答 7

11

你让我开始了这个......
看起来 C. Simonyi 想从高级语言进入下一个抽象级别。减少客户对开发人员的依赖,以便在代码中进行每一次更改(对于非开发人员来说是神秘的)。所以他发明了这个名为 IP 的新产品,它有一个 WYSIWYG 类型的 GUI 编辑器来创建一个特定领域的模型。(即,IP 有一个 GUI 来为您的应用程序创建构建块。LISP 允许您创建元/构建块,但不是以领域专家可以轻松做到的方式。)
就像 UML 中的模型一样,承诺是您可以自动生成相应的源代码在“按下按钮”。因此,领域专家可以在未来调整模型并按下“烘焙”按钮以交付应用程序的下一个版本。它似乎利用了 DSL,但还有一个额外的好处,即多个用户创建的 DSL 可以通过内置的 IP 机制相互通信……这意味着财务模型和销售模型可以根据需要交互和重用块。与 DSL 一样,您可以从传达开发人员意图而不是安抚实现语言限制的代码中受益。

这个想法是为真正知道需要什么的 BA 和领域专家提供更大的控制权......

更新:现实世界的使用看起来“还没有”..尽管西蒙尼相信“绝对是长期的”。
短篇小说:MS 压扁 IP 转而支持 .Net 框架,Simonyi 离开 MS 并成立了自己的公司“ Intentional Software ”。合同规定他可以使用 IP 创意,但他必须从头开始重写他的工作原型..(这应该会让他慢下来)。我认为它仍在进行中..并用 C# 编写(启动)

资料来源:

直到昨天才想到..我对此一无所知。调查记者签字。回到日常工作:)

于 2008-10-15T03:58:21.277 回答
5

这与我在酒吧爬行后凌晨 2 点回家并打开笔记本电脑“只是为了快速查看我的电子邮件,亲爱的” 时发生的情况相反。

然后,第二天,当我睁开一只眼睛,在中午时分找到去洗手间的路时,我开始刷牙并意识到,牙膏从我嘴里滴出来,昨晚我做了 4 次 SVN 提交,关闭3 个错误,并弄清楚了如何解决我们的分布式锁定协议上的饥饿问题。而且我不知道它到底是如何工作的。

或者也许这就是workmad3所说的。

于 2008-10-15T04:34:35.523 回答
4

它似乎是一种编程方法,允许程序员扩展语言中的实际内容以更接近他们的原始意图,而不是强迫程序员意图进入语言的受限语法。

它明确提到 LISP 作为一种支持这一点的语言,所以我建议你阅读这个伟大的语言 :) LISP 宏正是文章中描述的内容,允许你无限扩展语言以涵盖几乎任何你会关心的东西表达。(大型 LISP 系统的一个相当常见的结果是,您最终会得到一种非常适合编写特定应用程序的领域特定语言,即编写文字处理器最终会得到一种文字处理器特定语言)。

对于您的最后一部分,是的,某些项目中使用了 LISP(以及因此的意向编程)。Paul Graham 是 LISP 的大力支持者,其他例子包括原始的 Crash Bandicoot(为此在 LISP 中创建了一个游戏对象创建系统,包括一个 LISP PlayStation 编译器)

于 2008-10-14T14:37:15.340 回答
4

我对有意编程的理解略有不同(作为一个更笼统的术语,不仅仅是查尔斯西蒙尼正在做的事情)。它与流畅的接口密切相关,并且可以在现代面向对象语言中以不同程度的难度实现。

其中一些概念来自领域驱动设计(事实上,“流畅界面”一词已经被“蓝皮书”的作者埃里克·埃文斯(Eric Evans)推广——领域驱动设计:解决软件核心的复杂性)。

目的是使非程序员(即业务人员)可以阅读业务层代码。这可以通过明确说明操作意图的类和方法名称来实现。在我看来,明确和有意会产生高度可读和可维护的代码。

考虑下面两个实现相同目的的示例 - 为客户创建 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();

通过稍微改变您的编程风格,您可以更清楚地传达您的意图,并减少必须查看其他地方的代码以了解正在发生的事情的数量。

于 2010-11-17T22:29:09.347 回答
3

在我看来,这似乎是软件工程的又一时尚。我们已经看到了成千上万个:元编程、生成式编程、可视化编程等等。在很短的时间内,它们变得非常流行,人们到处使用它,然后他们总是回到旧的软件创建方式。

为什么?Frederick Brooks 早在 20 多年前就已经回答了这个问题:没有银弹可以杀死狼人……

于 2008-10-15T09:48:49.573 回答
2

意图编程正在编码您的意图或目标。因此,它是面向目标的编程或规划。加强管理。

于 2015-11-29T05:34:18.640 回答
-1

这是您打算编程的地方,您不会只是偶然地这样做。;)

于 2008-10-14T15:06:38.043 回答