Apa itu idiomatik?

19

Saya memahami "idiom" sebagai operasi atau pola umum yang dalam bahasa tertentu tidak disederhanakan oleh sintaksis bahasa inti, seperti kenaikan bilangan bulat:

i = i + 1;

Dalam C ++, idiom ini disederhanakan oleh operator:

++i;

Namun, ketika seseorang menggunakan istilah "idiomatik", saya tidak yakin bagaimana memahaminya. Apa yang membuat sepotong kode "idiomatik"?

void.pointer
sumber
Ini milik sebanyak di english.stackexchange.com seperti di sini.
S.Lott
@ perl.j: Wawasan. Anda telah benar-benar menjelaskan mengapa definisi "Idiomatik" tidak termasuk dalam english.stackexchange.com. Sangat membantu.
S.Lott

Jawaban:

24

Cara idiomatis menulis beberapa kode adalah ketika Anda menulisnya dengan cara yang sangat spesifik karena idiom spesifik bahasa yang tidak dimiliki bahasa lain.

Misalnya, dalam C ++, mengeksploitasi idiom RAII mengarah ke cara penulisan sumber pengelolaan kode C ++ yang idiomatis.

Contoh lain akan menggunakan daftar pemahaman dalam Python untuk menghasilkan daftar. Itu idiomatik karena Anda akan menggunakan pemahaman daftar dalam Python idiomatik tetapi Anda bisa melakukan hal yang sama menggunakan fungsi generator dalam bahasa lain atau bahkan dalam Python.

Seringkali, seseorang mencoba bahasa baru tanpa menggunakan idiom khusus untuk bahasa ini tidak akan menulis kode idiomatik.

Klaim
sumber
Deskripsi yang sangat baik. Jadi di C #, jika saya membuat metode ekstensi yang dipanggil TryAdd()pada Dictionarykelas Generic untuk pertama kali memeriksa !Contains()dan kemudian memanggil Add(), ini akan menjadi idiomatik? Saya menggunakan fitur khusus untuk metode ekstensi # C.
void.pointer
1
Saya tidak yakin persis seperti yang dialami oleh pembuat kode C ++ yang paling berpengalaman memberitahu Anda untuk menulis fungsi gratis untuk memperluas kelas alih-alih menambahkan anggota, jika memungkinkan. Ini tidak sama dengan metode ekstensi C # tetapi cukup dekat dan tersedia untuk bahasa apa pun yang memungkinkan fungsi gratis. Yang saya yakin adalah bahwa menulis "set / getters" di C # dengan menggunakan properti IS idiomatic.
Klaim
Tapi ini bukan C ++, jadi menggunakan "C ++ way" mungkin tidak cukup "idiomatis". Menggunakan metode ekstensi di sini masuk akal dan sangat mirip C #. Bagaimanapun itu adalah contoh tetapi metode ekstensi sangat idiomatis untuk C #.
void.pointer
Ya itu sebabnya saya berkata "Saya tidak yakin", rasanya idiomatis tetapi sangat dekat dengan fitur dasar lain dari bahasa lain sehingga saya tidak yakin (karena saya bukan seorang C # dev). Saya punya contoh lain: perulangan dilakukan dengan rekursi di semua bahasa fungsional. Anda dapat melakukannya dalam bahasa lain, tetapi jelas itu idiomatik untuk bahasa fungsional. Tidak yakin apakah itu membantu.
Klaim
1
Tentu saja python melangkah lebih jauh dengan memiliki cara idiomatik merujuk ke kode idiomatik, yaitu pythonic. * 8 ')
Mark Booth
12

Definisi Normal

Menggunakan, mengandung, atau menunjukkan ekspresi yang alami bagi penutur asli

Definisi Pemrograman

Menggunakan, mengandung, atau menunjukkan ekspresi yang alami bagi seorang programmer [Insert Language]

Kekacauan Kekacauan
sumber
1
Jika saya pikir definisi "google" untuk istilah ini bermanfaat, saya tidak akan memposting di sini. Saya ingin deskripsi yang lebih baik (seperti tutorial) dengan contoh.
void.pointer
3
@ Robert - saya kira saya tidak mengerti mengapa Anda tidak mengerti.
ChaosPandion
2
Saya membaca jawaban Anda terlebih dahulu, itu tidak begitu jelas. Setelah membaca jawaban yang sekarang ditandai sebagai jawaban saya, menjadi sangat jelas apa arti "idiomatik" dan sekarang saya memahaminya. Sekarang saya membaca jawaban Anda itu masuk akal. Namun, Anda tidak menuntun saya melalui contoh dan skenario yang berbeda, itulah sebabnya saya pikir jawaban Anda tidak membantu. Anda memberi respons "webster" yang secara teknis benar tetapi tidak membantu sejauh membantu saya memahami. Saya menghargai bantuan Anda.
void.pointer
7

Idiomatik dalam konteks pemrograman biasanya dapat didefinisikan sebagai "cara paling alami untuk mengekspresikan sesuatu dalam suatu bahasa"

Saya melihat kata idiomatis muncul sangat banyak di Ruby. Di Ruby, ada banyak kemampuan pemrograman meta, dan untuk menulis kode Ruby idiomatis, Anda biasanya harus menggunakannya.

Perhatikan bahwa hanya karena sepotong kode idiomatis, tidak berarti kode itu bersih atau bahkan ringkas. Sering kali Anda harus berkompromi.

Jadi pada dasarnya, idiomatik paling umum merujuk pada cara paling umum untuk menulis sesuatu dalam bahasa, sering kali termasuk "gaul" (idiom). Jika sepotong kode tidak idiomatis, mungkin dapat dibaca dengan sempurna, ringkas, bersih, dan benar, tetapi mungkin terasa / terlihat canggung dalam bahasa yang digunakan. Ini adalah preferensi selera, apakah menulis ulang kode seperti itu secara idiomatis akan menjadi hal yang baik dan harus dinilai berdasarkan kasus per kasus

Bahasa Inggris idiomatik misalnya dapat bergantung pada wilayah. Menggunakan kata bummungkin diperlukan untuk bahasa Inggris UK idiomatik, sementara buttitu lebih tepat untuk bahasa Inggris AS. (Saya tidak tahu banyak bahasa Inggris Inggris sedih: /)

Earlz
sumber
Terima kasih (terunggah), saya pikir definisi Anda tepat sasaran untuk saya!
Ashaman Kingpin
3

Contoh terbaik yang bisa saya rancang, dari atas kepala saya, untuk sesuatu yang idiomatis, berasal dari Ruby.

Dalam banyak bahasa, Anda dapat beralih dengan:

for( start; end; increment){
    code;
}

Atau sesuatu yang sangat mirip. Banyak bahasa juga memiliki foreach(x in SetOfXes)konstruk. Tapi iterasi yang idiomatis untuk Ruby mencakup hal-hal seperti:

collection.each do |current|
  current.do_stuff
end

dan bahkan

10.times do |x|
  puts x
end

Saya melihat ini sebagai idiomatik karena mereka mewakili cara melakukan sesuatu yang kurang umum, dan yang mewakili sesuatu pada inti dari filosofi domainnya. Ruby memiliki filosofi tentang interaksi dengan objek yang, meskipun tidak unik, tidak ada di mana-mana.

Pada catatan semantik, setiap kali saya mendengar kata idiomatis, otak saya secara otomatis melengkapi pemikiran itu sebagai "idiomatik untuk ..." - Saya hanya menguraikannya secara refleks terkait dengan subjek tertentu.

asfallows
sumber
Bagaimana collection.each do |current|bedanya foreach(current in collection)? Keduanya adalah konstruksi lingkaran yang disetel currentke setiap elemen collection.
MSalters
2

Idiom biasanya merupakan cara terbaik untuk mengekspresikan situasi umum yang relatif kompleks dalam suatu bahasa. Bertambah bukanlah idiom atau semacamnya. Menggunakan kenaikan awalan alih-alih postfix, Anda bisa berargumen sebagai idiom C ++.

Idiom adalah cara terbaik untuk menggunakan bahasa, sebagaimana ditentukan oleh pengguna ahli. Sebuah idiom C ++ sesungguhnya adalah objek fungsi. Idiom lain adalah RAII. Tidak ada dalam bahasa yang memberitahu Anda bahwa Anda harus membebaskan sumber daya di destructor. Tapi itu idiomatis untuk melakukannya. Contoh lain adalah templat - adalah idiomatis untuk menggunakan templat untuk, yah, semua yang Anda bisa, tetapi tidak ada yang menghentikan Anda menggunakan warisan secara berlebihan.

DeadMG
sumber
Wikipedia menggunakan incrementing sebagai contoh, jadi itu sebabnya saya menyebutkannya dalam pertanyaan saya. Mengapa idiom harus kompleks? Ini sepertinya bukan bagian dari definisi berdasarkan pada jawaban yang lain.
void.pointer
4
@Robert Dailey: Bagaimana meningkatkan mungkin menjadi idiom? Itu bagian dari bahasa . Idiom dibuat oleh pengguna bahasa, mereka berubah seiring waktu. Bertambah bukanlah idiom, ini adalah fungsi dasar dari bahasa. Mengambil logika itu, saya bisa mengatakan bahwa fungsi bahasa dasar lainnya adalah idiom, dan karena itu setiap program idiom, yang bukan.
DeadMG
2

Definisi Anda tidak menganggap saya benar. Sebuah idiom adalah cara menulis sesuatu yang mungkin atau mungkin tidak dapat dilakukan dalam bahasa lain, tetapi itu biasa dalam bahasa ini. Biasanya, ini lebih pendek daripada alternatifnya, tapi itu bukan persyaratan.

Mungkin lebih mudah untuk menjelaskannya dengan berbicara tentang apa yang non-idiomatis. Dalam C ++, cukup idiomatis untuk menulis:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p)
{
 // whatever
}

Menulis lebih idiomatis:

Foo* p; 
if(p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
{
 // whatever
}

Kode ini melakukan hal yang persis sama - beberapa orang yang baru mengenal C ++ mungkin membacanya sebagai pengujian untuk melihat apakah p sama dengan apa fungsi kembali, tetapi bukan itu yang dilakukannya.

Bandingkan dengan apa yang ditulis seseorang, sangat non-idiomatis, yang berasal dari bahasa lain:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p !=NULL)
{
 // whatever
}

Anda juga akan melihat barang-barang ini mengetuk sebagai non-idiomatik:

if (x>0)
  return true;
else
 return false;

Karena pendekatan idiomatik adalah

return (x>0);

Cara-cara non-idiomatis tidak salah, tetapi mereka biasanya membutuhkan waktu lebih lama untuk mengetik dan mereka selalu membutuhkan waktu lebih lama untuk membaca, bagi mereka yang tahu idiom. Jika saya menyebut Anda "bocah yang menangis serigala" dan Anda tahu ceritanya, itu lebih cepat daripada jika saya menjelaskan tentang bagaimana alarm palsu menyebabkan orang mengabaikan Anda. Masalahnya, tentu saja, adalah jika Anda tidak tahu ceritanya dan tidak tahu apa yang harus dilakukan serigala dengan apa yang kita bicarakan. Demikian pula, itu bisa menjadi masalah jika Anda belum pernah melihat return x<y;sebelumnya dan benar-benar tidak tahu apa fungsinya.

Kate Gregory
sumber
1
Pendekatan idiomatis pasti akan mendeklarasikan pointer dalam kondisi if, sehingga tidak akan pernah dapat diakses jika bukan NULL. if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
DeadMG
mm, mungkin. Atau seribu baris sebelumnya karena digunakan di seluruh blok ini. Atau dalam file header karena itu adalah variabel anggota. Saya hanya menyatakannya sehingga pembaca akan tahu itu Foo *, Anda benar bahwa dalam kehidupan nyata tidak akan dinyatakan di sana.
Kate Gregory
1

Ketika ada banyak cara untuk mengekspresikan sesuatu, cara yang paling umum atau diterima secara umum. Misalnya, menggunakan pernyataan terstruktur dalam C bukannya setara persis menggunakan pernyataan goto.

hotpaw2
sumber