Jak se naučit slušně vyvíjet v Javě

balki

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #45 kdy: 22. 05. 2017, 15:30:55 »
Obvykle problem vystane uz pri navrhu, alebo pri programovani. Pripadne ten problem ma clovek aspon v hlave. Ak sa pouzije vzor defaultne, bez toho ho bolo treba, tak to je priklad overengineeringu.  V knizkach, napriklad tej od gang of four je vysvetlene, aky je relevantny kontext a aky poroblem sa riesi. (Ano a treba aj hlavu pouzit, knizka tiez nepozna vsetky situacie :) )

Ty návrhové vzory nejsou tak komplikované, jak na první pohled vypadají. Třeba implementace Singletonu představuje jen cca 3 řádky ve třídě a vůbec nemusí být statická. Simple Factory má kdekdo ve formě jedné statické metody - Laravel je toho plný.

Použití návrhového vzoru nemusí znamenat napsání celé samostatné třídy nebo dokonce několika tříd. Většina z těch vzorů se dá implemenovat v jediné krátké metodě do 10 řádek. O overengineering se tedy rozhodně nejedná.

Taktiez sa daju pouzit pri refactorovani, ked vznikne potreba. Vzory predsa len pridavaju nejaky ten kod naviac a pridavaju nejake spravanie, ktore nemusi byt ziadane.  Ak nemam problem, nemusim ho riesit. Ok, uz koncim, lebo sa do mna pusti zboj, ze nepoznam pytagorovu vetu :)


Kit

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #46 kdy: 22. 05. 2017, 18:35:45 »
Laravel neni napsany v Jave, to jak ty prasis kod v PHP nevykladej ostatnim jako Java best practices dekuji :-)

GoF neřeší implementaci, ale metodiku užití návrhových vzorů.

kimec

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #47 kdy: 23. 05. 2017, 01:20:28 »
Muze se clovek naucit slusne vyvijet software (schvalne pisu vyvijet software a ne jen programovat) v Jave, kdyz nema nikoho kdo jej muze mentorovat? (at uz v praci nebo ve skole).
"Slusne vyvinuty software" je podla mna nedobra definicia. Z jednoducheho dovodu, ze je to subjektivne hodnotenie zavisle na kontexte. Vysvetlim na extremnom priklade.
Napr. taky Jake2 (port Quake2 do Javy) je podla vsetkeho uber-neslusny, pretoze su tam porusene vsetky zakladne principy "dobreho java programovania", t.j. encapsulacia cez gettery/settery, znasilnene staticke fieldy a metody, nazvy metod a fieldov (skoro ziaden CamelCase), pomaly ziadne asserty atd. Napriek tomu Jake2 funguje... Preco je ten kod taky hnusny? Pretoze je to port z C-cka a team, ktory ho portoval, si uvedomil, ze keby ho chceli portovat "pekne javovsky", tak pravdepodobne este dnes pisu iba gettery a settery a akurat by zacinali rozmyslat, kde by sa sikol singleton a kde nejaky ten visitor... takze sa na celu tu javovsku nomenklaturu vykaslali a vacsinu riesili automatizovane s nejakymi minimalnymi modifikaciami tak, aby to bolo aspon skompilovatelne.
Obdobny problem riesil autor Mocha Dooma (port Dooma do Javy), ktory sa o svojom projekte vyjadril takto:
Citace
several concepts have been "borrowed" from Jake 2, especially regarding the methods used to port complex game C code to Java, how to map structs to classes, how to implement binary loaders etc.

Klucovy vyraz: complex C code.

Fuguje Jake2? Funguje. Je slusne vyvinuty? Je, ved ho pisal sam Carmack. Zvladla by ho napisat bezna Java lopata (cize ja) od nuly a pekne javovsky? Nie...

Samozrejme, ked si clovek potom zoberie zdrojaky Springu, to sa cita ako krasny enterprise grade Java kod a kde tu narazite aj na poctivy WrapperHolder z 2002ho - v tomto smere JDKcko na tom nie je o nic lepsie. Ale v podstate je pri Springu dolezite, ze sami Springove komponenty su pisane s tym, ze budu mat dostupne vsetky "bells and whistles" dependency injection. Projekt, ktory nema k dispozicii Spring bude zase strukturovany a napisany inak.
Co je ale uplna hlupost je pisanie vlastneho Springu na projekte bez Springu alebo naopak, nevyuzivat DI na projekte, ktory je cely Springovy...

S mentorom ci bez, hlavne treba vela citat, citat, citat a citat.

Gjiii@jgf.sk

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #48 kdy: 23. 05. 2017, 02:08:28 »
Moj mentor bol Aslak Knutsen, dvojnasobny Java Champion od Oraclu, robil som pod nim tri roky open source framework Arquillian, chodil som na hackatony, robil som pod nim diplomovku, bol som na google summer of code a pisal som o tom blogy, chodil som na konferenvie s tym co robim ... potom som si nasiel job u jedneho americkeho startupu a podarilo sa im predat ho twittru ... tak sa naucis kodit v jave, Aslak je strasny zver a mam neskutocne stastie ze som pod nim robil, teraz som karierne uplne niekde inde jak vacsina

dustin

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #49 kdy: 23. 05. 2017, 09:05:33 »
Slušný kód neposuzuji podle toho, jestli zrovna teď funguje správně (to považuji za samozřejmost), ale zda jej lze rozumně rozvíjet i do budoucna. Nejsem si jist, zda poloautomatizovaný přepis z céčka toto splňuje. Samozřejmě účel světí prostředky a je to tak správně. Pokud nepotřebují na té hře dále dělat, byla by chyba jej nevyužít.

Pořád jsem víc a víc přesvědčený, že slušný vývoj vůbec není o vychytávkách v daném jazyce, ale o dobře udělané analýze a návrhu modulů/tříd/objektů. Čím víc odpovídá skutečné realitě a obsahuje méně "hacků", tím je kód udržovatelnější a z mého pohledu lepší. Rovněž čím je víc typově svázaný, tím je udržovatelnější, mimo jiné i protože v něm nelze dělat tolik hacků (čuňáren). Když se přitom využijí možnosti javy 8 pro zkrácení zápisu (lambdy, streamy), neuškodí to. Jejich používání není žádná věda.

Např. často se tu řeší dědičnost. IMO jsou "problémy" s dědičností jen důsledkem špatné dekompozice problému, kdy třída řeší více funkcionalit najednou, místo aby se skládala z více objektů, které již samy mají smysluplnou dědičnou posloupnost odpovídající realitě a výsledný objekt mohu poskládat z komponent ve vhodné funkční "verzi". V legacy kódu to řeším každý den.

Z pohledu těchto věcí posuzuji kvalitu softwaru/vývoje v javě. Úplně stejné požadavky budou při vývoji v jakémkoliv jazyce. S mladými kluky na domácím programování děláme v pythonu a musí kolem tříd řešit úplně to samé, jen díky chybějící typovosti dělají v kódu mnohem více chyb. A platí to i v neobjektových jazycích, protože i třeba v plain C sakra moc záleží, jak se ty structy navrhnou.


Kit

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #50 kdy: 23. 05. 2017, 09:18:20 »
Napr. taky Jake2 (port Quake2 do Javy) je podla vsetkeho uber-neslusny, pretoze su tam porusene vsetky zakladne principy "dobreho java programovania", t.j. encapsulacia cez gettery/settery, znasilnene staticke fieldy a metody, nazvy metod a fieldov (skoro ziaden CamelCase), pomaly ziadne asserty atd. Napriek tomu Jake2 funguje... Preco je ten kod taky hnusny? Pretoze je to port z C-cka a team, ktory ho portoval, si uvedomil, ze keby ho chceli portovat "pekne javovsky", tak pravdepodobne este dnes pisu iba gettery a settery a akurat by zacinali rozmyslat, kde by sa sikol singleton a kde nejaky ten visitor... takze sa na celu tu javovsku nomenklaturu vykaslali a vacsinu riesili automatizovane s nejakymi minimalnymi modifikaciami tak, aby to bolo aspon skompilovatelne.

Zapouzdření se dá elegantně dělat i bez *etterů. Stačí umět používat DI.

JS

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #51 kdy: 23. 05. 2017, 09:54:43 »
IMHO, je to jako s matematikou. Nejlip se naucis nejaky konkretni podobor, kdyz zkusis neco tezsiho.

Programovat dobre v Jave te nauci znalost jinych jazyku a stylu programovani. Muzu doporucit treba Haskell, ale uzitecny je treba i Lisp, Prolog, Smalltalk atd.

Samozrejme pred tim nez jsem zacal delat Javu jsem delal primarne v Pythonu, Ruby, JS, (Swift+ObjC protoze jsem zhnusen z *buntu utekl k osx, pac jsem byl liny udrzovat Gentoo a chtel jsem se zabyvat primarne vyvojem SW a ne sveho OS). Ale nejak mi unika souvislost J2EE, Springu a Prologu, Smalltalku...

Pak si myslim, ze si s tim delas zbytecnou hlavu. Ja mam za to, ze neexistuje vseobecne prijimana definice toho, co v Jave znamena programovat "slusne" - viz treba ty nekonecne diskuse o tom, jestli vubec dedicnost nebo OOP ma nejaky smysl. (Krome toho, je otazka, jestli to, co nekdo povazuje za slusny pristup, bude taky tobe pak vyhovovat.)

Ona takova definice neexistuje skoro v zadnem jazyce, vsude jsou ruzne pristupy, ktere nekomu pripadaji kontroverzni. Python se takove definici trochu blizi svym "Pythonic".

Mne osobne dnes treba vyhovuje FP pristup, takze bych v Jave programoval asi trochu abnormalne (kdybych musel). Co vidim, tak Javisti hodne daji prave na Design Patterns, coz mne naopak prijde jako zbytecna intelektualni onanie.

Takze nejlepsi je asi brat vsechno s rezervou a jit nejakou stredni cestou, mozna s obcasnym experimentalnim vystrelkem. To je ale dovednost, kterou se muzes naucit v jakemkoli jazyce, a v jakemkoli jinem ji okamzite pouzit.

ag

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #52 kdy: 23. 05. 2017, 10:10:22 »
Návrhové vzory používám i pro komunikaci s těmi začátečníky. Když mu řeknu, aby tuto část udělal přes Simple Factory a tuhle přes Observer, tak předpokládám, že mi rozumí. Pokud ne, musí si to nastudovat.

Pokud jste všichni začátečníci, tak je to asi fajn. Obvykle je lepší použít návrh problému, který se řeší. Těžko ti vzor něco sám vyřeší.

Jak chceš použít návrh problému, který se řeší, když ho ještě nemáš?

Problém mám a řešení se neví. Nepotřebuju tam lempla, kterému řeknu vzor. Podíváme se na to spolu a nebo to bude řešit sám. Ale místo pro vzory tam nikde nevidím.

Napr. taky Jake2 (port Quake2 do Javy) je podla vsetkeho uber-neslusny, pretoze su tam porusene vsetky zakladne principy "dobreho java programovania", t.j. encapsulacia cez gettery/settery, znasilnene staticke fieldy a metody, nazvy metod a fieldov (skoro ziaden CamelCase), pomaly ziadne asserty atd. Napriek tomu Jake2 funguje... Preco je ten kod taky hnusny? Pretoze je to port z C-cka a team, ktory ho portoval, si uvedomil, ze keby ho chceli portovat "pekne javovsky", tak pravdepodobne este dnes pisu iba gettery a settery a akurat by zacinali rozmyslat, kde by sa sikol singleton a kde nejaky ten visitor... takze sa na celu tu javovsku nomenklaturu vykaslali a vacsinu riesili automatizovane s nejakymi minimalnymi modifikaciami tak, aby to bolo aspon skompilovatelne.

Zapouzdření se dá elegantně dělat i bez *etterů. Stačí umět používat DI.

Metodu setColor() nahradí DI jak?

Mne osobne dnes treba vyhovuje FP pristup, takze bych v Jave programoval asi trochu abnormalne (kdybych musel). Co vidim, tak Javisti hodne daji prave na Design Patterns, coz mne naopak prijde jako zbytecna intelektualni onanie.

Právě ti, kteří moc vyvíjet neumí, protože za vzory se jde dobře schovat. Jako to dělá Kit tady. Místo, aby ti řekl, jak něco vyřešit, tak zablekotá tři vzory, k tomu přihodí tři banky, kde to viděl a konec debaty :D Za to nemůže ale Java, ale právě ty hloupé pozice v bankách, kde se neřeší reálný vývoj, ale hlavně ta administrace kolem. Výsledný projekt nikoho moc nezajímá. Čím více kódu, tím lépe. Je to přece drahé.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #53 kdy: 23. 05. 2017, 10:17:22 »
Zapouzdření se dá elegantně dělat i bez *etterů. Stačí umět používat DI.

Metodu setColor() nahradí DI jak?

Mne osobne dnes treba vyhovuje FP pristup, takze bych v Jave programoval asi trochu abnormalne (kdybych musel). Co vidim, tak Javisti hodne daji prave na Design Patterns, coz mne naopak prijde jako zbytecna intelektualni onanie.

Právě ti, kteří moc vyvíjet neumí, protože za vzory se jde dobře schovat.
To je ale prapůvodní účel vzorů (aspoň podle Knutha), umožnit jakž takž programovat i lidem, kteří to neumí ("how to program if you can't").

ag

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #54 kdy: 23. 05. 2017, 10:23:15 »
Wow, tak pak to funguje dobře :D I Kit tady si může hrát na programátora. Je ale otázkou, proč se to často používá jako filtr u Javy. Asi nehledají vývojáře...

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #55 kdy: 23. 05. 2017, 10:37:23 »
Wow, tak pak to funguje dobře :D I Kit tady si může hrát na programátora. Je ale otázkou, proč se to často používá jako filtr u Javy. Asi nehledají vývojáře...
Hledající není vývojář ;)

phi

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #56 kdy: 23. 05. 2017, 10:59:21 »
Právě ti, kteří moc vyvíjet neumí, protože za vzory se jde dobře schovat. Jako to dělá Kit tady. Místo, aby ti řekl, jak něco vyřešit, tak zablekotá tři vzory, k tomu přihodí tři banky, kde to viděl a konec debaty :D Za to nemůže ale Java, ale právě ty hloupé pozice v bankách, kde se neřeší reálný vývoj, ale hlavně ta administrace kolem. Výsledný projekt nikoho moc nezajímá. Čím více kódu, tím lépe. Je to přece drahé.
Sorry, ale v kolika bankach a jakych jste delal ? :D Banky neresi realny vyvoj ? Ale penize ji sverite, ne ? Nebo mate vsechno pod slamnikem ?
Banka neni e-shop a tomu odpovida infrastruktura. Realtime vyhledavani zprav pet dni nazpatek pri provozu jednotek mld zprav denne, monitoring tisicovek stroju, reporty regulatorum,  routovani a transformace zprav a generovani alertu pro mimoradne stavy (opet v jednotkach miliard denne), vse auditovatelne, vse s disaster recovery managementem. A to vse pokud mozno rychleji nez konkurence.  - TO je banka.
Takze kdyz nekdo zacne mlit o spatne urovni vyvoje v bankach, muzu si pomyslet jen to, ze nevi o cem mluvi.   

Kit

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #57 kdy: 23. 05. 2017, 11:06:04 »
Jak chceš použít návrh problému, který se řeší, když ho ještě nemáš?

Problém mám a řešení se neví. Nepotřebuju tam lempla, kterému řeknu vzor. Podíváme se na to spolu a nebo to bude řešit sám. Ale místo pro vzory tam nikde nevidím.

Problém se zpravidla dá rozdělit na podproblémy, které se dají pojmenovat podle vzorů. Řešení je pak snadné.

Zapouzdření se dá elegantně dělat i bez *etterů. Stačí umět používat DI.

Metodu setColor() nahradí DI jak?

Například tak, že tu barvu dáš do konstruktoru jako objekt. Máš ji pak dostupnou z daného objektu i z objektu, který ji vytvořil. Tím tu barvu hezky zapouzdříš.

ag

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #58 kdy: 23. 05. 2017, 11:46:49 »
Právě ti, kteří moc vyvíjet neumí, protože za vzory se jde dobře schovat. Jako to dělá Kit tady. Místo, aby ti řekl, jak něco vyřešit, tak zablekotá tři vzory, k tomu přihodí tři banky, kde to viděl a konec debaty :D Za to nemůže ale Java, ale právě ty hloupé pozice v bankách, kde se neřeší reálný vývoj, ale hlavně ta administrace kolem. Výsledný projekt nikoho moc nezajímá. Čím více kódu, tím lépe. Je to přece drahé.
Sorry, ale v kolika bankach a jakych jste delal ? :D Banky neresi realny vyvoj ? Ale penize ji sverite, ne ? Nebo mate vsechno pod slamnikem ?
Banka neni e-shop a tomu odpovida infrastruktura. Realtime vyhledavani zprav pet dni nazpatek pri provozu jednotek mld zprav denne, monitoring tisicovek stroju, reporty regulatorum,  routovani a transformace zprav a generovani alertu pro mimoradne stavy (opet v jednotkach miliard denne), vse auditovatelne, vse s disaster recovery managementem. A to vse pokud mozno rychleji nez konkurence.  - TO je banka.
Takze kdyz nekdo zacne mlit o spatne urovni vyvoje v bankach, muzu si pomyslet jen to, ze nevi o cem mluvi.

Problém je v tom, že většina funcí ve velkých bankách není v Javě. Jasně, nějaké trapné bankovnictví a tooly. Většina podstatných věcí jsou koupené krabice, které se akorát přes Javu propojí.

ag

Re:Jak se naučit slušně vyvíjet v Javě
« Odpověď #59 kdy: 23. 05. 2017, 11:50:26 »
Jak chceš použít návrh problému, který se řeší, když ho ještě nemáš?

Problém mám a řešení se neví. Nepotřebuju tam lempla, kterému řeknu vzor. Podíváme se na to spolu a nebo to bude řešit sám. Ale místo pro vzory tam nikde nevidím.

Problém se zpravidla dá rozdělit na podproblémy, které se dají pojmenovat podle vzorů. Řešení je pak snadné.

Zapouzdření se dá elegantně dělat i bez *etterů. Stačí umět používat DI.

Metodu setColor() nahradí DI jak?

Například tak, že tu barvu dáš do konstruktoru jako objekt. Máš ji pak dostupnou z daného objektu i z objektu, který ji vytvořil. Tím tu barvu hezky zapouzdříš.

Radši pojmenovávám problémy přesně a ne abych pro ně hledal nevhodné škatulky.

Takže kam mi utekl ten setter? Prostě chci nastavovat barvu a ty mi říkáš něco o konstruktoru :D