OOP jazyk - problém klasického stříhu

Kit

Re:OOP jazyk - problém klasického stříhu
« Odpověď #75 kdy: 08. 06. 2018, 11:52:02 »
Gettery neporusuji zapouzdreni, gettery nemohou modifikovat stav objetku.
Boilerplate getteru neni potreba psat, IDE na to ma generator - tento pristup pouzivam.
Pokud ma nekdo s gettery na spodku classy neprekonatelne potize, necht si to mavenu prida dependency na Lombok.

Getter samotný by zapouzdření neporušoval, kdyby ho nikdo nepoužíval. Jeho použitím dochází ke zpracování interních atributů mimo objekt, což zapouzdření porušuje.


...

Re:OOP jazyk - problém klasického stříhu
« Odpověď #76 kdy: 08. 06. 2018, 12:07:21 »
Jenže v PRAXI dpč, když budu chtít tohle dělat u trochu kompikovanějších tříd a vztahů, zabřednu opět do sraček. A ze všeho nejhorší na tom OOP je, že nad tím vším musí člověk přemýšlet a filozofovat, když přitom už to mohl mít dávno napsané.
Ještě větší problém je, když pak člověku takový projekt přistane na stůl s požadavkem změnit X a Y a dodělat Z. To pak opravdu bez přehánění většinu času stráví přemýšlením, jak to do toho zakomponovat, aby toho nemusel rozbíjet nebo předělávat příliš mnoho, ačkoli pokud jde o rozsah toho kódu, co má něco dělat, je to často jen pár řádků.

Tohle se prostě zvrhlo. Používají se jazyky, které o sobě tvrdí, že jsou objektové, ale ve skutečnosti nejsou, jsou strašně komplikované, nepřehledné, kód v nich je nepřehledný, obsahuje spoustu balastu, v němž se ta funkcionalita ztrácí a rozmělňuje. Lidi tu šermují s výrazy, že ani nevím, jestli mluvěj tak špatně anglicky nebo česky, pořádně se ani neshodnou na tom, co to znamená, ale nedá se říct, že by dnes vznikaly programy kvalitnější než před 30 lety. Fakt si říkám, že lidi by měli přestat vymýšlet p.čoviny a místo toho se konečně naučit programovat. Průměrný programátor z doby před 30 lety kdyby viděl tuhle diskusi, tak by většině věcí vůbec nerozuměl, ale věřím, že by konkrétní problém dokázal vyřešit rychleji a elegantněji i bez všech těch nesmyslů.

Jenže co je potom řešení. Viz javascript, ten OOP není a javascriptáři tam píšou procedurálně. Doteď jsem nenašel žádnou JS knihovnu komponent, která by šahala po kotníky třeba Primefaces nebo nějakému jinému komponentově orientovanému frontendovému frameworku (které se přestávají používat). Mají v tom strašný bordel, stáhneš si komponentu třeba Slider a ta nemá dokumentaci, nevíš co všechno přesně tomu můžeš nastavit, když rozklikneš kód není tam ani fň - nějaké parametry na jednom místě, s komentáři vo co go, to by chtěl člověk moc. Už je to tady takových 20 let, dělají se s tím weby - typická věc plná různých grafických klikátek - a ti blbci si nebyli schopni za tu dobu udělat unifikovanou, odokumentovanou knihovnu komponent. Twitterovský Bootstrap je sranda, tam žádné pořádné připravené komponenty nejsou a když s tím chce člověk dělat webovou aplikaci, tak good luck, musí si sehnat designera a kodéra, kteří mu ty potřebné komponenty udělají.

Teď je rok 2018 a já nemůžu sehnat pořádného fungujícího emailového klienta, který by uměl 2 věci: email a kalendář (kteý umí nějaký ten standardní protokol, co používá google). Zkoušel jsem Outlook, že by to mohla být kvalita, ale ten nepodporuje otevřený standard pro kalendář, který používá Google - jen uzavřený od Microsoftu. Navíc má různé absurdní bugy. Thuderbird ok, ale nemá kalendář. Tak jsem hledal, až jsem našel vyhlášený eM Client, který je placený. Stáhnul jsem si ho, dal jsem si tam účty a při komunikaci se zákazníkem jsem zjistil, že mi do Odeslaných jednou email uloží, jednou ne - takže nevím, jstli jsem to poslal nebo ne a musím otevířat webový gmail. DPČ ROK 2018 a člověk kuwa nemůže sehnat fungujícího emailového klienta s kalendářem!!! Hlavně že se vymýšlejí a dělají ty krávoviny typu webové aplikace a všichni si stěžují jak je sw vývoj drahý.

A to bych mohl pokračovat a už to bude fakt dost offtopic. Mohl bych mluvit o tom, jak nemůžu sehnat fungující šlapátka na kolo do 600,- Kč která by nešla za 1500km do kopru. Musel jsem si koupit šlapátka za 1400,- s vyměnitelnými průmyslovými ložisky. Prostě člověk chc takovou kravinu, co se vyrábí už X desítek let, a musí za to uvalit přes 1000,- aby to fungovalo jak má. Koupil jsem si značkovou bluetooth myš za 700,- a seká se ji kurzor - po čtení v recenzích prý běžná věc - myš nepoužitelná. Tachometr na kolo bluetooth za 600,- odešel po roce a nejtých 900km, navíc měl návrhové vady, že si nebyl schopný uložit napevno data, při výmně baterie se vše smaže. A mohl bych pokračovat a pokračovat.

Youda

Re:OOP jazyk - problém klasického stříhu
« Odpověď #77 kdy: 08. 06. 2018, 12:07:32 »
Gettery neporusuji zapouzdreni, gettery nemohou modifikovat stav objetku.
Boilerplate getteru neni potreba psat, IDE na to ma generator - tento pristup pouzivam.
Pokud ma nekdo s gettery na spodku classy neprekonatelne potize, necht si to mavenu prida dependency na Lombok.

Getter samotný by zapouzdření neporušoval, kdyby ho nikdo nepoužíval. Jeho použitím dochází ke zpracování interních atributů mimo objekt, což zapouzdření porušuje.

https://cs.m.wikipedia.org/wiki/Zapouzdření_(objektově_orientované_programování)

Mas tam dokonce exampl v jawe...

dustin

Re:OOP jazyk - problém klasického stříhu
« Odpověď #78 kdy: 08. 06. 2018, 12:31:28 »
Thuderbird ok, ale nemá kalendář.

https://support.mozilla.org/cs/products/thunderbird/calendar Nejsem žádný poweruser kalendáře, ale pro mé účely ten v TB postačuje... https://support.mozilla.org/cs/kb/pouzivani-lightningu-s-google-kalendarem

Kit

Re:OOP jazyk - problém klasického stříhu
« Odpověď #79 kdy: 08. 06. 2018, 12:38:39 »
Gettery neporusuji zapouzdreni, gettery nemohou modifikovat stav objetku.
Boilerplate getteru neni potreba psat, IDE na to ma generator - tento pristup pouzivam.
Pokud ma nekdo s gettery na spodku classy neprekonatelne potize, necht si to mavenu prida dependency na Lombok.

Getter samotný by zapouzdření neporušoval, kdyby ho nikdo nepoužíval. Jeho použitím dochází ke zpracování interních atributů mimo objekt, což zapouzdření porušuje.

https://cs.m.wikipedia.org/wiki/Zapouzdření_(objektově_orientované_programování)

Mas tam dokonce exampl v jawe...

To je jen Wiki...


Honza

Re:OOP jazyk - problém klasického stříhu
« Odpověď #80 kdy: 08. 06. 2018, 14:42:56 »
V pripade Usera je spravny pristup
UserRegistr.save(User)

S tímhle souhlasím, otázka tedy teď je, co je špatného na User.save()?

Hlavni myslenkou za OOP a proc se stal nejpouzivanejsim paradigmatem je pristup, ze defacto reflektuje/modeluje svet kolem nas, ktery se sklada z objektu, co vzajemne interaguji. Pak je program snadno uchopitelny a pochpotelny.

Aby ti to bylo jasnejsi, prejmenuj si User na KartotecniListekUsera (protoze presne o toto v danem okamziku jde) a vysledek bude
Knihovnik.zaloz(KartotecniListekUsera)
Kartotecni lustky, co samy skacou do kartoteky jsou v nasem vesmiru mene obvykle.
A naopak, az budes psat simulacni sw simulujici chovani lidi-Useru, pojmenuj si tridu PersonRoleUser a pak je logicky namiste volani PersonRoleUser.skocDoZdi()

Zpet k Userovi, v realu mam nejaky JSF backing bean, ktery ma metodu userChangeSubmitBttnClicked(), to je iniciator. V pripade vyse popsaneho spatneho navrhu, pak musi iniciator invokovat User, aby neco proved. Nenni jediny duvod proc. Navic to vede k prasecinam typu, ze kdyz mi iniciator pteda jenom cast parametru, treba userId a heslo pri changepass, musim vyrobit nekonzistentni poloprazdny objetkt User a na nem zavolat changePass() Nebo zbytecne vytahovat z DB kompletni instanci User, abych ty data k nicemu nepouzil.
Vůbec nerozumím tomu, jak metodou UserRegistr.save(User) vyřeším situaci, kdy nemám k dispozici příslušnou instanci User... navíc je to podezřelé, kam se ta instance ztratí?

No predsa User.Load().
ma to byt na userovi staticky? Alebo konstruktorom vytvoris Usera, ktory sa neda pouzit? Ci ma byt metoda Load niekde inde ako Save?

IMHO som rad ze som Active Record uz davno opustil.
Ne staticky, ne pro save(), ale umím si představit staticky loadFrom(odkud). A proč by se nedal použít User z konstruktoru? To se dá přece napsat na několik způsobů, v jednom to půjde, ve druhém ne...
O ActiveRecord tady nemluvíme, a User.Load() je samozřejmě také něco jiného. Když už, tak User.loadFrom(...).

Opravdu mě jenom zajímá, co je špatně na tom save().


anonym

Re:OOP jazyk - problém klasického stříhu
« Odpověď #81 kdy: 08. 06. 2018, 15:37:02 »
Ono mám třeba nějaký integrovaný obvod a ten má uvnitř stav, což je docela běžné. Třeba Procesor. Ale podobjekty toho procesoru už stav určitě ne vždy mají, taky tam bude převažovat rozdělení na zpracovávající mechanismus a bokem uložená data. Např. HashTable, asi by nikdo nechtěl, abych s tím pracovali tak, že bude HashTable zvlášť jako čistě struktura a nějaké HashTableXYZUtils jako mechanismus práce. Takže ono v určitém bodě není špatné sloučit dohromady data a metody a zapouzdřit. Ale nesmí se to přehánět, rozhodně ne dělat z toho pravidlo.

anonym

Re:OOP jazyk - problém klasického stříhu
« Odpověď #82 kdy: 08. 06. 2018, 15:42:36 »
Ono mám třeba nějaký integrovaný obvod a ten má uvnitř stav, což je docela běžné. Třeba Procesor. Ale podobjekty toho procesoru už stav určitě ne vždy mají, taky tam bude převažovat rozdělení na zpracovávající mechanismus a bokem uložená data. Např. HashTable, asi by nikdo nechtěl, abych s tím pracovali tak, že bude HashTable zvlášť jako čistě struktura a nějaké HashTableXYZUtils jako mechanismus práce. Takže ono v určitém bodě není špatné sloučit dohromady data a metody a zapouzdřit. Ale nesmí se to přehánět, rozhodně ne dělat z toho pravidlo.

Mimochodem mít zvlášť datovou strukturu a utility pro práci s ní není vůbec špatné, kdybych měl takto rozdělené HashTable na nějaké POJO a Util, můžu si to POJO uložit zvlášť, nasadit na něj třeba trochu jinačí typ Util, uložit ho na disk atp. Takže ono by to taky nebylo špatné, je to přehlednější a toho se člověk snaží docílit, když něco programuje.

Když dělate ve Springu a máte to rozdělené na data a mechanismus, taky to nakonec zabalíte do zapouzdřeného balíku, který vystavuje REST API. A ten celý balík má stav a public metody nad tím stavem, které tvoří to API. A tohle se dělá už celé dekády, viz konzolové aplikace.

Re:OOP jazyk - problém klasického stříhu
« Odpověď #83 kdy: 08. 06. 2018, 15:52:23 »

Jenže co je potom řešení. Viz javascript, ten OOP není a javascriptáři tam píšou procedurálně. Doteď jsem nenašel žádnou JS knihovnu komponent, která by šahala po kotníky třeba Primefaces nebo nějakému jinému komponentově orientovanému frontendovému frameworku (které se přestávají používat).
https://www.primefaces.org/#primeng
https://www.primefaces.org/#primereact

Už je to tady takových 20 let, dělají se s tím weby - typická věc plná různých grafických klikátek - a ti blbci si nebyli schopni za tu dobu udělat unifikovanou, odokumentovanou knihovnu komponent.
Taky delas weby? Jak dlouho? Uz si udelal takovou knihovnu? Nebo se hrde hlasis k tem blbcum co toho nejsou schopni?

Teď je rok 2018 a já nemůžu sehnat pořádného fungujícího emailového klienta, který by uměl 2 věci: email a kalendář (kteý umí nějaký ten standardní protokol, co používá google). Zkoušel jsem Outlook, že by to mohla být kvalita, ale ten nepodporuje otevřený standard pro kalendář, který používá Google - jen uzavřený od Microsoftu. Navíc má různé absurdní bugy. Thuderbird ok, ale nemá kalendář. Tak jsem hledal, až jsem našel vyhlášený eM Client, který je placený. Stáhnul jsem si ho, dal jsem si tam účty a při komunikaci se zákazníkem jsem zjistil, že mi do Odeslaných jednou email uloží, jednou ne - takže nevím, jstli jsem to poslal nebo ne a musím otevířat webový gmail. DPČ ROK 2018 a člověk kuwa nemůže sehnat fungujícího emailového klienta s kalendářem!!! Hlavně že se vymýšlejí a dělají ty krávoviny typu webové aplikace a všichni si stěžují jak je sw vývoj drahý.
Proc ho nenapises? Jsi prece programator nebo ne?

A to bych mohl pokračovat a už to bude fakt dost offtopic. Mohl bych mluvit o tom, jak nemůžu sehnat fungující šlapátka na kolo do 600,- Kč která by nešla za 1500km do kopru. Musel jsem si koupit šlapátka za 1400,- s vyměnitelnými průmyslovými ložisky. Prostě člověk chc takovou kravinu, co se vyrábí už X desítek let, a musí za to uvalit přes 1000,- aby to fungovalo jak má. Koupil jsem si značkovou bluetooth myš za 700,- a seká se ji kurzor - po čtení v recenzích prý běžná věc - myš nepoužitelná. Tachometr na kolo bluetooth za 600,- odešel po roce a nejtých 900km, navíc měl návrhové vady, že si nebyl schopný uložit napevno data, při výmně baterie se vše smaže. A mohl bych pokračovat a pokračovat.
Tady souhlasim. Pricinou je marketing.

kapes

Re:OOP jazyk - problém klasického stříhu
« Odpověď #84 kdy: 08. 06. 2018, 20:12:07 »
Neni dobre sa držat dogiem.

Hrať sa na čisté objekty a/alebo čisté FP. Vždy použi to čo sa ti v konkrétnej situácii najviac hodí. Veď preto sú dnešné jazyky multiparadigmatické a jazyky ktoré sa držali striktne objektovej paradigmy (smalltalk, ruby) skončili na smetisku dejín.

OOP je dobrý sluha ale zlý pán... keď ti OOP prácu zjednodušuje drž sa ho, ale beda akonáhle ti OOP začne komplikovať život použi kludne aj anemické objekty...

Že to neni čisté OOP?

Sral to pes.

Kit

Re:OOP jazyk - problém klasického stříhu
« Odpověď #85 kdy: 08. 06. 2018, 21:40:33 »
OOP je dobrý sluha ale zlý pán... keď ti OOP prácu zjednodušuje drž sa ho, ale beda akonáhle ti OOP začne komplikovať život použi kludne aj anemické objekty...

Že to neni čisté OOP?

Sral to pes.

Jistě, v OOP klidně používám i lambdy, protože je to jednodušší a přehlednější, než nějaké cykly nebo řetězené ify s fuj elseif a else. Anemickým objektům se vyhýbám, neboť to programování komplikují, místo aby zjednodušovaly. To už raději použiji strukturu, u které nemusím blbnout s accesory a přitom si svůj obsah chrání. Však Messenger je také vzor.

OOP se mi však osvědčilo, protože se píše snáze a výsledek je přehlednější, udržovatelnější a rychlejší než špagety. Z podobných důvodů si mnozí oblíbili FP a nemám jim to za zlé. Struktury pro data používají také a říkají jim monády.

Re:OOP jazyk - problém klasického stříhu
« Odpověď #86 kdy: 08. 06. 2018, 22:06:39 »
...

Sice souhlasím s Tebou nastíněným kanonickým řešením, jenže debata je tu o tom, jaký je rozdíl mezi

  • User.save()
  • Lopata.priloz(Uhli)
Rozdil je zrejmy a trivialni.
Lopata je vykonny @Controller, ktery sibuje s hlopou @Entitou Uhli. Ostane proto Spring tak tyto anotace pojmenoval.

V pripade Usera je spravny pristup
UserRegistr.save(User)

Anebo, pro jeste snazsi pochopeni
Noha.nakopni(zadek), tady je hned jasne, ze zadek.nakopniSe(Nohou) je blbost.

Pri objektovem navrhu je proste nutno v danem co je iniciatorem akce a co je objektem (ne v OOP smyslu) teto akce.
A OOP objekt muze klidne v ruznem kontextu zastavat obe role
Ridic.natoc(Volant)
Volant.natoc(Kola)

Tohle jsou trivialni zaklady objektove dekompozice.
Mno objekty jsou oba, ten vas "actor" i ty "tupa data" - a i ty zamozrejme "neco umi" - umi encapsulovane drzet data a pripadne generovat pohledy na jejich interni data.
"actoru" se v terminologii springu rika @Component, ktery se podle pouziti deli na @Controller, @Service a @Repository. Mezi nimi pobihaji proste POJOs, pripadne ORM entity, pripadne jejich kolekce.

A z toho je vidět, že

  • Spring skutečně nemá s „původním“ OOP moc společného
  • Spring sice poskytne ty chlívečky @Controller, @Service, ..., ale rozdělit objekty do nich a udělat právě tu kompozici musí programátor sám => moc z původní otázky Spring sám o sobě neřeší
  • jestli je Lopata actor nebo entita se nedá bez znalosti kontextu říct (jak sám potvrzujete)

Takže se tady nevymýšlí kolo, jen jsme se k té kompozici zatím vůbec nedostali. Nějaký zdroj, jak právně komponovat? „Správně“ samozřejmě v kontextu daného paradigmatu nebo programátorského stylu. Tím bychom se teprve začali věnovat původní tazatelově otázce, IMHO.

Gődel

Re:OOP jazyk - problém klasického stříhu
« Odpověď #87 kdy: 08. 06. 2018, 22:17:14 »
Z podobných důvodů si mnozí oblíbili FP a nemám jim to za zlé. Struktury pro data používají také a říkají jim monády.
Monády nejsou struktury pro data, ale řetězení výpočtu.

Re:OOP jazyk - problém klasického stříhu
« Odpověď #88 kdy: 08. 06. 2018, 22:17:29 »
...

...jinými slovy ty chlívečky jsou triviální ale ta kompozice až tolik ne (alespoň v problémech reálných aplikací).

BoneFlute

  • *****
  • 2 066
    • Zobrazit profil
Re:OOP jazyk - problém klasického stříhu
« Odpověď #89 kdy: 11. 06. 2018, 15:09:15 »
Getter samotný by zapouzdření neporušoval, kdyby ho nikdo nepoužíval. Jeho použitím dochází ke zpracování interních atributů mimo objekt, což zapouzdření porušuje.

Kód: [Vybrat]
print "foo: " + d.getFoo()

Zde neprobíhá žádné zpracování interních atributů mimo objekt.

Kód: [Vybrat]
class Boo:
    private x, y
    getXoo():
        return this.x * this.y

Ani zde neprobíhá žádné zpracování interních atributů mimo objekt.


(Teoreticky by mohlo, ale docela by mě zajímalo, zda o tom víš, nebo máš jen zažranou svou představu o vztahu getter a interní atribut.)