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
Odpowiedzi:
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.
źródło
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).
źródło
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 ++.
źródło
virtual
w niektórych miejscach, podczas gdy odręczny wskaźnik do tabeli sztuczek członków będzie wyglądał głupio.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.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:
Czyj sens jest oczywisty dla doświadczonego programisty perla, ale tajemnicą dla każdego innego
źródło
do_something() or die "arrrrgh!";
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.źródło
A idiom might be as simple as one line of code. A design pattern always involves several classes.
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:
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ę.
źródło
some_dict.setdefault(key, []).append(some_value)
.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
Design patterns are specific implementations of an idiom
? Jak dokładnie? Widziałeś idiomy C ++ w linku w moim pytaniu?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
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):
źródło
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ę:
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.
źródło