Kiwi povídá píčoviny. Asi zažil první semestr na škole a je z toho úplně mimo
To spíš vy mi připadáte jako děcka s mlíkem na bradě, co v životě nemusela přidávat nějakou funkcionalitu do existujícího projektu, protože zatím si jen patlala párřádkové školní projektíky jakožto one-man-show from scratch.
Takže ještě jednou:
1.
Netvrdím, že chování, kdy změním A, ale pod rukama se mi změní i B, je optimální. Takto bych to já nejspíš nenavrhnul, kdyby to bylo na mně. Jenže většina mých zkušeností plyne z praktického života, v němž přijdete k existující věci, která je
málokdy navržená optimálně.
2. Pokud někdo navrhne třídu "obdélník" jakožto třídu
měnitelných objektů, z níž je navíc
dovoleno odvozovat podtřídy, tak je třeba se srovnat s tím, že někdo může potřebovat čtverec jako speciální případ obdélníku, a tedy s výše popsaným "záhadným" chováním setSideA, setSideB; nemusí to končit čtvercem; další bude potřebovat zlatý obdélník (tedy se stranami v poměru zlatého řezu) a nakonec přijde někdo, kdo bude chtít modrý obdélník (dopad na chování v případě poslání zprávy setColor takovému objektu tu doufám nemusím rozebírat). Znovu zdůrazňuji, že
netvrdím, že takto udělaný program je optimálně navržený. Nejspíš by to byl jen jeden z mnoha návrhů, kdybych opět kroutil hlavou, točil oči v sloup a ptal se sám sebe "pro boha, proč takhle", ovšem bez znalosti konkrétního kontextu těžko soudit.
Ale:3. Pokud někdo další bude
takto navržený program dále rozvíjet s
předpokladem, že přece setSideA
nemůže mít za žádných okolností vliv na druhou stranu, nebo že setColor
zaručeně povede ke změně barvy na požadovanou, tak veškerou nešikovnost původního návrhu povýší na kvadrát. Protože tak přidá další nadbytečné vazby na úrovni, na níž je nikdo při návrhu nepředpokládal. A kvůli tomuto jeho redundantnímu předpokladu, kterým se mu
možná, někde, něco trochu zjednodušilo, se další věci
velmi zkomplikují. Stačí, aby obdélník byla netriviální třída, a z přidání triviálního čtverce se stane noční můra jen kvůli tomu, že zas někdo "myslel" a místo aby se obdélníka explicitně dotázal na jeho vlastnosti, jak se sluší a patří, tak si myslí, že si je spočítá lépe než on sám. Což rozhodně
je bezprecedentní porušení principu zapouzdření!
A mimochodem to, že
objekt reaguje na zprávu podle svého uvážení, je jedním ze základních pilířů objektově orientovaného programování. Proto se tomu taky neříká procedura. To nebyl jen nějaký terminologický fetiš otců-zakladatelů OOP. Různé objekty mohou na stejnou zprávu reagovat různě. Stejný objekt může na stejnou zprávu za různých okolností reagovat různě. Pošlete třídě GeometrickýÚtvar zprávu
new #rectangle withA: 10 withB: 10 a obdržíte objekt třídy čtverec (například z důvodu optimalizace). Pošlete mu zprávu
setSideB: 20, které samozřejmě čtverec nebude rozumět, tak ji deleguje o úroveň výš, kde se rozhodne o změně třídy na obdélník. To všechno transparentně. A právě o tomto a jiných podobných obratech je objektové programování, má-li to doopravdy ulehčovat práci. A ne o tom, že nacpu funkce a proměnné do tříd a budu dědit do bezvědomí.