成语与模式

14 language-agnostic design-patterns idioms

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

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

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

Jon*_*eid 12

习语是特定于语言的.

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


Car*_*icz 7

当人们从高(分析师,顾问,学者,方法论大师等)观测计划的发展看开发商在各种场合和环境中一遍又一遍地做同样的事情再次,然后从观察获得的情报可以被提炼成一个模式.模式是一种使用手头的软件工具"做事"的方式,它代表了一种共同的抽象.

一些例子:

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

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

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

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

由于图案的东西有点理论和正式,通常有一个正式的模式(呵 - !字超载让我们说的"模板")中的描述.这样的模板可能包括:

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

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

*dst++ = *src++
Run Code Online (Sandbox Code Playgroud)

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

while <INFILE> { print chomp; }
Run Code Online (Sandbox Code Playgroud)

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


Lau*_*ves 6

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

我一般认为"模式"和"习语"之间的主要区别是大小.习语很小,比如"使用包含集合的变量类型的接口",而模式往往更大.我觉得成语的渺小并不意味着他们更经常特定语言(我刚给的例子是一个Java成语),但我不认为那是他们的标志性特征.