Deyimsel nedir?


19

Bir "deyim" belirli bir dilde tamsayı artışı gibi temel dil sözdizimi ile basitleştirilmemiş ortak bir işlem veya desen olarak anlıyorum:

i = i + 1;

C ++ 'da, bu deyim bir operatör tarafından basitleştirilir:

++i;

Ancak, birisi "deyimsel" terimini kullandığında, onu nasıl anlayacağından emin değilim. Bir kod parçasını "deyimsel" yapan nedir?


Bu , burada olduğu gibi english.stackexchange.com'a aittir .
S.Lott

@ perl.j: Anlayışlı. "Idiomatic" tanımının neden english.stackexchange.com adresine ait olmadığını gerçekten açıkladınız. Çok yararlı.
S.Lott

Yanıtlar:


24

Bazı kodları yazmanın deyimsel yolu, diğer dillerin sahip olmadığı dile özgü deyimler nedeniyle çok özel bir şekilde yazmanızdır.

Örneğin, C ++ 'da, RAII deyimini kullanmak, deyimsel olan C ++ kod yönetim kaynaklarını yazma yollarına yol açar.

Başka bir örnek, listeler oluşturmak için Python'daki liste kavrayışlarını kullanmak olabilir. Deyimsel çünkü idiyomatik Python'da liste kavrayışını kullanırdınız, ancak aynı şeyi başka bir dilde veya hatta Python'da bir jeneratör işlevi kullanarak da yapmış olabilirsiniz.

Genellikle, bu dile özgü deyimleri kullanmadan yeni bir dil deneyen biri deyimsel kod yazmaz.


Mükemmel açıklama. Yani C #, ilk kontrol ve sonra aramak TryAdd()için Generic Dictionarysınıf denilen bir uzantı yöntemi oluşturmak , bu deyimsel olurdu? C # uzantısı yöntemlerine özgü bir özellik kullanıyorum. !Contains()Add()
void.pointer

1
Tam olarak en deneyimli C ++ kodlayıcı mümkün olduğunca üye eklemek yerine, sınıfları genişletmek için ücretsiz işlevler yazmak söyleyeceğinden emin değilim. C # uzatma yöntemleriyle aynı değildir, ancak oldukça yakındır ve ücretsiz işlevlere izin veren herhangi bir dil için kullanılabilir. Ne eminim C # "set / getters" yazma deyimleri IS deyim kullanarak.
Klaim

Ancak bu C ++ değildir, bu nedenle "C ++ yolunu" kullanmak "deyimsel" olmayabilir. Burada bir uzatma yöntemi kullanmak makul ve çok C # gibidir. Her halükarda bir örnektir, ancak genişletme yöntemleri C # için çok deyimseldir.
void.pointer

Evet bu yüzden "Emin değilim" dedim, deyimsel geliyor ama emin olamadığım diğer dillerin diğer temel özelliklerine çok yakın (çünkü bir C # dev değilim). Başka bir örnek var: döngü tüm işlevsel dillerde özyineleme ile yapılır. Diğer dillerde de yapabilirsiniz, ancak açıkça işlevsel diller için deyimseldir. Yardımcı olup olmadığından emin değilim.
Klaim

1
Elbette python, deyimsel koda, yani pythonic'e atıfta bulunmanın deyimsel bir yoluna sahip olarak bir adım ileri gider. * 8 ')
Mark Booth

12

Normal Tanım

Ana dili İngilizce olan biri için doğal olan ifadeleri kullanma, bu ifadeleri kullanma veya gösterme

Programlama Tanımı

[Dil Ekle] programcısı için doğal olan ifadeleri kullanma, içeren veya gösterme


1
Bu terim için "google" tanımlarının yararlı olduğunu düşünürsem, burada yayınlamazdım. Örneklerle daha iyi bir açıklama (öğretici benzeri) istedim.
void.pointer

3
@Robert - Sanırım neden anlamadığını anlamıyorum.
ChaosPandion

2
Önce cevabını okudum, tam olarak belli değildi. Şimdi cevabım olarak işaretlenen yanıtı okuduktan sonra, "deyimsel" in ne anlama geldiği çok açık oldu ve şimdi anlıyorum. Şimdi cevabınızı okuduğum için mantıklı. Ancak, beni örneklerden ve farklı senaryolardan geçirmediniz, bu yüzden cevabınızın bu kadar yararlı olmadığını düşünüyorum. Teknik olarak doğru ancak anlamama yardımcı olduğu kadar yardımcı olmayan bir "webster" yanıtı verdiniz. Gerçi yardımın için minnettarım.
void.pointer

8

Programlama bağlamında deyim genellikle “bir dilde bir şeyi ifade etmenin en doğal yolu” olarak tanımlanabilir.

Deyim kelimesinin özellikle Ruby'de çokça ortaya çıktığını görüyorum. Ruby'de büyük meta programlama yetenekleri vardır ve deyimsel Ruby kodu yazmak için genellikle bunları kullanmalısınız.

Bir kod parçasının deyimsel olması, temiz veya özlü olduğu anlamına gelmediğini unutmayın. Çoğu zaman taviz vermelisiniz.

Yani, temel olarak, deyim en yaygın olarak, genellikle "argo" (deyimler) dahil olmak üzere, bir dilde bir şeyler yazmanın en yaygın yolunu ifade eder. Bir kod parçası deyimsel değilse, mükemmel şekilde okunabilir, özlü, temiz ve doğru olabilir, ancak kullanılan dilde garip gelebilir / görünebilir. Böyle bir kod parçasının deyimsel olarak yeniden yazılmasının aslında iyi bir şey olup olmayacağı ve duruma göre değerlendirilmesi gerekip gerekmediği tercih edilir.

Örneğin deyimsel İngilizce bölgeye bağlı olabilir. Kelimeyi kullanmak bummuhtemelen idiomatic İngiltere İngilizcesi için gereklidir, ancak buttABD İngilizcesi için daha uygundur. (İngiliz İngilizcesi ne yazık ki çok fazla bilmiyorum: /)


Teşekkürler.
Ashaman Kingpin

3

Deyimsel bir şey için tasarlayabileceğim en iyi örnek Ruby'den geliyor.

Çok sayıda dilde şunları yapabilirsiniz:

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

Ya da çok benzer bir şey. Birçok dilde de bir foreach(x in SetOfXes)yapı vardır. Ancak Ruby için deyimsel yineleme aşağıdakileri içerir:

collection.each do |current|
  current.do_stuff
end

ve hatta

10.times do |x|
  puts x
end

Bunları deyimsel olarak görüyorum çünkü daha az yaygın olan ve etki alanının felsefesinin özünde bir şeyi temsil eden bir yolu temsil ediyorlar. Ruby, benzersiz olmasa da her yerde bulunmayan nesnelerle etkileşim hakkında bir felsefeye sahiptir.

Anlamsal bir notta, deyimsel kelimeyi her duyduğumda, beynim düşünceyi otomatik olarak "deyimsel ..." olarak tamamlar - Sadece belirli bir konu ile ilgili olarak refleks olarak ayrıştırırım.


Nasıl collection.each do |current|farklı gelen foreach(current in collection)? Her ikisi de currentöğesinin her öğesine ayarlanmış döngü yapılarıdır collection.
MSalters

2

Deyimler genellikle bir dilde yaygın ve nispeten karmaşık bir durumu ifade etmenin en iyi yoludur. Artış bir deyim ya da böyle bir şey değildir. Postfix yerine önek artışını kullanarak, bir C ++ deyimi olduğunu iddia edebilirsiniz.

Deyimler, uzman kullanıcılar tarafından belirlenen bir dili kullanmanın en iyi yoludur. Gerçek bir C ++ deyimi işlev nesneleri olacaktır. Başka bir deyim RAII olacaktır. Dilde, yıkıcıda kaynakları serbest bırakmanız gerektiğini söyleyen hiçbir şey yok. Ama bunu yapmak deyimsel. Başka bir örnek, şablonlardır - yapabileceğiniz her şey için şablon kullanmak deyimdir, ancak kalıtımın aşırı kullanılmasını durduracak hiçbir şey yoktur.


Vikipedi artış olarak örnek olarak kullanılmıştır, bu yüzden sorumda bundan bahsettim. Deyimlerin neden karmaşık olması gerekir? Bu, diğer cevaplara dayanan tanımın bir parçası gibi görünmüyor.
void.pointer

4
@Robert Dailey: Artış nasıl bir deyim olabilir? Dilin bir parçası . Deyimler bir dilin kullanıcıları tarafından yapılır, zamanla değişir. Artış bir deyim değil, dilin temel bir işlevselliğidir. Bu mantığı alarak, diğer herhangi bir temel dil işlevinin bir deyim olduğunu söyleyebilirim ve bu nedenle her program deyimseldir, öyle değildir.
DeadMG

2

Senin tanımın bana doğru gelmiyor. Bir deyim, diğer dillerde mümkün olan veya olmayan bir şeyi yazmanın bir yoludur, ancak bu dilde yaygındır. Genellikle, alternatiften daha kısadır, ancak bu gerçekten bir gereklilik değildir.

Deyimsel olmayan şey hakkında konuşarak bunu açıklamak daha kolay olabilir. C ++ 'da yazmak oldukça deyimseldir:

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

Yazmak daha da deyimsel:

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

Bu kod tam olarak aynı şeyi yapar - C ++ için yeni olan bazı kişiler, p'nin işlevin döndürdüğüne eşit olup olmadığını görmek için test olarak okuyabilir, ancak yaptığı şey bu değildir.

Başka bir dilden gelen, çok deyimsel olmayan birisinin yazabilecekleriyle karşılaştırın:

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

Ayrıca bu şeylerin deyimsel olmayan bir şekilde çaldığını göreceksiniz:

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

Çünkü deyimsel yaklaşım

return (x>0);

Deyimsel olmayan yollar yanlış değildir, ancak deyimleri bilenler için yazmaları genellikle daha uzun sürer ve her zaman okunmaları daha uzun sürer. Size "kurt ağlayan çocuk" diyorum ve hikayeyi biliyorsanız, yanlış alarmların insanların sizi görmezden gelmesine neden olduğunu açıklamaktan daha hızlıdır. Sorun, elbette, hikayeyi bilmiyorsanız ve kurtların bahsettiğimiz şeyle ne ilgisi olduğunu bilmiyorsanız. Benzer şekilde, daha önce hiç görmediyseniz return x<y;ve gerçekten ne yaptığını bilmiyorsanız bir sorun olabilir .


1
Deyimsel yaklaşım kesinlikle işaretçi ilan etmek olurdu içinde NULL değilse o erişilebilir asla böylece, eğer durum. if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
DeadMG

mm, muhtemelen. Ya da bin satır önce çünkü bu blok boyunca kullanılır. Veya bir başlık değişkeni olduğu için başlık dosyasında. Sadece okuyucunun bir Foo * olduğunu bilmesi için ilan ettim, gerçek hayatta orada ilan edilmeyeceğinden haklısın.
Kate Gregory

1

Bir şeyi ifade etmenin birden çok yolu olduğunda, en yaygın veya yaygın olarak kabul edilen yöntemdir. Örneğin, goto ifadelerini kullanarak tam eşdeğer yerine C'de yapılandırılmış bir ifade kullanmak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.