web-dev-qa-db-ja.com

イディオムとデザインパターンの違い?

イディオムとデザインパターンの違いは何ですか?これらの用語はどこかで重複しているようです。正確にはわかりません。それらは交換可能ですか?何を使うべきですか?

ここ はC++イディオムのリストです。それらをデザインパターンと呼べますか?

Wikipedia 定義、

低レベルデザインパターンとしてのイディオムのプログラミング

どういう意味ですか?ここで「低レベル」はどういう意味ですか?

この質問は別の質問から発想を得ています: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent

40
Nawaz

イディオムは、言語の癖を回避するためのアイデアです。頭に浮かぶいくつかの例は、元の質問でリンクしたC++イディオムのいずれかです。彼らはその言語の一般的な問題を決まった方法で解決します。

設計パターンは、よくある問題を解決するという点で似ています。しかし、理想的な設計パターンは共通言語機能に基づいているため、言語に依存しません。

ただし、低レベル言語から高レベル言語に至るまで、イディオムとデザインパターンの間には連続性があります。

Visitorパターンが良い例です。単一の動的ディスパッチのみをサポートする言語が1つしかない場合、Visitorパターンをその言語のイディオムと見なす可能性があります。しかし、複数のディスパッチを直接サポートしていない言語の大群があります。したがって、ビジターパターンが生まれました。

オブザーバーパターンも思い浮かびます。C#が直接サポートしているため、パターンの一般的な回避策の形式は必要ありません。

別の方向に進む例はOO features(inheritance、polymorphism、etc.)です。Cはそれらを直接サポートしていません。より多くの言語がCのようなものであった場合、vを実装するデザインパターンを開発するかもしれません。 -tables、type-safetyなど。多くの言語がこれらの機能をサポートしているため、一般化されたソリューションをデザインパターンと呼ぶのではなく、Cの一般的なソリューションをイディオムと呼びます。

31

通常、デザインパターンは言語固有ではありません。言語イディオムは、言語(または言語のクラス)の特定の機能に依存するか、その言語の特定の欠陥を回避する傾向があります。

37
µBio

私はウィキペディアの定義にあまり多くの通貨を入れません。

少なくともイディオムは言語固有のものですが、デザインパターンは言語にとらわれないように努力している、または努力すべきです。さらに進むと、イディオムは通常、読みやすさを向上させるための慣例であり、何かを行う方法が複数ある場合は、(技術的なメリットに関して)優れた代替手段です。これらすべては、アイデアがどのように関連しているか表現された(明快さ、冗長性、簡潔さ)に関連していますが、アイデア自体には関連していません。

一方、デザインパターンは繰り返し発生するアイデアの本質であり、アプリオリはそれに適した任意の言語で表現できるというアイデアです。 Visitorは、シングルディスパッチとオーバーロードに依存するダブルディスパッチの実装であり、シングルディスパッチとオーバーロードを持つ任意の言語で使用できます。パターンについて知ることは、より表現力豊かで読みやすいコードを書くのに役立ちませんが、関連する問題の解決に役立ちます。たとえば、訪問者の標準的な形式がないため、それについて慣用的なものはありません。 C++。

12
Luc Danton

イディオムの通常の英語の定義。使用されている単語に受け入れられている意味が含まれていないフレーズです。たとえば、「猫と犬の雨」や「牛肉はどこ?」などです。

プログラミング言語では、通常、コード自体からすぐには明らかではないものの、他のプログラマがすぐに意味を認識できるほど頻繁に使用される構文上のショートカットを指します。

Perlはおそらく最もイディオムが豊富な言語です。次のような構成で:

while (<IN>) {
    print $_
}

その意味は、経験豊富なPerlプログラマーにとっては明白ですが、他の誰にとっても謎です

6
James Anderson

最近この記事をかなり深く掘り下げてきたので、この投稿が一般的なC++イディオムを検索しているのを発見しました。

Perlでかなりの時間を費やしてきたため、その言語のイディオムは、英語やスペイン語などの自然言語のイディオムと非常に似ていることがわかりました(私が知っているイディオムは2つだけです)。

イディオムは「小さなデザインパターン」のようなものだとは思わない。私はまだ、そうではありませんが、イディオムが言語の欠陥を回避する方法であることに同意しません。

おそらく Luc Dantonの答え が最も近くなりますが、説明させてください。イディオムは、まあ、イディオマティックは言語を使う人のことだと思います。通常、一般的な式または式のシーケンスは、おそらく明白ではないかもしれませんが、fluent以前にそれを見たことがある人にとって意味のある方法で操作を実行したり、意図を表現したりします。

Perlに戻ると、おそらく最もよく知られているイディオムは " Schwartzian Transform "です。これは、コンパクトで効率的な方法でデータのソートを実行する式です。これはそのような操作を実行するための最も明白な方法ではありませんが、それは簡潔であり、以前にそれを見た人は、それが何をしているのか即座にわかります。

もう1つの注目すべき例は、 " The Orcish Maneuver "です。これは、true/false、豊富な演算子、および演算子の優先順位に関するPerlの概念を利用しています。

私が個人的にかなり気に入っているものは、オークの操縦にいくらか関連していますが、名前はわかりません。

Push @{ $some_hash{$key} ||= [] }, $some_value;

これは確かに難読化ではなく、そうでなければ何行もかかる何かの明確でコンパクトな表現です。キーがハッシュに存在し、真の値がある場合は、そのキーを配列として逆参照し、$ some_valueをその配列にプッシュします。ハッシュ要素が存在しないか、値がfalseの場合は、空の配列を割り当て、その配列を逆参照してプッシュを実行します。

また、Perl 5.14以降、このイディオムの一部が廃止されていることにも注意する必要があります-Pushが配列参照を直接操作できるようになり、@ {}は不要になりました。また、Perl 5.10以降では、|| =の代わりに// =を使用できます。これは、真実ではなく、定義済みかどうかをチェックします。

2
Hercynium

イディオムは言語固有です。例えば。 while (*dest++=*src++);はC/C++イディオムです。 PascalやJavaでリモートで類似した何かを書くことは完全に不可能です。英語で使用する「イディオム」という単語を使用します。 "ごきげんよう?"挨拶は慣用句です。ドイツ語とフレンシュのようないくつかの言語は同じイディオムを持っています。しかし、他の多くの言語は、このようなものを挨拶として「尋ねる」ことはしません。一方、(オブジェクト指向の)パターンは通常、継承と委任をサポートする任意の言語に適応できます。イディオムは、1行のコードと同じくらい簡単かもしれません。デザインパターンには常にいくつかのクラスが含まれます。

2
Angel O'Sphere

イディオムのポイントは、プログラミング言語にまたがるアイデアまたはコンセプトであることです。これは、バブルソートのように、概念を再構築することなく機能するプロセスおよびプロセスであり、概念を再構築することなく機能します。 。デザインパターンは、イディオムの特定の実装、または言語に適合するアイデアの拡張です。したがって、イベントリスナーイディオムなどのJavaScriptデザインパターンがあります。

0
shortstick

100%確信はありませんが、イディオムは特定のフィールドに関連する用語です。 「デザインパターン」と言うと、「オブザーバーパターン」「責任の連鎖」「ビジターパターン」「ファクトリー」を思い浮かべます。これらは、プログラミングの一般的な問題を解決するために使用される一般的なパターンです。包括的なリストについては、こちらをご覧ください: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns

0
EddieBytes

どういう意味ですか?ここで「低レベル」とはどういう意味ですか?

これは、アプリケーションまたはアプリケーションのコンポーネントをモデル化するための高レベルで抽象的な方法ではなく、言語セマンティクスの巧妙または一般的な使用法であることを意味します。

たとえば、falseと評価された場合に変数を設定します(通常、nil変数を条件付きで設定するために使用されます)。

var ||= some_default_value
0
Ed S.

これは、イベントを処理するためのイディオム(C#の例)の例です。ハンドラーがアタッチされていない場合、イベントを発生させることはできません。そのため、慣例として、常に最初にこれをチェックすることになります。

したがって、イベントを処理するための一般的なイディオムは次のようになります。

EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

このイディオムは(限定的ではありませんが)C#言語に固有です。

ただし、より一般的には、C#イベンティングメカニズムは、任意の言語で実装できる observer 設計パターンの例です。

0
cxfx