Deyim ve Tasarım Deseni Arasındaki Fark?


39

Deyim ve tasarım kalıbı arasındaki fark nedir? Bu terminolojilerin bir yerlerde çakıştığı anlaşılıyor; tam olarak nerede bilmiyorum. Değiştirilebilirler mi? Neyi ne zaman kullanmalıyım?

İşte C ++ Deyimler listesi. Onlara tasarım desenleri diyebilir miyim?

Vikipedi tanımlar,

Düşük Düzeyli Bir Tasarım Deseni Olarak Programlama Deyimi

Bunun anlamı ne? Ne yok "düşük seviyeli" Burada demek?

Bu soru başka bir sorudan ilham alıyor: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent


Pratik terimlerle, ayrımın belirlenmesi zor olabilir (ve bir deyim ile bir tasarım deseni arasında bir miktar süreklilik olabilir). Ama muhtemelen doğal dilde "deyim" teriminden türemiştir: en.wikipedia.org/wiki/Idiom (kullanıma gerçekten uymuyor).
Merlyn Morgan-Graham

2
Bu muhtemelen SE Programcıları için daha uygundur.
Oliver Charlesworth

3
@ Nasaz: "Tasarım Deseni", bir dil kusuru etrafındaki nispeten "üst düzey" bir yapıdır. Bir "deyim", bir dil kusuru etrafındaki nispeten "düşük seviyeli" bir yapıdır; )
Tristan St.

Mizah için @ Nawaz- +1.
Jennifer S

Ayrıca bkz: Deyim vs. kalıp .
MS Dousti

Yanıtlar:


30

Bir deyim, bir dilin tuhaflıkları etrafında çalışmak için bir fikirdir. Akla gelen bazı örnekler, orijinal soruya bağladığınız C ++ deyimlerinin herhangi biridir. Bu dilde ortak bir sorunu, konserve bir şekilde çözerler.

Bir tasarım deseni benzerdir, çünkü ortak bir sorunu çözer. Ancak ideal tasarım deseni ortak dil özelliklerine dayanır ve bu nedenle de dille agnostiktir.

Deyimler ve tasarım kalıpları arasında, düşük seviyeden yüksek seviyelere kadar olduğu gibi, süreklilik var.

Ziyaretçi düzeni iyi bir örnektir; yalnızca tek bir dinamik gönderimi destekleyen yalnızca bir dil varsa, Ziyaretçi desenini o dilin bir deyimi olarak görebiliriz. Ancak doğrudan çoklu gönderimi desteklemeyen bütün dil orduları var. Böylece, Ziyaretçi kalıbı doğdu.

Gözlemci kalıbı da aklıma gelir - C # doğrudan onu destekler, bu nedenle kalıbın ortak çalışma biçimine ihtiyacı yoktur.

Diğer yöne giden örnek OO özellikleridir (kalıtım, polimorfizm, vb.). C onları doğrudan desteklemiyor. Daha fazla dil C gibi olsaydı, v-table'ları, tip güvenliğini vb. Uygulamak için tasarım kalıpları geliştirebiliriz. Birçok dil bu özelliği desteklediğinden, genelleştirilmiş olarak adlandırmak yerine C'deki herhangi bir ortak çözümü bir deyim olarak adlandırırdık. çözüm bir tasarım deseni.


2
Başka bir ilginç örnek: Akıcı sözdizimi API'leri. Dilinizde doğrudan DSL desteğinizin olmadığı gerçeğini telafi eder ve dil sınırlarını aşar. Henüz bir "Tasarım Deseni" statüsü kazandığından emin değilim ve sözdizimsel bir deyim gibi çalıyor ...
Merlyn Morgan-Graham

C # ile doğrudan Gözlemci deseni belirtmek gibi görünüyor destekler gerçeği yapar o kadar ki o geliştiricilerden ve dilin kendisi içine uygulanması uzağa kaymıştır olduğunu, desen için büyük bir ihtiyaç vardır.
jaco0646 23:18

@ jaco0646 Ben bu çizgiyi yeniden sıraladım, şimdi daha açık olabilir
Merlyn Morgan-Graham

37

Tasarım desenleri genellikle dile özgü değildir. Dil deyimleri, bir dilin (veya dil sınıfının) belirli özelliklerine bağlı olma veya söz konusu dil (ler) de belirli bir eksikliğin etrafında çalışma eğilimindedir.


Birkaç kelime ve birkaç yanlışlık ile bir ayrım çizmek için +1.
Merlyn Morgan-Graham

1
@Merlyn Morgan-Graham: Soru dahil neredeyse tüm cevaplar hakkında yorum yaptınız . Öyleyse neden hiçbir yanlışlık olmadan ayrıntılı bir cevap göndermiyorsunuz ? Düşüncelerini bilmek isterim.
Nawaz

1
@Nawaz: Yorum diğer cevaplarla ilgiliydi. Bu zaten neredeyse mükemmel. İdeal olarak bir cevabın içindeki örnekleri isterdim, fakat kimse onları doğru anlamıyor gibi görünüyor. Muhtemelen ikisini de yapamam, aksi halde mutlulukla mecbur olurdum :)
Merlyn Morgan-Graham

@ Naswaz: Tamam, yine de bir şans verdim :)
Merlyn Morgan-Graham

12

Vikipedi tanımına çok fazla para koymadım.

En azından bir deyim dile özgüdür, oysa bir tasarım deseni dille agnostik olmak için çaba gösterir veya çabalamalıdır. Daha da ileri giderek, deyimler genellikle okunabilirliği arttırmaya yönelik sözleşmelerdir veya bir şeyi yapmanın birden fazla yolu olduğunda, üstün alternatiflerdir (bazı teknik değerlerde). Tüm bunlar fikirlerin nasıl ifade edildiğiyle (netlik, zarafet, özlülük) ilgili, fakat fikirlerin kendileriyle değil.

Öte yandan, tasarım desenleri bir yinelenen fikrinin özü, bu bir fikir önsel kendisine kendisini ödünç herhangi dilde ifade edilebilir. Ziyaretçi, tek gönderim ve aşırı yüklemeye dayanan çift sevk uygulamasının bir uygulamasıdır ve bu, tek gönderim ve aşırı yüklemeye sahip herhangi bir dilde kullanılabilir. Desen hakkında bilgi sahibi olmak, daha anlamlı veya daha okunaklı kodlar yazmanıza yardımcı olmaz, ilgili sorunların çözülmesine yardımcı olur. Bu konuda aptalca bir şey yoktur, çünkü örneğin Ziyaretçinin örneğin C ++ dilinde kanonik bir formu yoktur.


1
+ 1; İyi cevap. Tho, son bit dışında her şeye inanmaya meyilliyim. Çoklu gönderme için doğrudan desteği olan diller vardır, bu nedenle Ziyaretçi deseninin orada bulunması gerekmez. Onların bakış açısına göre, "kalıp" daha çok bir deyim olabilir. Nihai üst düzey dilden, tüm kalıplar deyim haline gelebilir ...
Merlyn Morgan-Graham

@ Merlyn Birinci sınıf bir dil özelliğini yeniden uygulama konusunda aptalca olan nedir? Bunu kim yapar?
Luc Danton

Mesele bu. Bu dilin kullanıcıları "tasarım modelini" bir deyim olarak görürler, çünkü dilleri daha havalıdır :)
Merlyn Morgan-Graham

@Merlyn Bu 'deyim' kullanımlarıma uymuyor. Bir dilin deyimi, dilin rastgele, yetkin bir kullanıcısının tanımasını beklediğiniz bir şeydir; birinci sınıf bir özelliği yeniden uygulamak yabancı ve yerin dışında görünecektir. Tek bir gönderim için C ++ deyimi yoktur, biri sadece virtualbazı yerlerde kullanılır, oysa üyelerin tablo hilelerine elle yazılmış göstergeleri aptalca görünür.
Luc Danton

1
Deyim tanımını, “fakir bir adamın tasarım modelinden” farklı olarak tanımladığınız yeri seviyorum. Bu, modelimin nasıl davrandığını gösteriyor (cevabımı görün). Bu "bunun nasıl uygulanacağı" ve dahası " bu uygulamanın doğru yolu " dır . Örneğin, bir tasarım modeline evrimleşen "Büyük Üç" ü hayal edemiyorum. Ayrıca sözdizimsel bileşen de var, örneğin do_something() or die "...";(burada başka bir yorumdan çalınmış). Belirli dil özelliklerine dayanır, ancak bu özellikleri kullanmak için yaygın bir yoldur. Bu diller arası değildir ve muhtemelen olmayacaktır.
Merlyn Morgan-Graham

6

Deyim'in normal İngilizce dili tanımı. Kabul edilen anlamı kullanılan kelimelerde bulunmayan bir cümledir. Örnekler "Kedileri ve Köpekleri Yağdırmak" veya "Sığır Eti Nerede?"

Programlama dillerinde, genellikle kodun kendisinden hemen anlaşılmayan bir şey yapan, ancak diğer programcıların anlamı anında anlayabilmesi için yeterince kullanılan bir sözdizimsel kısayol anlamına gelir.

Perl belki de en deyimsel zengin dildir. Gibi yapıları ile:

while (<IN>) {
    print $_
}

Kimin anlamı deneyimli bir perl programcısı için açıktır, ancak başkalarına gizem


Sanırım "sığır eti nerede" bir deyimden çok bir memedir. Orada başka bir sürekliliği olabilir;) Örneğin, dilin uygulamasından daha basit bir deyim olabilir; çünkü bu deyim, örneğin bu deyimin kısmi veya başarısız bir uygulaması olabilir - C ++ 'ın "Büyük Üçü". Bu durumda, deyim "Büyük Üç" ün adı ve açıklamasıdır.
Merlyn Morgan-Graham

2
Perl en iyi deyimleri var -do_something() or die "arrrrgh!";
cxfx

2

Deyimler dile özgüdür. Örneğin while (*dest++=*src++);, bir C / C ++ deyimidir. Pascal veya Java'da uzaktan benzer bir şeyler yazmak tamamen imkansız. İngilizce deyim olarak "deyim" kelimesini kullanın. "Nasılsınız?" selamlama bir deyimdir. Almanca ve frensh gibi bazı diller aynı deyime sahiptir. Ancak diğer birçok dil, tebrik olarak böyle bir şeyi “sormaz”. Öte yandan (nesne yönelimli) bir kalıp genellikle kalıtım ve delegasyonu destekleyen herhangi bir dile adapte edilebilir. Bir deyim, bir kod satırı kadar basit olabilir. Bir tasarım deseni her zaman birkaç sınıf içerir.


+1. İyi nokta:A idiom might be as simple as one line of code. A design pattern always involves several classes.
Nawaz

2

Son zamanlarda oldukça derinleştiğim ve kodumun olduğu gibi amatörce görünmemesini istediğim için, bu yazıyı ortak C ++ deyimleri ararken buldum ... :-P

Perl ile epey zaman geçirdikten sonra, bu dilden, İngilizce veya İspanyolca gibi, doğal dillerde bulunanlara benzer (bazı deyimleri bilecek kadar iyi tanıdığım sadece iki tanesini) buldum.

Bir deyimin “küçük tasarım deseni” gibi olduğunu kabul etmiyorum. Yine de aynı fikirde değilim, daha az olmasına rağmen, bir deyim bir dilde eksiklikle başa çıkmanın bir yoludur.

Belki de Luc Danton'ın cevabı en yakına geliyor ama açıklamama izin ver. Bir deyimin, dili kullananların deyimsel olduğunu düşünüyorum . Genellikle, belki de açık olmasa da, bir işlemi gerçekleştiren veya daha önce görecek kadar akıcı olanlara mantıklı bir şekilde niyetini ifade eden ortak bir ifade veya ifade dizisi .

Perl'e geri dönersek, belki de en iyi bilinen deyim, verileri kompakt ve verimli bir şekilde yapan bir ifade olan " Schwartzian Transform ". Böyle bir işlemi gerçekleştirmenin en açık yolu bu değildir, ancak özlüdür ve daha önce görmüş olanlar anında ne yaptığını bilir.

Dikkate değer başka bir örnek, perl'in doğru / yanlış, zengin operatörler ve operatör önceliği kavramlarından faydalanan " Orcish Manevrası " dır .

Şahsen biraz sevdiğim biri biraz Orcish Manevrasıyla ilgili, ancak bunun için bir isim bilmiyorum:

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

Bu gerçekten şaşırtmaca değil, aksine aksi halde yapmak için birkaç satır alacak bir şeyin net ve kompakt bir ifadesidir. Anahtar karma içinde bulunuyorsa ve gerçek bir değere sahipse, onu bir dizi olarak ayırın ve bu diziye $ some_value değerini itin. Hash elemanı yoksa veya yanlış bir değere sahipse, boş bir dizi atayın, ardından diziyi kaldırın ve itin.

Perl 5.14'ten itibaren, bu deyimin bir kısmının modası geçmiş olduğunu belirtmekte fayda var - itme artık doğrudan dizi başvurusunda çalışabilir, @ @} gerek yok! Ayrıca, Perl 5.10'dan itibaren, || = yerine // = kullanılabilir; bu doğruluk için değil, tanımlılık için denetlenir.


Python: some_dict.setdefault(key, []).append(some_value).
Jonas Kölker

0

Bir Deyimin amacı, programlama dillerini kapsayan bir fikir veya kavram olmaktır; bu, bir şey yapmanın ve bir diğerinden yapışıp, kabarcıklı kabarcıklı gibi, çok fazla kavramsal yeniden yapılanma olmadan çalışan bir süreçtir. . Tasarım kalıpları bir deyimin spesifik uygulamaları veya bir dile sığdırma fikrinin boyutlarıdır, bu nedenle olay-dinleyici deyiminin javascript tasarım desenine sahipsiniz.


olay dinleyicisi, sinyal / yuvaları (desen?) veya Gözlemci desenini uygulayan bir dil özelliğidir. C ++ 'da deyimler adı verilen ve diğer dillerde (bildiğim kadarıyla) önemli olmayan ya da uygun olmayan şeyler de var - örneğin kopyala ve değiştir deyimi.
Merlyn Morgan-Graham

Design patterns are specific implementations of an idiom? Tam olarak nasıl? Soruma verilen bağlantıda C ++ deyimlerini gördünüz mü?
Nawaz

0

% 100 emin değilim, ancak deyimler belli bir alana ait terimlerdir. "Tasarım kalıpları" derken "Gözlemci Kalıp" "" Sorumluluk zinciri "" Ziyaretçi kalıp "" fabrika "deyin. Bunlar, programlamadaki genel sorunları çözmek için kullanılan yaygın kalıplardır. Kapsamlı bir liste için buraya bakın: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


0

Bunun anlamı ne? Burada "düşük seviye" ne anlama geliyor?

Başvurunuzu veya uygulamanızın bileşenlerini modellemenin yüksek düzeyde, soyut bir yol olmadığı, bunun yerine dil semantiğinin akıllıca veya ortak bir kullanımı olduğu anlamına gelir.

örneğin, false olarak değerlendirirse bir değişken ayarlamak (genellikle nil değişkenlerini koşullu olarak ayarlamak için kullanılır):

var ||= some_default_value

0

İşte bir olayı ele almak için bir deyim örneği (C #). Ekli herhangi bir işleyici yoksa bir etkinliği başlatmanıza izin verilmez, bu nedenle deyim her zaman önce bunu kontrol eder.

Bu nedenle, olayları işlemek için genel deyim şöyle olur:

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

Bu deyim (özel olmasa da) C # diline özgüdür.

Bununla birlikte, daha genel olarak, C # olay mekanizması, herhangi bir dilde uygulanabilecek gözlemci tasarım modelinin bir örneğidir .

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.