簡體   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