Dědičnost dnes

n

Re:Dědičnost dnes
« Odpověď #30 kdy: 16. 01. 2017, 09:55:31 »
Citace od: Kit kdy 16. 01. 2017, 09:31:35
Citace od: balki kdy 16. 01. 2017, 09:20:32
Dedicnost je dobra a nepouziva sa na redukciu opakovania kodu. (aj ked k redukcii opakovania kodu moze dojst, ak je to tak spravne)  Staci taketo vyjadrenie?

Ano, stačí.

Začátky chybného uvažování je již ve špatných učebnicích, ve kterých jsou nesmysly typu "B extends A" nebo "Bar extends Foo". Přitom ani v jednom případě to neplatí. Chudák čtenář si pak myslí, že se dědičnost používá na redukci opakování kódu a už se veze po špatné koleji.

Tojo, vizualne uz na prvni pohled to je blbe, ale doufam, ze snad ve vsech ucebnicich nekolikrat zdurazni tu zakladni, nutnout podminku cos psal vyse.


jpu

Re:Dědičnost dnes
« Odpověď #31 kdy: 16. 01. 2017, 10:04:54 »
dedicnost bezne pouzivam napr. (C#):

public class ViewModelBase : INotifyPropertyChanged
{
    public void NotifyPropertyChanged ....

}

public class CustomerViewModel : ViewModelBase
{
}


Citaceinheritance hierarchy represents an "is-a" relationship and not a "has-a" relationship

Kit

Re:Dědičnost dnes
« Odpověď #32 kdy: 16. 01. 2017, 10:13:45 »
Citace od: n kdy 16. 01. 2017, 09:55:31
Citace od: Kit kdy 16. 01. 2017, 09:31:35
Začátky chybného uvažování je již ve špatných učebnicích, ve kterých jsou nesmysly typu "B extends A" nebo "Bar extends Foo". Přitom ani v jednom případě to neplatí. Chudák čtenář si pak myslí, že se dědičnost používá na redukci opakování kódu a už se veze po špatné koleji.

Tojo, vizualne uz na prvni pohled to je blbe, ale doufam, ze snad ve vsech ucebnicich nekolikrat zdurazni tu zakladni, nutnout podminku cos psal vyse.

Je také nutné si uvědomit, jak se takové učebnice čtou. Čtenář se začte do zdrojového kódu, protože je hezky vyznačen, ale tu důležitou "omáčku kolem" si buď nepřečte, anebo přečte a nepochopí. V hlavě mu pak zbude jen ten nepovedený příklad s tím, že to snad pochopí později.

Ukázkovým příkladem chybného pochopení dědičnosti je pak třeba známý "Cyklista extends Žába", který nepopisuje cyklistu, který umí skákat, ale žábu, která umí jezdit na kole. A takových "žab" bývají bohužel plné zdrojáky.

dustin

Re:Dědičnost dnes
« Odpověď #33 kdy: 16. 01. 2017, 10:28:38 »
Jo, na příklady Foo a Bar jsem také alergický (nejen v ukázkách dědičnosti), daleko užitečnější by bylo používat reálné příklady. Ale nemyslím si, že by rozumný vývojář nepochopil, že jde o "is a" a ne o "has a".

karel

Re:Dědičnost dnes
« Odpověď #34 kdy: 16. 01. 2017, 11:54:23 »
Většině diskutujících uniká je, že dědičnost v jazycích jako Java, C++ apod. representuje vlastně 3 koncepty. Je to dědění dat (většinou nechci, porušuje zapouzdření, lepší je použít skládání), dědění chování (většinou nechci, vede k fragile base class a porušuje zapouzdření), definice rozhraní(většinou chci, pomáhá k využití polymorfismu, pomáhá strukturovat kód - neprogramuju proti implementaci). Interface je dokonce často oddělen od dědičnosti - Java, C#.

Podle mě OOP jazyk vůbec nemusí umožňovat dědit data a chování a přesto se v tom bude dobře programovat bez duplikování kódu. Protože často ani "is a" neznamená, že je správné použít dědění ve smyslu dědění chování nebo dat a jde mi jen o interface. Každý asi zažil šílené hierarchie dědění, kde pomalu každá metoda volá nejdřív implementaci předka nebo kvanta protected atributů, co se ve většině tříd nikdy nepoužijí nebo se přes ně předávají argumenty funkce, ale ani jedno nejde rychle opravit bez rozbití poloviny systému.

IMHO podle mě pro objektové programování je nejdůležitější programovat proti rozhraní, dodržovat zapouzdření a každá třída musí mít jenom jednu roli (signle responsibility). Pokud tohle dodržuju, dědičnost (nepočítám implementaci interface) mi z programu z velké části zmizí a spíš slouží k modelování dat než k deduplikaci kódu.


SB

Re:Dědičnost dnes
« Odpověď #35 kdy: 16. 01. 2017, 12:08:25 »
Citace od: phpmág kdy 15. 01. 2017, 17:52:24
Používáte dnes v OOP často dědičnost? Není ta doba už pryč?

Dědičnost nemá co dělat s dobou či módou, je to technologická záležitost! Podle módy programují lempli.

Citace od: phpmág kdy 15. 01. 2017, 17:52:24
Stále narážím na lidi, kteří milují dědičnost a používají ji třeba i na to, aby kód neměli duplicitní.

Dědičnost vznikla jako prostředek k odstranění duplicity kódu, jinak byste musel všechny specializované třídy řešit téměř kompletním přepisem. Jde to, ale porušuje to DRY, přidělává práci a je náchylné k chybám. (Pro rýpaly: Delegování dědičnost nenahrazuje, protože funguje jinak.)
Později ji začaly některé jazyky (s typovým polymorfismem - Java, ...) používat pro dosažení polymorfismu.

Citace od: phpmág kdy 15. 01. 2017, 17:52:24
Chápu ještě využití polymorfismu, ale to není až tak časté.

Polymorfismus je jen nástrojem, je logické, že když jej vývojáři nezvládají, tak se s ním nesetkáte.

Citace od: phpmág kdy 15. 01. 2017, 17:52:24
Ale celkově to moc dnes nedává smysl...

Jak to myslíte? Ono se něco změnilo?

Re:Dědičnost dnes
« Odpověď #36 kdy: 16. 01. 2017, 12:15:59 »
Citace od: SB kdy 16. 01. 2017, 12:08:25
Citace od: phpmág kdy 15. 01. 2017, 17:52:24
Používáte dnes v OOP často dědičnost? Není ta doba už pryč?

Dědičnost nemá co dělat s dobou či módou, je to technologická záležitost! Podle módy programují lempli.


To je moc hezka teorie. Ale i kdyz jsi byl machr pred dvaceti lety, tak jsi proste programoval jinak nez machr dneska. A neni to zdaleka jenom tim, ze machr dneska ma k ruce jine IDE a jine jazyky.

Pokud tomu nechces rikat "moda", tak zkus trebas neutralnejsi "kultura".

Kit

Re:Dědičnost dnes
« Odpověď #37 kdy: 16. 01. 2017, 12:18:00 »
Citace od: karel kdy 16. 01. 2017, 11:54:23
Každý asi zažil šílené hierarchie dědění, kde pomalu každá metoda volá nejdřív implementaci předka nebo kvanta protected atributů, co se ve většině tříd nikdy nepoužijí nebo se přes ně předávají argumenty funkce, ale ani jedno nejde rychle opravit bez rozbití poloviny systému.

Někdo ještě používá protected atributy? Měly by být všechny privátní.

SB

Re:Dědičnost dnes
« Odpověď #38 kdy: 16. 01. 2017, 12:19:18 »
Citace od: phpmág kdy 15. 01. 2017, 18:28:36
... Prostě třeba před 20 lety to bylo celkem cool a dost se to používalo. Dnes se ví, že dědičnost je spíše zlo, tak jsem chtěl vědět, jestli pro ní někdo nemá nějaké nové a dobré využítí.

Znovu: Dědičnost není věcí módy, použití dědičnosti je v OOP poměrně přesně určeno, podstata a využití je stále stejné.

Citace od: phpmág kdy 15. 01. 2017, 18:28:36
Máme plno nových jazyků a přístupů, takže všechno se dost mění.

Buďte klidný, na podstatě a účelu OOP se nic nezměnilo.

Citace od: phpmág kdy 15. 01. 2017, 18:28:36
Utility class je také zlo, ne?

To je taková ta funkční třída? To je pochopitelně koncepční chyba, protože její metody patří jinam, ale někdy se jí nedá vyhnout vzhedem k chybějící funkcionalitě existujících tříd.

Citace od: phpmág kdy 15. 01. 2017, 18:28:36
Tak jasný, v patternech je jí plno, ale je otázkou, jestli jsou ty patterny dnes dobré.

Některé vzory jsou poplatné jazykům, pro které vznikly, ale obecně dokud se nemění principy, vzory zůstávají.

SB

Re:Dědičnost dnes
« Odpověď #39 kdy: 16. 01. 2017, 12:22:27 »
Citace od: gll kdy 15. 01. 2017, 18:55:18
Problém je používání pevných typů namísto rozhraní. K tomu dědičnost svádí.

Jak může dědičnost svádět k záměně za rozhraní???

SB

Re:Dědičnost dnes
« Odpověď #40 kdy: 16. 01. 2017, 12:25:26 »
Citace od: anonym kdy 15. 01. 2017, 18:59:29
Jestli používáš OOP a nepoužíváš dědičnost, tak tvoje znalost OOP busí být opravdu bídná.

Jsou objektové jazyky, ve kterých se bez dědičnosti obejdete, nebo které ji nemají.

Tomáš Roll

Re:Dědičnost dnes
« Odpověď #41 kdy: 16. 01. 2017, 12:29:11 »
Citace od: SB kdy 16. 01. 2017, 12:25:26
Citace od: anonym kdy 15. 01. 2017, 18:59:29
Jestli používáš OOP a nepoužíváš dědičnost, tak tvoje znalost OOP busí být opravdu bídná.

Jsou objektové jazyky, ve kterých se bez dědičnosti obejdete, nebo které ji nemají.

A taky existuje Brainfuck

SB

Re:Dědičnost dnes
« Odpověď #42 kdy: 16. 01. 2017, 12:32:26 »
Citace od: zboj kdy 15. 01. 2017, 19:03:53
V některých jazycích je dědičnost takové "nutné zlo", ale dá se jí vyhnout (a je to žádoucí), viz např. Go. Pokud někdo "miluje" dědičnost, není moc dobrý vývojář.
Např. v Javě jsou knihovny dost mizerně navržené, takže se všude dědí, naopak např. v ObjC (Cocoa) se používají převážně rozhraní a shluky tříd, což je mnohem lepší v mnoha ohledech (dědičnost je jen u tříd pro GUI a měnitelných kolekcích).

On obecně vývojář, který má citový vztah k technologiím, asi nebude v pořádku.
Jak nahrazuje rozhraní dědičnost?

karel

Re:Dědičnost dnes
« Odpověď #43 kdy: 16. 01. 2017, 12:42:08 »
Citace od: Kit kdy 16. 01. 2017, 12:18:00
Citace od: karel kdy 16. 01. 2017, 11:54:23
Každý asi zažil šílené hierarchie dědění, kde pomalu každá metoda volá nejdřív implementaci předka nebo kvanta protected atributů, co se ve většině tříd nikdy nepoužijí nebo se přes ně předávají argumenty funkce, ale ani jedno nejde rychle opravit bez rozbití poloviny systému.

Někdo ještě používá protected atributy? Měly by být všechny privátní.
Souhlas a tady se nabízí otázka, když je ta třída správně zapouzdřená opravdu z ní potom chci dědit? IMHO nechci a je lepší použít skládání.

SB

Re:Dědičnost dnes
« Odpověď #44 kdy: 16. 01. 2017, 12:54:17 »
Citace od: balki kdy 16. 01. 2017, 08:32:38
...Osobne riesim duplicitu kodu bud delegaciou, alebo worker objectom, teraz k tomu pribudli aj funkcie...

Jak se řeší vnitřní funkcionalita objektu delegací, workerem či funkcí?