Diskuze: Chyba
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Můžeš nám poslat zdrojový kód se zvýrazněným řádkem, kde je chyba?
Mohl by jsi sem alespoň poslat kód a říci jak jsi chybu vyřešil? Teď je toto vlákno naprosto zbytečné. Poděl se s uživateli, když někdo bude řešit stejný problém, tak jej odkážeš na toto vlákno...
Když píšu v PHPčku a používám jen editor, taky se mi občas stane, že
mi někde přebývá nebo chybí závorka.
Ale VS tohle krásně zobrazuje (dáš kurzor k závorce a on ukáže, kterou
závorkou končí a kterou začíná) a vypisuje chyby, takže tady to hned
odladíš
Hlídání párovosti závorek má dnes už asi většina používaných editorů. Například v Lispu by se bez toho už asi nedalo programovat.
David spíš myslel, že IDE ti zařve (protože tomu jazyku rozumí). Editor ti sice pomůže závorky párovat, ale sám tě neupozorní nebo jsem to alespoň neviděl.
Mimochodem, v čem píšeš PHP?
Já jsem si to myslel, že máš Vim Já teď zkoušel NetBeans, v PHP jsem v něm ještě nedělal, ale funguje to docela hezky.
Mně se na těchto IDE nelíbí, že jsou hrozně pomalá. Než se projekt otevře, trvá to celou věčnost. Také jsem na nich pochopil, proč někomu vadí i jen několik set souborů v jednom adresáři. Než se to nalistuje...
Z podobných důvodů jsem přestal používat jinak skvělý program Freemind.
Jak jsem si ověřil, Java není pomalá. Pomalé jsou pouze chybně napsané aplikace. Když se dívám na aktuální programátorské poklesky, které se i vyučují, tak se ani nedivím.
Ono je toho víc, ovšem začíná to jednořádkovými gettery a settery. Pokračuje to používáním nevhodných knihoven (například pro umocňování na druhou) a nedodělanými metodami uvnitř tříd. Prostě z objektů se dělá jen pouhé datové skladiště s chybnou delegací funkčnosti.
Zjednodušeně: Pokud je objektem pes, nechci vědět, jak štěká, ale chci, aby zaštěkal.
Jednoduše. Proč se ptám objektu na nějakou vlastnost? protože ji chci použít k nějakému účelu, do nějakého výrazu. Tak ten výraz dám jako další metodu do objektu. Tam už s tou proměnnou zacházím lokálně.
Vznikne vlastně getter, ale už to není ten primitivní zdržující getter. Objekt pak má mnohem lepší funkčnost, jeho volání je mnohem jednodušší a aplikace přehlednější.
To stejné se settery. Většinou si vystačím s parametry konstruktoru, ale typický příklad
objekt.setX(x);
objekt.setY(y);
nahrazuji kratším zápisem.
objekt.setXY(x,y);
Samozřejmě musím napsat další setter, ale ten mě tolik netrápí, jako neustálé volání dvou metod za sebou. Klidně tomu setteru svěřím i parsování stringu a další neošetřená data. Setter si je musí sám ošetřit, zpracovat a uložit do svých vnitřních struktur.
Zjednodušeně řečeno na jednom objektu nikdy nevolám 2 settery za sebou a ani 2 gettery za sebou. Neošetřuji vstupní data a ani dále nemodifikuji výstupní data. To vše je v kompetenci objektu.
To nepochybně, ale občas se getteru stejně nevyhneš. Nemůžeš např. stále modifikovat jeden objekt, protože ho chceš použít jiným způsobem, to bys porušoval komponentový koncept OOP. Objekt by měl být do určité míry univerzální.
Objekt není datové skladiště. Co si představuješ pod pojmem "univerzální"? Univerzální prostředek neexistuje a pokud se budeš snažit dělat univerzální objekty, vznikne paskvil.
Doplňováním dalších metod do objektu koncept OOP rozhodně neporušuji.
Objekt by se měl specializovat na jednu věc a tu umět dobře. Pokud ti
rozumím správně, kdykoli budeš potřebovat např. nový vzorec, tak ho
přidáš do toho objektu do metody. Tím pádem podle usecase stále ohýbáš
objekt a to imho není správné. Objekt by měl být znovupoužitelný a mít
jasně definovanou kompetenci, když chci něco nad jeho kompetenci, napíši si
to mimo a použiji nějaký jeho getter. Jedině by to šlo zdědit, ale stejně
mi připadá špatné zanášet do objektu logiku, která s ním přímo
nesouvisí.
Např. si nemyslím, že do objektu autobus patří vzorec pro výpočet
nákladů firmy na benzín, to raději udělám getter na spotřebu a třídu,
která bude mít v kompetenci výpočty. Autobus jinak nebude znovupoužitelný,
protože bude specializovaný na jednu konkrétní firmu. Nebudu ho moci
použít v jiném projektu, kde třeba budou chtít počítat zas něco jiného.
Jedině ho mohu zdědit, ale stejně mi přijde výhodné mít výpočetní
logiku na jednom místě, ve třídě, která je za ni kompetentní.
Jenže když potřebuješ nový vzorec, stejně měníš usecase. Neohýbám, přidávám. Dávám do objektu jen logiku, která s ním přímo souvisí. Pokud je objektem obdélník, může mi poskytnout i svůj obvod a obsah. Totéž s kruhem. Nemusím zjišťovat typ objektu a přesto získám jeho obsah.
Argument znovupoužitelnosti mi zní úplně stejně jako předčasná optimalizace. Když se to přežene, vede to do pekel.
Budeš potřebovat spočítat, kolik se do obdelníku vejde jablek. Opravdu je za toto kompetentní obdelník?
Já si myslím, že pravda je někde uprostřed, ty extrémně přetěžuješ objekty.
Teď jsi mě dostal. Opravdu jsem to tak málem udělal, když jsem potřeboval zjistit vzdálenost dvou objektů. Nakonec jsem udělal kompromis ve stylu
vzdalenost(objekt1.getXY(),objekt2.getXY())
a to snad bude ta pravda někde uprostřed.
Zobrazeno 23 zpráv z 23.