Perbedaan antara Idiom dan Pola Desain?

39

Apa perbedaan antara idiom dan pola-desain? Tampaknya terminologi ini tumpang tindih di suatu tempat; di mana tepatnya, saya tidak tahu. Apakah bisa dipertukarkan? Kapan saya harus menggunakan apa?

Berikut adalah daftar Idiom C ++. Bisakah saya menyebutnya pola desain?

Wikipedia mendefinisikan,

Pemrograman Idiom sebagai Pola Desain tingkat rendah

Apa artinya? Apa yang dimaksud dengan "level rendah" di sini?

Pertanyaan ini terinspirasi dari pertanyaan lain: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent

Nawaz
sumber
Dalam istilah praktis, perbedaan mungkin sulit untuk ditentukan (dan mungkin ada beberapa kontinum antara idiom dan pola desain). Tapi itu mungkin berasal dari istilah "idiom" dalam bahasa alami: en.wikipedia.org/wiki/Idiom (yang tidak terlalu cocok dengan penggunaannya).
Merlyn Morgan-Graham
2
Ini mungkin lebih cocok untuk Programmer SE.
Oliver Charlesworth
3
@Nawaz: "Pola Desain" adalah konstruksi "tingkat tinggi" yang relatif di seputar kerusakan bahasa. "Idiom" adalah konstruksi "tingkat rendah" yang relatif di seputar cacat bahasa; )
Tristan St.
@ Nawaz- +1 untuk humor.
Jennifer S
Lihat juga Idiom vs. pattern .
MS Dousti

Jawaban:

30

Idiom adalah ide untuk mengatasi quirks bahasa. Beberapa contoh yang muncul di benak Anda adalah salah satu idiom C ++ yang Anda tautkan dalam pertanyaan awal. Mereka memecahkan masalah umum dalam bahasa itu dengan cara kalengan.

Pola desain serupa, karena memecahkan masalah umum. Tetapi pola desain yang ideal didasarkan pada fitur-fitur bahasa umum, dan dengan demikian adalah bahasa agnostik.

Ada kontinum antara idiom dan pola desain, seperti halnya dari bahasa tingkat rendah ke bahasa tingkat tinggi.

Pola Pengunjung adalah contoh yang baik; jika hanya ada satu bahasa yang hanya mendukung pengiriman dinamis tunggal, maka kami dapat menganggap pola Pengunjung idiom bahasa itu. Tetapi ada segerombolan bahasa yang tidak secara langsung mendukung pengiriman ganda. Oleh karena itu, pola Pengunjung lahir.

Pola Observer juga muncul di benak Anda - C # langsung mendukungnya, sehingga tidak perlu bentuk pola penyelesaian yang umum.

Contoh ke arah lain adalah fitur OO (warisan, polimorfisme, dll). C tidak secara langsung mendukung mereka. Jika lebih banyak bahasa seperti C, maka kita dapat mengembangkan pola desain untuk mengimplementasikan v-tables, type-safety, dll. Karena banyak bahasa mendukung fitur tersebut, kami akan menyebut solusi umum apa pun dalam C idiom, daripada memanggil generalisasi solusi pola desain.

Merlyn Morgan-Graham
sumber
2
Contoh menarik lainnya: API sintaks Fasih. Mereka menebus fakta bahwa Anda tidak memiliki dukungan DSL langsung dalam bahasa Anda, dan itu melintasi batas-batas bahasa. Saya tidak yakin itu telah lulus ke status "Pola Desain", dan itu berdering seperti idiom sintaksis ...
Merlyn Morgan-Graham
Fakta bahwa C # langsung mendukung pola Observer tampaknya menunjukkan bahwa ia tidak memiliki kebutuhan besar untuk pola, begitu banyak sehingga bergeser pelaksanaan jauh dari pengembang dan ke dalam bahasa itu sendiri.
jaco0646
@ jaco0646 Saya menulis ulang garis itu, mungkin lebih jelas sekarang
Merlyn Morgan-Graham
37

Pola desain biasanya tidak spesifik bahasa. Idiom bahasa cenderung bergantung pada fitur tertentu dari suatu bahasa (atau kelas bahasa) atau mengatasi kekurangan tertentu dalam bahasa tersebut.

μBio
sumber
+1 untuk menggambar perbedaan dengan beberapa kata dan beberapa ketidakakuratan.
Merlyn Morgan-Graham
1
@Merlyn Morgan-Graham: Anda mengomentari hampir semua jawaban, termasuk pertanyaannya. Jadi mengapa Anda tidak mengirim jawaban detail tanpa ketidaktepatan sama sekali? Saya ingin tahu pendapat Anda.
Nawaz
1
@Nawaz: Komentar itu tentang jawaban lain. Yang ini sudah hampir sempurna. Idealnya saya suka sampel dalam jawaban, tetapi sepertinya tidak ada yang benar. Saya mungkin juga tidak bisa, kalau tidak saya dengan senang hati akan setuju :)
Merlyn Morgan-Graham
@Nawaz: Oke, saya tetap mencobanya :)
Merlyn Morgan-Graham
12

Saya tidak akan menaruh terlalu banyak mata uang dalam definisi Wikipedia.

Paling tidak sebuah idiom adalah bahasa khusus sedangkan pola desain berusaha, atau harus berusaha, untuk menjadi agnostik bahasa. Lebih jauh, idiom biasanya konvensi untuk meningkatkan keterbacaan, atau merupakan alternatif yang unggul (pada beberapa kelebihan teknis) ketika ada lebih dari satu cara untuk melakukan sesuatu. Semua hal itu terkait dengan bagaimana ide-ide diekspresikan (kejelasan, verbositas, keringkasan), tetapi tidak dengan ide itu sendiri.

Di sisi lain, pola desain adalah esensi dari ide yang berulang, sebuah ide yang apriori dapat diekspresikan dalam bahasa apa pun yang cocok dengannya. Pengunjung adalah implementasi dari pengiriman ganda yang mengandalkan pengiriman tunggal dan kelebihan muatan dan ini dapat digunakan dalam bahasa apa pun yang memiliki pengiriman tunggal dan kelebihan muatan. Mengetahui tentang pola tidak membantu menulis kode yang lebih ekspresif atau lebih mudah dibaca, tetapi membantu memecahkan masalah terkait. Tidak ada yang idiomatis tentang itu karena misalnya tidak ada bentuk kanonik Pengunjung di misalnya C ++.

Luc Danton
sumber
1
+1; Jawaban yang bagus. Saya cenderung percaya semuanya di sini kecuali bagian terakhir. Ada bahasa yang memiliki dukungan langsung untuk pengiriman banyak, sehingga pola Pengunjung tidak perlu ada di sana. Dari sudut pandang mereka, "pola" itu mungkin lebih merupakan ungkapan. Dari bahasa tingkat tinggi, semua pola mungkin menjadi idiom ...
Merlyn Morgan-Graham
@Merlyn Apa yang idiomatis tentang mengimplementasikan kembali fitur bahasa kelas satu? Siapa yang melakukan itu?
Luc Danton
Itulah intinya. Pengguna bahasa itu akan menganggap "pola desain" sebagai ungkapan, karena bahasa mereka lebih keren :)
Merlyn Morgan-Graham
@Merlyn Itu tidak cocok dengan saya menggunakan 'idiom'. Sebuah idiom suatu bahasa adalah sesuatu yang Anda harapkan akan dikenali oleh pengguna acak dan mahir dari bahasa itu; menerapkan fitur kelas satu akan terlihat asing dan tidak pada tempatnya. Tidak ada idiom C ++ untuk pengiriman tunggal, satu hanya menggunakan virtualdi beberapa tempat sedangkan pointer tulisan tangan untuk tipuan anggota tabel akan terlihat konyol.
Luc Danton
1
Saya suka ke mana Anda pergi dengan definisi idiom yang berbeda dari "pola desain orang miskin", yang merupakan semacam bagaimana model saya memperlakukannya (lihat jawaban saya). Itu kurang "di sini adalah bagaimana menerapkan ini" dan lebih "di sini adalah cara yang tepat untuk menerapkan ini" Sebagai contoh, saya tidak bisa membayangkan "Tiga Besar" berkembang menjadi pola desain. Dan ada komponen sintaksis juga, misalnya do_something() or die "...";(dicuri dari komentar lain di sini). Ini didasarkan pada fitur bahasa tertentu, tetapi itu adalah cara umum untuk menggunakan fitur-fitur itu. Ini bukan lintas bahasa, dan mungkin tidak.
Merlyn Morgan-Graham
6

Definisi bahasa Inggris yang normal dari Idiom. Merupakan ungkapan yang maknanya diterima tidak terkandung dalam kata-kata yang digunakan. Contohnya adalah "Kucing dan Anjing Raining" atau "Where's the Beef?"

Dalam bahasa pemrograman biasanya merujuk pada pintasan sintaksis yang melakukan sesuatu yang tidak langsung terlihat jelas dari kode itu sendiri tetapi yang cukup sering digunakan sehingga pemrogram lain mengenali artinya secara instan.

Perl mungkin bahasa yang paling idiom. Dengan konstruksi seperti:

while (<IN>) {
    print $_
}

Makna yang jelas bagi seorang programmer perl berpengalaman tetapi misteri bagi orang lain

James Anderson
sumber
Saya pikir "di mana daging sapi" lebih meme daripada idiom. Mungkin ada kontinum lain di sana;) Mungkin ada lebih banyak idiom daripada hanya implementasi dalam bahasa, karena hal-hal mungkin sebagian atau gagal implementasi dari idiom - C ++ "Tiga Besar", misalnya. Dalam hal ini, idiom adalah nama dan deskripsi "Tiga Besar".
Merlyn Morgan-Graham
2
Perl memiliki idiom terbaik -do_something() or die "arrrrgh!";
cxfx
2

Idiom adalah bahasa tertentu. Misalnya while (*dest++=*src++);adalah idiom C / C ++. Benar-benar mustahil untuk menulis sesuatu yang serupa di Pascal atau Java. Gunakan kata "idiom" saat Anda menggunakannya dalam bahasa Inggris. "Apa kabar?" sebagai salam adalah ungkapan. Beberapa bahasa seperti Jerman dan frensh memiliki idiom yang sama. Tetapi banyak bahasa lain tidak akan "meminta" sesuatu seperti ini sebagai salam. Pola (berorientasi objek) di sisi lain biasanya dapat diadaptasi ke dalam bahasa apa pun yang mendukung pewarisan dan pendelegasian. Sebuah idiom mungkin sesederhana satu baris kode. Pola desain selalu melibatkan beberapa kelas.

Angel O'Sphere
sumber
+1. Poin bagus:A idiom might be as simple as one line of code. A design pattern always involves several classes.
Nawaz
2

Saya menemukan posting ini sedang mencari idiom C ++ umum, karena saya telah mendapatkan cukup dalam ke dalamnya baru-baru ini dan ingin kode saya tidak terlihat seperti amatir seperti yang saya rasakan ... :-P

Setelah menghabiskan sedikit waktu dengan Perl, saya menemukan idiom dalam bahasa itu sangat mirip dengan yang ditemukan dalam bahasa alami, seperti bahasa Inggris atau Spanyol (hanya dua yang saya kenal cukup baik untuk mengetahui beberapa idiom).

Saya tidak setuju bahwa idiom seperti "pola desain kecil". Saya masih tidak setuju, meskipun kurang begitu, bahwa idiom adalah cara untuk mengatasi kekurangan dalam bahasa.

Mungkin jawaban Luc Danton paling dekat, tetapi izinkan saya menjelaskannya. Saya pikir idiom adalah, baik, idiomatis dari mereka yang menggunakan bahasa tersebut. Biasanya, ekspresi umum atau urutan ekspresi yang, meskipun mungkin tidak jelas, melakukan operasi atau mengekspresikan niat dengan cara yang masuk akal bagi mereka yang cukup fasih untuk melihatnya sebelumnya.

Kembali ke Perl, mungkin idiom paling terkenal adalah " Schwartzian Transform ", sebuah ekspresi yang melakukan pengurutan data dengan cara yang ringkas dan efisien. Ini bukan cara yang paling jelas untuk melakukan operasi seperti itu, tetapi ini singkat dan mereka yang telah melihatnya sebelumnya tahu langsung apa yang dilakukannya.

Contoh penting lainnya adalah " The Orcish Maneuver ", yang mengambil keuntungan dari gagasan perl tentang benar / salah, operator kaya, dan prioritas operator.

Salah satu yang secara pribadi saya suka agak terkait dengan Manuver Orc, tapi saya tidak tahu nama untuk itu:

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

Ini memang bukan kebingungan, melainkan ekspresi yang jelas dan kompak dari sesuatu yang seharusnya mengambil beberapa baris untuk dilakukan. Jika kunci ada di hash dan memiliki nilai sebenarnya, de-referensi sebagai array dan dorong $ some_value ke array itu. Jika elemen hash tidak ada atau memiliki nilai salah, tetapkan itu array kosong, lalu ganti array itu dan lakukan push.

Perlu juga dicatat bahwa pada Perl 5.14, bagian dari idiom ini sudah usang - push sekarang dapat beroperasi langsung pada referensi array, tidak diperlukan @ {}! Juga, pada Perl 5.10, seseorang dapat menggunakan // = bukannya || = yang memeriksa bukan untuk kebenaran tetapi untuk definisi-ness.

Hercynium
sumber
di python: some_dict.setdefault(key, []).append(some_value).
Jonas Kölker
0

Inti dari Idiom adalah menjadi ide atau konsep yang mencakup bahasa pemrograman, ini adalah cara melakukan sesuatu dan proses yang bekerja tanpa banyak restrukturisasi konseptual ketika Anda mengambilnya dari satu dan menempelkannya di yang lain, seperti semacam gelembung rendah . Pola desain adalah implementasi spesifik dari suatu idiom, atau perluasan ide yang cocok dengan bahasa, oleh karena itu Anda memiliki pola desain javascript dari idiom peristiwa-pendengar dll.


sumber
event listener adalah fitur bahasa yang mengimplementasikan sinyal / slot (pola?) atau pola Observer. Ada juga hal-hal dalam C ++ yang disebut idiom yang tidak penting atau tidak cocok dengan bahasa lain (sejauh yang saya tahu) - misalnya idiom copy-and-swap.
Merlyn Morgan-Graham
Design patterns are specific implementations of an idiom? Bagaimana sebenarnya? Apakah Anda melihat idiom C ++, di tautan di pertanyaan saya?
Nawaz
0

Saya tidak 100% yakin, tetapi idiom hanyalah istilah yang berkaitan dengan bidang tertentu. Ketika Anda mengatakan "pola desain", Anda berpikir tentang "Pola Pengamat" "Rantai tanggung jawab" "Pola pengunjung" "pabrik". Ini adalah pola umum yang digunakan untuk memecahkan masalah umum dalam pemrograman. Lihat di sini untuk daftar lengkap: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


sumber
0

Apa artinya? Apa yang dimaksud dengan "level rendah" di sini?

Saya mengartikannya bahwa ini bukan cara abstrak tingkat tinggi untuk memodelkan aplikasi Anda atau komponen aplikasi Anda, tetapi sebaliknya menggunakan bahasa semantik yang pintar atau umum.

misalnya, menetapkan variabel jika bernilai false (biasanya digunakan untuk menetapkan variabel nil secara kondisional):

var ||= some_default_value
Ed S.
sumber
0

Berikut adalah contoh idiom (dalam C #) untuk menangani suatu peristiwa. Anda tidak boleh memecat suatu acara jika tidak ada penangan yang terpasang, jadi idiominya adalah untuk selalu memeriksa ini terlebih dahulu.

Oleh karena itu idiom umum untuk menangani acara menjadi:

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

Ungkapan ini khusus (meskipun tidak eksklusif) untuk bahasa C #.

Namun lebih umum, mekanisme acara C # adalah contoh dari pola desain pengamat yang dapat diimplementasikan dalam bahasa apa pun.

cxfx
sumber