it-swarm-eu.dev

Jaké konstrukční vzory jsou nejhorší nebo nejužší definovány?

Pro každý programovací projekt se manažeři s minulými zkušenostmi s programováním snaží zazářit, když doporučují nějaké návrhové vzory pro váš projekt. Líbí se mi návrhové vzory, když mají smysl nebo potřebujete škálovatelné řešení. Například jsem používal vzory proxy, pozorovatelů a velení pozitivním způsobem, a to každý den. Ale opravdu váhám použít říci Factory pattern, pokud existuje pouze jeden způsob, jak vytvořit objekt, protože továrna by to mohla v budoucnu usnadnit, ale komplikuje kód a je čistě režijní.

Takže moje otázka se týká mé budoucí kariéry a mé odpovědi na typy manažerů, kteří házejí náhodná jména vzorů kolem:

Které designové vzory jste použili, které vás celkově přivedly zpět? Jaké jsou nejhorší návrhové vzory, ty, které byste měli zvážit, s výjimkou jediné situace, kdy mají smysl (přečtěte si: které návrhové vzory jsou velmi úzce definovány)? (Je to, jako bych hledal negativní recenze celkově dobrého produktu Amazonu, abych zjistil, co nejvíce bugovali lidé při použití návrhových vzorů.) A nemluvím zde o Anti-vzorcích, ale o vzorech, které se obvykle považují za "dobré" vzory.

Edit: Jak někteří odpověděli, problém je nejčastěji v tom, že vzory nejsou „špatné“, ale „špatně použité“. Pokud znáte vzorce, které jsou často zneužívány nebo dokonce obtížně použitelné, hodí se také jako odpověď.

28
Akku

Nevěřím ve špatné vzory, věřím, že vzory lze špatně použít!

  • IMHO singleton je nejvíce zneužívaným a nejvíce nesprávně aplikovaným vzorcem. Zdá se, že lidé mají singletonovou chorobu a začínají vidět možnosti singletonů kdekoli, aniž by zvažovali alternativy.
  • IMHO vzor návštěvnosti má nejužší použití a téměř nikdy nebude přidaná složitost odůvodněna. Pěkný pdf lze získat zde . Opravdu pouze v případě, že máte datovou strukturu, o které víte, že bude procházena při provádění různých operací s datovou strukturou, aniž byste předem znali všechny cesty předem, dejte návštěvníkovi vzorec bojovou šanci. Je to docela pěkné :)

Pro tuto odpověď jsem uvažoval pouze o vzorcích GOF. Neznám všechny možné vzorce dostatečně dobře, abych je mohl vzít v úvahu.

40
KeesDijk

Půjdu sem na končetinu a navrhnu nadměrné použití dědičnosti. Rozhodně nejvhodnější v jazycích bez podpory solidního kompilačního polymorfismu, jako je Java. Dědičnost za běhu je nástroj, ne nějaký zázrak.

Ostatní lidé již vyjádřili podobné mé osobní nenávisti k Singletonům, takže se tím nebudu dále zabývat.

14
DeadMG

Kromě singletonů a návštěvníků, které již zmínili ostatní respondenti, nevím o „notoricky známých“ vzorcích. Největší problémy IMHO nevyplývají z toho, že by konkrétní návrhový vzor byl „špatný“, ale spíše od vývojářů, kteří používají vzory příliš dychtivě.

Téměř každý prochází fází „vzorové horečky“, když se seznamuje se vzory. Když si myslíme, že vzory jsou nejlepší věcí od krájeného chleba, nejprve se je pokusíme aplikovat, kdykoli vidí možnost. To má za následek to, že se kód pohřbí podle vzorů, kde samotné vzory již nepomáhají, jen ztěžuje pochopení a udržení kódu v dlouhodobém horizontu.

Nakonec se většina z nás dostane do této fáze a začne se učit, jak pomocí těchto vzorců řešit skutečné problémy, nikoli pro sebe. Vzory mají svou cenu, což je přidaná složitost, a použití jakéhokoli specifického vzoru je odůvodněné pouze tehdy, když se vyplatí zpět pro přidanou složitost tím, že pomáhá zjednodušit některé další části systému, čímž je kód/konfigurace celkově snáze pochopitelné a udržovatelné. Pokud tomu tak není, je často lepší držet se vzorů a držet se nejjednoduššího řešení, které by mohlo fungovat.

14
Péter Török

Jedináček. Jde o vzory GOF, které se nyní častěji nazývají anti-vzory. Jedním z důvodů je to, že Singleton ztěžuje testování kódu.

10
SiberianGuy

Pokud znáte vzorce, které jsou často zneužívány nebo dokonce obtížně použitelné, hodí se také jako odpověď.

Podle vzor MVVM pro [~ # ~] wpf [~ # ~] příliš striktně, jak je uvedeno například - touto otázko . Někteří lidé se snaží postupovat podle pokynů, že žádný kód by neměl být do kódu zadáván příliš přísně a přicházet se všemi druhy exotických hacků.

A samozřejmě, MVVM je obtížné jako peklo a pro malé krátkodobé projekty to nestojí.

Dr. WPF o tom ve svém článku M-V-poo .

7
Steven Jeuris

Továrna. Viděl jsem implementovat kód, který vytváří pouze jeden typ. To je úplně zbytečný kód IMO. Nepomáhá, že mnoho příkladů online je zcela vymyšlených. Továrna na pizzu?

Možná se továrna snadněji testuje kvůli injekci závislosti. Ale přidat tento kód, když ho nebudete potřebovat, je pro mě zbytečné a argument testu zmizí, když můžete použít simulované rámce, jako je JMockit. Čím jednodušší můžete program vytvořit, tím lépe. Továrny opravdu dávají smysl jen s větším počtem typů (tím větší, myslím alespoň více než 2).

5
Michael K

Některé ze vzorů v knize GOF jsou specifické pro C++, v tom smyslu, že jsou méně použitelné v jazycích s odrazem, např. vzor prototypu je v Javě méně významný.

Vzorec tlumočníka považuji za „úzký“. Musíte mít obecný problém, který stojí za to vyvinout obecného řešitele problémů. Funguje to pouze u zvláštních problémů, pro které můžete vymyslet jazyk, definovat gramatiku a napsat tlumočníka. Příklady problému by měly být reprezentovatelné jako věta v gramatice. Nemyslím si, že se s takovými situacemi často setkáváte.

5
Karl

Ten, který nejčastěji lituji (i když ne velmi vehementně): Když jsem měl právě vytvořit funkci, ale implementoval jsem řešení OOP).

5
C SD

Singleton

Souhlasím s ostatními o Singletonu. Ne, že byste je nikdy neměli používat, jen že by to mělo být omezeno na velmi málo případů. Používají se často jako líné globály.

Bezpečnost vláken je jedním problémem se singletony. Zpracování výjimek je další - pokud se singleton nevytvoří správně - ne vždy víte, zda můžete chybu zachytit bezpečně, zejména pokud se jednalo o jeden z objektů vytvořených „před hlavním“. A potom je tu problém s úklidem.

Mám sklon raději používat jeden singleton a nechat si zaslat všechny ostatní „rádoby“ singletons „subscribe“. Mým nejběžnějším používáním singletonů je manipulace s „výkřiky“: stačí „vysílat do světa“, že se událost odehrála a kdokoli, kdo poslouchá, bude s touto událostí zacházet. Tímto způsobem oddělíte události, které se skutečně dějí, s tím, co je poslouchá. (Protokolování, signály atd.)

Návštěvník

Ošklivá věc, kterou o tom nacházím, kromě skutečnosti, že vývojáři nemohou vymyslet smysluplná jména a pouze zavolat metody visit (), je to, že přidává rozšiřitelnost v jednom směru a zároveň ji odebírá v jiném, tj. Přidává další funkčnost, ale omezuje počet objektů, které návštěvníci potřebují vědět o všech typech objektů, které mohou navštívit.

Je možné, i když chaotický, povolit rozšíření v obou směrech, ale to zcela nevyužívá vzor návštěvníka v jeho pravidelné podobě. Nejběžnější aplikací pro tento účel je tisk objektů: máte různé způsoby tisku objektů a různých objektů, které je třeba vytisknout. Měli byste být schopni rozšířit to oběma směry. (Tisk znamená jakýkoli druh přeměny objektů na proud: uložení do souboru/zápis do konzole/GUI atd.).

(Poznámka: Neměli byste si to zaměňovat s architekturou zobrazení dokumentů, což je poněkud odlišný vzor).

2
CashCow

Myslím, že problém s některými složitějšími vzory je v tom, že na nich je tolik variací, že ztratí velkou část své hodnoty jako komunikační zařízení.

Nejhorší pachatel, kterého v této kategorii dokážu napadnout, je model MVC. I když ignorujeme MVP, existuje tolik variací v rolích každé z těchto položek, že musíte strávit hodinu v každém novém rámci a zjistit, kde leží hranice.

2
Uri

Neexistují žádné špatné vzorce, pouze špatní lidé.

Raději bych zdědil snadno čitelný kód, který udělá něco jasného, ​​ale je trochu podrobný nebo ne (fronta zlá villianská hudba) znovu použitelný (zalapal po dechu!) Než nějaký mish rash InheritAbstractTemplateFaucetSink<Kitchen>.

Opakovaně použitelný kód je skvělý! Je pravděpodobné, že nepíšete kód, který bude znovu použit, nebo přepíšete podobnou logiku pro jinou aplikaci, což by vám zabralo méně času než nějaký šílený pokus o opakované použití kódu jiné aplikace.

Pro další čtení crack otevřete část C kódu v rozumných implementacích posix záhlaví nebo clibs a zahrajte si vzor. Tento kód byl napsán některými z nejchytřejších a nejoddanějších programátorů na světě. Víte, kolik abstraktní továrních vzorů uvidíte? ... ŽÁDNÝ!. Ještě lepší šance jsou, pokud rozumíte ostatním částem toho, co se děje, najdete logiku velmi snadno pochopitelnou a sledovatelnou.

Můj názor je, že většina „vzorů“ nebyla vytvořena, aby zlepšovala kód, protože byly vytvořeny k prodeji knih a softwaru pro modelování. Pokud jste dobří v programování, pravděpodobně se většině z nich vyhnete a napíšete jasný, výstižný a chytře navržený kód, který váš problém vyřeší. Když budete mít další problém, napíšete jasný, výstižný a chytře navržený kód, který tento problém vyřeší. Pokud je vaším cílem napsat méně kódu, než bych si myslel, nevystříháte se jako programátor. Miluji psaní kódu a chci ho psát co nejvíce. Když přepíšu něco, co jsem již napsal, udělám to desítkykrát rychleji a zbavím se všech věcí, které jsem nebyl poprvé, když jsem udělal, spokojený. Jako bonus to zvládnu bez omezení prvního problému, protože je to nový problém (asi mám 15 skriptů v 5 různých jazycích, které začínají Tomcatem plovoucí).

S tím nechám vás asi nejlepší (relevantní) citát z informatiky.

"Existují dva způsoby, jak vytvořit návrh softwaru: Jedním ze způsobů je zjednodušení tak, aby zjevně neexistovaly žádné nedostatky, a druhý způsob je zkomplikovat tak, aby neexistovaly zjevné nedostatky. První metoda je mnohem obtížnější. "

  • Tony Hoare (vynálezce quicksort, otec moderního designu OS, tvůrce logiky Hoare a příjemce ceny Turing)
1
nsfyn55

Rozhodně souhlasím s tím, že je čas na většinu vzorů a že mnoho vzorců můžete zneužít. Vím, že ten, který jsem v minulosti nejvíce zneužíval, je vzor Abstraktní šablony. Vzhledem k tomu, že je v plném rozsahu, je znám jako webové formy ASP.NET.

0
Wyatt Barnett