成语与模式

时间:2010-01-09 20:24:29

标签: language-agnostic design-patterns idioms

在编程环境中,idiomspatterns的区别如何?

我可以互换地使用这些术语,并且通常遵循我听过的最流行的方式,或者最近在当前对话中调用它的方式,例如: “复制交换习语”和“单身模式”。

我能想出的最好的区别是,几乎字面意思是复制的代码通常被称为 pattern 而代码意味着不那么字面意思的代码通常被称为 idiom < / em>,但这种情况甚至都不是真的。这似乎不仅仅是一种风格或流行语的差异。这符合您对术语使用方式的看法吗?是否存在语义差异?

4 个答案:

答案 0 :(得分:11)

习语是特定于语言的。

模式是与语言无关的设计原则,通常用“模式语言”(统一模板)编写,描述诸如激励情境,优点和范围之类的事物。缺点,相关模式等。

答案 1 :(得分:7)

当人们观察On High的程序开发时(分析师,顾问,学者,方法大师等)看到开发人员在各种情况和环境中一遍又一遍地做同样的事情,那么从这个观察中获得的智慧可以被提炼成一种模式。模式是一种使用手头的软件工具“做事”的方式,代表了一种共同的抽象。

一些例子:

  • OO编程使全局变量远离开发人员。对于他们真正需要全局变量但需要一种方法使其使用看起来干净且面向对象的情况,有 Singleton模式

  • 有时您需要创建一个具有各种可能不同类型之一的新对象,具体取决于某些情况。丑陋的方式可能涉及不断扩大的case陈述。以OO-clean方式实现这一目标的公认方式是“工厂”或“工厂方法”模式。

有时候,很多开发者都会以某种方式做事,但这是一种不好的方式应该被推荐。这可以在反模式中形式化。

模式是一种高级的做事方式,而且大部分是与语言无关的。无论您使用new Object还是Object.new创建对象,都无关紧要。

由于模式有点理论和形式,因此通常会有一个正式的模式(heh - word overload!让我们说“模板”)来描述它们。这样的模板可能包括:

  • 名称
  • 实现的效果
  • 原理
  • 限制和限制
  • 怎么做

成语是低级别的,通常在语言级别运行。例如:

*dst++ = *src++
C中的

将数据元素从src复制到dst,同时将指针递增到两者;它通常是在循环中完成的。显然,你不会在Java或Object Pascal中看到这个习语。

while <INFILE> { print chomp; }

(粗略地从内存中引用)一个Perl习惯用法,用于循环输入文件并打印出文件中的所有行。在该语句中有很多隐式变量使用。同样,除了在Perl中,你不会在任何地方看到这种特殊的语法;但是一位老Perl黑客会快速查看声明,并立即认出你在做什么。

答案 2 :(得分:6)

与模式与语言无关的观点相反,Paul GrahamPeter Norvig都表明使用模式的必要性表明您的语言缺少某个功能。 (访客模式经常被挑选出来作为最明显的例子。)

我一般认为“模式”和“成语”之间的主要区别在于大小。习语很小,比如“使用包含集合的变量类型的接口”,而模式往往更大。我认为习语的小巧确实意味着它们更多地是语言特定的(我刚才给出的例子是Java习语),但我不认为这是他们的定义特征。

答案 3 :(得分:3)

因为如果你把5个程序员放在一个房间里,他们甚至可能不会就什么是模式达成一致,对此没有真正的“正确答案”。

我曾经听过一次并且非常喜欢的一种观点(虽然不能让我的生活回想起来源)是,成语是应该用你的语言或者有某种语言的东西。相反,它们是我们使用的技巧,因为我们的语言不能为它们提供直接的原语。例如,Java中没有单例,但我们可以通过隐藏构造函数并提供getInstance方法来模仿它。

另一方面,模式与语言无关(尽管它们通常指的是特定的范例)。您可能有一些基础设施来支持它们(例如,Spring for MVC),但它们不是也不会成为语言结构,但您可能需要使用该范例中的任何语言。