Language agnostic 习语与模式

Language agnostic 习语与模式,language-agnostic,design-patterns,idioms,Language Agnostic,Design Patterns,Idioms,在编程的上下文中,它们有什么不同 我交替使用这些术语,通常遵循我听过的最流行的叫法,或者最近在当前对话中的叫法,例如“拷贝交换习惯用法”和“单件模式” 我所能想到的最大区别是,几乎按字面意思复制的代码通常被称为模式,而不按字面意思复制的代码通常被称为惯用语,但这并不总是正确的。这似乎只不过是文体或流行语上的差异。这是否符合你对术语使用方式的看法?有语义上的区别吗?因为如果你把5个程序员放在一个房间里,他们甚至可能在什么是模式的问题上意见不一致,这就没有真正的“正确答案” 有一种观点我听过一次,并

在编程的上下文中,它们有什么不同

我交替使用这些术语,通常遵循我听过的最流行的叫法,或者最近在当前对话中的叫法,例如“拷贝交换习惯用法”和“单件模式”


我所能想到的最大区别是,几乎按字面意思复制的代码通常被称为模式,而不按字面意思复制的代码通常被称为惯用语,但这并不总是正确的。这似乎只不过是文体或流行语上的差异。这是否符合你对术语使用方式的看法?有语义上的区别吗?

因为如果你把5个程序员放在一个房间里,他们甚至可能在什么是模式的问题上意见不一致,这就没有真正的“正确答案”

有一种观点我听过一次,并且非常喜欢(尽管我一生都记不起它的出处),那就是习语是应该用你的语言表达的东西,或者说有些语言中有习语。相反,它们是我们使用的技巧,因为我们的语言没有为它们提供直接的原语。例如,Java中没有单例,但我们可以通过隐藏构造函数并提供getInstance方法来模拟它


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

习惯用法是特定于语言的


模式是独立于语言的设计原则,通常用“模式语言”(一个统一的模板)编写,描述激励环境、优缺点、相关模式等。与模式是语言不可知的想法相反,两者都表明,使用模式的需要表明您的语言缺少一个特性。(访客模式通常被认为是这方面最突出的例子。)


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

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

一些例子:

  • 面向对象编程从开发人员那里拿走了全局变量。对于那些仍然需要全局变量,但需要一种方法使其使用看起来干净且面向对象的情况,可以使用单例模式

  • 有时,根据某些情况,您需要创建一个具有多种可能的不同类型之一的新对象。丑陋的方式可能涉及不断扩展的
    case
    语句。通过“工厂”或“工厂方法”模式,以一种面向对象的干净方式实现这一点的公认“优雅”方式

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

模式是一种高级的做事方式,并且大多数是独立于语言的。无论您是使用
新建对象
还是
对象创建对象。新建
对模式都无关紧要

因为模式有点理论化和形式化,所以通常会有一个形式化的模式(呵呵,单词重载!让我们说“模板”)来描述它们。此类模板可包括:

  • 名字
  • 取得的效果
  • 理由
  • 限制和限制
  • 怎么做
习语是较低级的东西,通常在语言层面上起作用。例如:

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

while <INFILE> { print chomp; }
while{print chomp;}

是一种Perl习惯用法,用于循环输入文件并打印出文件中的所有行。在那个语句中有很多隐式变量的用法。同样,除了在Perl中,您不会在任何地方看到这种特殊语法;但是一个老的Perl黑客会快速查看该语句,并立即识别您正在做什么。

是的,没有“真正正确”的答案,我将该问题标记为主观问题。(对我来说)最有用、最合理的答案将被接受这是有道理的。我本来希望看到5条“成为社区维基”的评论:)这是一个很好的问题,但我不知道为什么还没有人回答。这一定是一个缓慢的星期六。四人帮记录的设计模式中,大约有一半是带有一级函数的动态类型语言中的语言构造或习惯用法。当诺维格分析GoF时,他在Dylan和Lisp中发现“23种模式中有16种是不可见的或更简单的”。这超过了一半。:-)@斯莱贝特曼:我同意。我认为清晰的分离(和更少的C++焦点)对于GoF书来说是非常好的,但它确实是关于这个主题的第一本书。他们今天可能会写得不一样。你确定你不是在描述这本书,因为我链接到它了吗?例如,“奇怪地重复出现的模板模式”在(非常流行的)名称中有模式,但是,AFAIK完全是C++特有的。这只是一个异常值吗?CRTP可能是一个不成功的错误