繁体   English   中英

成语与模式

[英]Idiom vs. pattern

在编程的背景下, 习语如何与模式不同?

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

我能想出的最好的区别是,几乎字面意思被复制的代码通常被称为模式,而代码意味着不那么字面意思的代码通常称为习语 ,但这种情况甚至不总是如此。 这似乎不仅仅是一种风格或流行语的差异。 这符合您对术语使用方式的看法吗? 有语义差异吗?

习语是特定于语言的。

模式是与语言无关的设计原则,通常用“模式语言”(统一模板)编写,描述诸如激励情境,利弊,相关模式等内容。

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

一些例子:

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

  • 有时您需要根据某些情况创建具有各种可能不同类型之一的新对象。 丑陋的方式可能涉及不断扩大的case陈述。 以OO清洁方式实现这一目标的“优雅”方式是通过“工厂”或“工厂方法”模式。

有时,许多开发人员以某种方式做事情,但这是一个不好的方式应该被推荐。 这可以在反模式中形式化。

模式是一种高级的处理方式,大多数是与语言无关的。 无论是使用new Object还是Object.new创建对象,对于模式都是无关紧要的。

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

  • 名称
  • 效果达到了
  • 合理
  • 限制和限制
  • 怎么做

习语是低级的,通常在语言水平上运作。 例:

*dst++ = *src++

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

while <INFILE> { print chomp; }

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM