Copy & Paste vs. Špagety

Martin

Copy & Paste vs. Špagety
« kdy: 16. 07. 2016, 09:34:48 »
Ahoj,

Zajímalo by mě, jak řešíte společnou funkcionalitu, která se téměř opakuje, až na nějaký malý rozdíl. Může to být funkce, kde pro jiné využití potřebujete změnit pár řádků. Nebo formulář, který ja nachlup podobný jinému, jen jsou tam nějaké položky navíc, nějaké chybí nebo se jinak jmenují.

Mě se osvědčily dva přístupy:
1. Copy & Paste: Výhoda je, že budoucí změny mají lokální dopad. V některých případech to je zároveň nevýhoda, protože je občas potřeba něco opravit hromadně.
2. Přidám rozšiřující parametry do funkce nebo skriptu stránky a dovnitř dám podmíněný specializující kód
2a. Nové funkce volající jednu univerzální, případně nové skripty inkludující jeden univerzální nebo v používající funkce/objekty.

Vím, že ideální je navrhnout modulárnějí architekturu, ale pokud se dvou formulářích opakuje 19 z 20 položek, tak opravdu nevím, jak na to.


Kit

Re:Copy & Paste vs. Špagety
« Odpověď #1 kdy: 16. 07. 2016, 09:52:35 »
Specializující kód injektuji do funkce či metody se společným kódem. Podmínky tím nejsou potřebné a špagety nevzniknou.

V šablonách nevhodnou část prostě překryji jinou částí prostřednictvím importu.

nechápe

Re:Copy & Paste vs. Špagety
« Odpověď #2 kdy: 16. 07. 2016, 11:08:20 »
Specializující kód injektuji do funkce či metody se společným kódem. Podmínky tím nejsou potřebné a špagety nevzniknou.

V šablonách nevhodnou část prostě překryji jinou částí prostřednictvím importu.

To máš zase svoje termíny a nebo jen neumím nějaký skriptovací bazmek? Jak jsi teda vyřešil problém?

Re:Copy & Paste vs. Špagety
« Odpověď #3 kdy: 16. 07. 2016, 11:47:49 »
Specializující kód injektuji do funkce či metody se společným kódem. Podmínky tím nejsou potřebné a špagety nevzniknou.

V šablonách nevhodnou část prostě překryji jinou částí prostřednictvím importu.

To máš zase svoje termíny a nebo jen neumím nějaký skriptovací bazmek? Jak jsi teda vyřešil problém?
Společná část je v kódu jenom jednou. Odlišnost se vyřeší podle povahy věci - pokud je to třeba posloupnost dílčích kroků, kde se jeden krok liší, bude každý z kroků samostatná funkce. V jednom případě se pak zavolají kroky 1, 2 a 3a, v druhém případě 1, 2 a 3b. Pokud ta odlišnost je v tom, že ten hlavní kód potřebuje provést nějakou specializovanou operaci, vytkne se ta specializovaná operace do samostatné funkce. Ve funkcionálním přístupu se pak ta specializovaná funkce předá hlavnímu kódu jako parametr, v objektovém přístupu  bude ten hlavní kód v nějaké třídě a bude volat specializovanou metodu, která bude v potomcích přetížená.

Pokud ty formuláře jsou nějaké šablony, obvykle šablonovací systém umožňuje používat nějaké importy nebo includy, které umožní znovupoužití kódu.

Zkrátka oba přístupy, jak kopírování tak zavlékání implementačních detailů do nějaké obecné funkce (z čehož vzniká špagetový kód), jsou špatně. Každé programovací paradigma, každý jazyk i spousta frameworků poskytuje nějaké nástroje, jako řešit znovupoužitelnost kódu. Pokud se tedy tazatel ptal, zda vůbec psát znovu použitelný kód, pak rozhodně ano. Pokud se ptá na to, jak ho psát, pak je potřeba znát alespoň konkrétní paradigma a jazyk, protože pokaždé jsou k dispozici trochu jiné nástroje.

Martin

Re:Copy & Paste vs. Špagety
« Odpověď #4 kdy: 16. 07. 2016, 12:26:12 »
Jo, virtuální metody jsem mohl dát jako třetí možnost. Akorát je pak problém, když potřebuju různé kombinace ano/ne. To jde řešit třeba v C++ vícenásobnou inheritancí, ale obecněji spíše funkčním pointerem, lambda funkcí, delegátorem nebo celým objektem. Akorát je možná jednodušší všechno nacpat do jedné rozvětvené funkce.


dustin

Re:Copy & Paste vs. Špagety
« Odpověď #5 kdy: 16. 07. 2016, 12:34:08 »
Akorát je možná jednodušší všechno nacpat do jedné rozvětvené funkce.

Jednodušší to možná je, teď pro tebe. Až přijde další požadavek na změny, budeš sám sebe nebo někdo jiný tebe proklínat. Mnohokrát ověřeno v praxi, bohužel...

Napiš to čistě přehledně hned od začátku, dobrý kód je takový, ze kterého máš radost a můžeš sám sebe pochválit.

Kit

Re:Copy & Paste vs. Špagety
« Odpověď #6 kdy: 16. 07. 2016, 12:37:31 »
Ha! Konečně jsi prozradil, že se jedná o C++!

I booleovské vlastnosti se dají injektovat. Samozřejmě je nejlepší se psychické závislosti na typu boolean co nejdříve zbavit.

Re:Copy & Paste vs. Špagety
« Odpověď #7 kdy: 16. 07. 2016, 12:58:33 »
Akorát je možná jednodušší všechno nacpat do jedné rozvětvené funkce.
Je to jednodušší to tak jednou napsat. Jenže pak pro ten kód budete psát test, budete jej mnohokrát číst a mnohokrát upravovat, a ve všech těch případech už je to komplikace.

Na to, že je špagetový kód zlo, nepřišel nějaký teoretik, který by nenapsal ani čárku. Na to přišli a přicházejí programátoři opakovaně v reálném kódu, se kterým musí pracovat.

gl

Re:Copy & Paste vs. Špagety
« Odpověď #8 kdy: 16. 07. 2016, 15:37:23 »
Je to jedno. Hlavně, že to bude fungovat.

Re:Copy & Paste vs. Špagety
« Odpověď #9 kdy: 16. 07. 2016, 15:43:26 »
Je to jedno. Hlavně, že to bude fungovat.

Jen si musis dat pozor, aby ti, kdo po tobe ten kod zdedi, nemeli sanci najit tvou adresu...

gl

Re:Copy & Paste vs. Špagety
« Odpověď #10 kdy: 16. 07. 2016, 15:45:40 »
Souhlasím s Kitem. Není možné předat jako parametr funkci nebo blok kódu, který dělá tu specifickou část?

gl

Re:Copy & Paste vs. Špagety
« Odpověď #11 kdy: 16. 07. 2016, 15:46:52 »
Je to jedno. Hlavně, že to bude fungovat.

Jen si musis dat pozor, aby ti, kdo po tobe ten kod zdedi, nemeli sanci najit tvou adresu...

Nejjednodušší možné řešení bývá nejčitelnější.

Re:Copy & Paste vs. Špagety
« Odpověď #12 kdy: 16. 07. 2016, 15:55:04 »
Je to jedno. Hlavně, že to bude fungovat.

Jen si musis dat pozor, aby ti, kdo po tobe ten kod zdedi, nemeli sanci najit tvou adresu...
;D

Re:Copy & Paste vs. Špagety
« Odpověď #13 kdy: 16. 07. 2016, 15:55:29 »
Je to jedno. Hlavně, že to bude fungovat.

Jen si musis dat pozor, aby ti, kdo po tobe ten kod zdedi, nemeli sanci najit tvou adresu...

Nejjednodušší možné řešení bývá nejčitelnější.

OMG

Re:Copy & Paste vs. Špagety
« Odpověď #14 kdy: 16. 07. 2016, 16:35:23 »
Je to jedno. Hlavně, že to bude fungovat.

Jen si musis dat pozor, aby ti, kdo po tobe ten kod zdedi, nemeli sanci najit tvou adresu...

Nejjednodušší možné řešení bývá nejčitelnější.

Jenomze to skutecne nejjednodussi reseni da obrovske mnozstvi prace...