Różnica między idiomem a wzorcem projektowym?

39

Jaka jest różnica między idiomem a wzorcem projektowym? Wydaje się, że te terminologie gdzieś się pokrywają; gdzie dokładnie nie wiem. Czy są wymienne? Kiedy powinienem użyć czego?

Oto lista idiomów C ++. Czy mogę nazwać je wzorami projektowymi?

Wikipedia określa,

Programowanie idiomu jako wzorca projektowego niskiego poziomu

Co to znaczy? Co oznacza tutaj „niski poziom” ?

To pytanie jest inspirowane innym pytaniem: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-dependent

Nawaz
źródło
W praktyce rozróżnienie może być trudne do ustalenia (i może istnieć pewne kontinuum między idiomem a wzorcem projektowym). Ale prawdopodobnie pochodzi od terminu „idiom” w języku naturalnym: en.wikipedia.org/wiki/Idiom (który tak naprawdę nie pasuje do użycia).
Merlyn Morgan-Graham
2
Jest to prawdopodobnie lepiej dostosowane do Programmers SE.
Oliver Charlesworth,
3
@Nawaz: „wzorzec projektowy” jest konstrukcją stosunkowo „wysokiego poziomu” wokół defektu językowego. „Idiom” jest relatywnie „niskim poziomem” konstrukcją wokół defektu językowego; )
Tristan St.,
@ Nawaz- +1 za humor.
Jennifer S
Zobacz także Idiom vs. wzór .
MS Dousti

Odpowiedzi:

30

Idiom to pomysł na obejście dziwactwa języka. Niektóre przykłady, które przychodzą na myśl, to dowolny z idiomów C ++, które dowiązałeś w pierwotnym pytaniu. Rozwiązują typowy problem w tym języku w sposób puszkowany.

Wzorzec projektowy jest podobny, ponieważ rozwiązuje typowy problem. Ale idealny wzorzec projektowy opiera się na wspólnych cechach językowych, a zatem jest niezależny od języka.

Istnieje jednak kontinuum między idiomami a wzorami projektowymi, podobnie jak w przypadku języków niskiego poziomu do języków wysokiego poziomu.

Wzorzec gościa jest dobrym przykładem; jeśli byłby tylko jeden język, który obsługiwał tylko pojedyncze dynamiczne wysyłanie, wówczas możemy uznać wzorzec Odwiedzającego za idiom tego języka. Ale są całe hordy języków, które nie obsługują bezpośredniej wysyłki wielokrotnej. W ten sposób narodził się wzór Visitor.

Przychodzi mi też na myśl wzorzec Observer - C # bezpośrednio go obsługuje, więc nie potrzebuje on zwykłej obejściowej formy wzorca.

Przykładem idącym w innym kierunku są cechy OO (dziedziczenie, polimorfizm itp.). C nie obsługuje ich bezpośrednio. Gdyby więcej języków było podobnych do C, moglibyśmy opracować wzorce projektowe do implementacji tabel V, bezpieczeństwa typu itp. Ponieważ wiele języków obsługuje te funkcje, nazwalibyśmy każde popularne rozwiązanie w języku C idiomem, zamiast nazwać uogólnionym rozwiązanie wzoru.

Merlyn Morgan-Graham
źródło
2
Kolejny interesujący przykład: płynne API składni. Składają się na to, że nie masz bezpośredniej obsługi DSL w swoim języku, i to przekracza granice językowe. Nie jestem pewien, czy osiągnął on status „Wzorca projektowego” i brzmi jak syntaktyczny idiom ...
Merlyn Morgan-Graham,
Fakt, że C # bezpośrednio obsługuje wzorzec Obserwator wydaje się wskazywać, że nie mają ogromną potrzebę wzorca, tak bardzo, że przesunął realizacja od deweloperów i do samego języka.
jaco0646
@ jaco0646 Zmieniłem brzmienie tej linii, może być teraz jaśniejsze
Merlyn Morgan-Graham
37

Wzory projektowe zwykle nie są specyficzne dla języka. Idiomy językowe zwykle zależą od konkretnej cechy języka (lub klasy języków) lub omijają konkretny brak tego języka (ów).

µBio
źródło
+1 za narysowanie rozróżnienia z kilkoma słowami i kilkoma niedokładnościami.
Merlyn Morgan-Graham
1
@Merlyn Morgan-Graham: Skomentowałeś prawie wszystkie odpowiedzi, w tym pytanie. Dlaczego więc nie opublikujesz szczegółowej odpowiedzi bez żadnych nieścisłości ? Chciałbym poznać twoje myśli.
Nawaz
1
@Nawaz: Komentarz dotyczył innych odpowiedzi. Ten jest już prawie idealny. Idealnie chciałbym próbki w odpowiedzi, ale wydaje się, że nikt nie robi ich dobrze. Prawdopodobnie nie mogłem też, inaczej chętnie bym się zobowiązał :)
Merlyn Morgan-Graham,
@Nawaz: Dobra i tak spróbowałem :)
Merlyn Morgan-Graham
12

Nie włożyłbym zbyt wiele pieniędzy w definicję Wikipedii.

Przynajmniej idiom jest specyficzny dla języka, podczas gdy wzorzec projektowy dąży lub powinien dążyć do tego, aby był niezależny od języka. Idąc dalej, idiomy są zwykle konwencjami poprawiającymi czytelność lub stanowią lepszą alternatywę (pod pewnymi względami technicznymi), gdy istnieje więcej niż jeden sposób na zrobienie czegoś. Wszystkie te rzeczy są związane z tym, jak wyrażane są idee (jasność, gadatliwość, zwięzłość), ale nie z samymi ideami.

Z drugiej strony wzorce projektowe są istotą powracającego pomysłu, a priori można wyrazić w dowolnym języku, który mu się podoba. Gość jest implementacją podwójnej wysyłki opartej na pojedynczej wysyłce i przeciążeniu, która może być używana w dowolnym języku, który ma pojedynczą wysyłkę i przeciążenie. Znajomość wzorca nie pomaga napisać bardziej wyrazistego lub bardziej czytelnego kodu, pomaga rozwiązać związany z tym problem. Nie ma w tym nic idiomatycznego, ponieważ na przykład nie ma kanonicznej formy Odwiedzającego np. W C ++.

Luc Danton
źródło
1
+1; Dobra odpowiedź. Jestem skłonny uwierzyć we wszystko tutaj, z wyjątkiem ostatniego kawałka. Istnieją języki, które mają bezpośrednią obsługę wielu wysyłek, więc wzorzec użytkownika nie musiałby tam istnieć. Z ich punktu widzenia „wzorzec” może być bardziej idiomem. Z ostatecznego języka wysokiego poziomu wszystkie wzorce mogą stać się idiomami ...
Merlyn Morgan-Graham,
@Merlyn Co jest idiomatycznego w ponownym wdrażaniu pierwszej klasy funkcji językowych? Kto tak robi?
Luc Danton
O to chodzi. Użytkownicy tego języka uważają „wzorzec projektowy” za idiom, ponieważ ich język jest fajniejszy :)
Merlyn Morgan-Graham
@Merlyn To nie pasuje do moich zastosowań „idiomu”. Idiom języka to coś, czego oczekujesz od przypadkowego, sprawnego użytkownika języka; reimplementacja pierwszorzędnej funkcji będzie wyglądać obco i nie na miejscu. Nie ma idiomu C ++ dla pojedynczej wysyłki, po prostu używa się go virtualw niektórych miejscach, podczas gdy odręczny wskaźnik do tabeli sztuczek członków będzie wyglądał głupio.
Luc Danton,
1
Podoba mi się to, dokąd zmierzasz z definicją idiomu różną od „wzorca projektowego biedaka”, co w pewnym sensie traktuje mój model (patrz moja odpowiedź). Jest mniej „tutaj jest jak to zaimplementować”, a więcej „tutaj jest właściwy sposób na to”. Na przykład nie wyobrażam sobie, by „Wielka Trójka” ewoluowała do wzoru. Jest też składnik składniowy, np. do_something() or die "...";(Skradziony z innego komentarza tutaj). Opiera się na określonych funkcjach językowych, ale jest powszechnym sposobem korzystania z tych funkcji. To nie jest wielojęzyczny i prawdopodobnie nie będzie.
Merlyn Morgan-Graham,
6

Normalna angielska definicja Idiomu. Jest frazą, której zaakceptowane znaczenie nie jest zawarte w użytych słowach. Przykładami mogą być „Pada koty i psy” lub „Gdzie jest wołowina?”

W językach programowania zwykle odnosi się do skrótu składniowego, który nie robi czegoś oczywistego bezpośrednio z samego kodu, ale który jest używany wystarczająco często, aby inni programiści natychmiast rozpoznali znaczenie.

Perl jest prawdopodobnie najbardziej bogatym językiem. Z konstrukcjami takimi jak:

while (<IN>) {
    print $_
}

Czyj sens jest oczywisty dla doświadczonego programisty perla, ale tajemnicą dla każdego innego

James Anderson
źródło
Myślę, że „gdzie jest wołowina” to bardziej mem niż idiom. Może mieć tam inne kontinuum;) W idiomie może być coś więcej niż tylko implementacja w języku, ponieważ mogą to być częściowe lub nieudane implementacje tego idiomu - na przykład „Wielka Trójka” C ++. W tym przypadku idiomem jest nazwa i opis „Wielkiej Trójki”.
Merlyn Morgan-Graham
2
Perl ma najlepsze idiomy -do_something() or die "arrrrgh!";
cxfx
2

Idiomy są specyficzne dla języka. Np. while (*dest++=*src++);Jest idiomem C / C ++. Całkowicie niemożliwe jest napisanie czegoś zdalnie podobnego w języku Pascal lub Java. Użyj słowa „idiom”, tak jak używasz go w języku angielskim. "Jak się masz?" ponieważ powitanie jest idiomem. Niektóre języki, takie jak niemiecki i frensh, mają ten sam idiom. Ale wiele innych języków nie „zapytałoby” czegoś takiego na powitanie. Z drugiej strony wzorzec (obiektowy) zwykle można dostosować do dowolnego języka, który obsługuje dziedziczenie i delegowanie. Idiom może być tak prosty jak jeden wiersz kodu. Wzorzec projektowy zawsze obejmuje kilka klas.

Angel O'Sphere
źródło
+1. Dobra uwaga:A idiom might be as simple as one line of code. A design pattern always involves several classes.
Nawaz
2

Znalazłem ten post, szukając popularnych idiomów C ++, ponieważ ostatnio dość głęboko się w niego zagłębiłem i chciałbym, aby mój kod nie wyglądał tak amatorsko, jak mi się wydaje ... :-P

Spędziłem sporo czasu z Perlem i znalazłem idiomy w tym języku podobne do tych znalezionych w językach naturalnych, takich jak angielski lub hiszpański (tylko dwa znam wystarczająco dobrze, aby znać niektóre idiomy).

Nie zgadzam się, że ten idiom jest jak „mały wzór”. Nadal nie zgadzam się, choć w mniejszym stopniu, że idiom jest sposobem na obejście niedoboru języka.

Być może odpowiedź Luca Dantona jest najbliższa, ale pozwól mi wyjaśnić. Myślę, że ten idiom jest cóż idiomatyczny dla tych, którzy używają języka. Zwykle wspólne wyrażenie lub sekwencja wyrażeń, które, choć być może nie są oczywiste, wykonują operację lub wyrażają intencję w sposób, który ma sens dla tych, którzy są wystarczająco biegli , aby ją wcześniej zobaczyć.

Wracając do Perla, być może najbardziej znanym idiomem jest „ transformacja Schwartziana ”, wyrażenie, które wykonuje sortowanie danych w zwarty i wydajny sposób. Nie jest to najbardziej oczywisty sposób na wykonanie takiej operacji, ale jest ona zwięzła i ci, którzy ją widzieli wcześniej, od razu wiedzą, co ona robi.

Innym godnym uwagi przykładem jest „ The Orcish Mananever ”, który wykorzystuje perlowe pojęcia prawdziwych / fałszywych, bogatych operatorów i pierwszeństwa operatorów.

Ten, który osobiście bardzo lubię, jest nieco związany z Mancerem Orków, ale nie znam jego nazwy:

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

To rzeczywiście nie jest zaciemnianie, ale raczej wyraźne, zwięzłe wyrażenie czegoś, co w innym przypadku zajęłoby kilka linii. Jeśli klucz jest obecny w haszu i ma prawdziwą wartość, usuń odwołanie do niego jako tablicy i wrzuć $ some_value na tę tablicę. Jeśli element skrótu nie jest obecny lub ma fałszywą wartość, przypisz mu pustą tablicę, a następnie odłóż tę tablicę i wykonaj wypychanie.

Warto również zauważyć, że od Perla 5.14 część tego idiomu jest przestarzała - push może teraz działać bezpośrednio na odwołaniu do tablicy, bez potrzeby @ {}! Ponadto, począwszy od Perla 5.10, można użyć // = zamiast || =, który sprawdza nie prawdę, ale definicję.

Hercynium
źródło
w Pythonie some_dict.setdefault(key, []).append(some_value).
Jonas Kölker
0

celem Idiomu jest bycie pomysłem lub koncepcją obejmującą języki programowania, jest to sposób robienia rzeczy i proces, który działa bez większych zmian konceptualnych, gdy wyjmiesz go z jednego i umieścisz w innym, jak w przypadku małego bąbelkowego sortowania . Wzorce projektowe to specyficzne implementacje idiomu lub rozszerzenia idei pasujące do języka, dlatego masz wzorzec projektowy javascript idiomu nasłuchiwania zdarzeń itp.


źródło
detektor zdarzeń to funkcja języka, która implementuje sygnał / gniazda (wzorzec?) lub wzorzec Observer. W C ++ są też rzeczy zwane idiomami, które po prostu nie mają znaczenia lub nie pasują do innych języków (o ile mi wiadomo) - np. Idiom kopiowania i zamiany.
Merlyn Morgan-Graham
Design patterns are specific implementations of an idiom? Jak dokładnie? Widziałeś idiomy C ++ w linku w moim pytaniu?
Nawaz
0

Nie jestem w 100% pewien, ale idiomy to po prostu terminy odnoszące się do określonego pola. Kiedy mówisz „wzorce projektowe”, myślisz o „Wzorcu obserwatora”, „łańcuchu odpowiedzialności”, „wzorcu użytkowników”, „fabryce”. Są to typowe wzorce stosowane do rozwiązywania typowych problemów w programowaniu. Tutaj znajdziesz pełną listę: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


źródło
0

Co to znaczy? Co oznacza tutaj „niski poziom”?

Rozumiem przez to, że nie jest to abstrakcyjny sposób wysokiego poziomu modelowania aplikacji lub składników aplikacji, ale sprytne lub powszechne użycie semantyki języka.

na przykład ustawienie zmiennej, jeśli ma wartość false (powszechnie używane do warunkowego ustawienia zmiennych zerowych):

var ||= some_default_value
Ed S.
źródło
0

Oto przykład idiomu (w języku C #) do obsługi zdarzenia. Nie wolno uruchamiać zdarzenia, jeśli nie ma on żadnych programów obsługi, więc idiomem jest zawsze sprawdzanie tego jako pierwszego.

Dlatego ogólny idiom obsługi zdarzeń staje się:

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

Ten idiom jest specyficzny (choć nie wyłączny) dla języka C #.

Mówiąc bardziej ogólnie, mechanizm zdarzeń C # jest przykładem wzorca projektowego obserwatora, który można zaimplementować w dowolnym języku.

cxfx
źródło