Diskuze: Problémy s pointery

C++ C a C++ Problémy s pointery

Avatar
Lukáš Hruda (Luckin):

Problémy s pointery v C++ jsou dost individuální, někdo s tím problémy má, někdo ne, někdo má zase problémy s něčím jiným, záleží co ti vyhovuje, podle toho volíš jazyk... :)

 
Odpovědět 18.10.2012 13:16
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

S tím nesouhlasím, existuje určitá pravděpodobnost, že programátor udělá chybu. Programátor je totiž člověk. Ta se samozřejmě zvyšuje s náročností projektu. Záleží na jazyku, jak se tato chyba projeví, managed jazyk na ni upozorní, unmanaged ne a hledá se to dost blbě, vesměs metodou pokus/omyl.

Nahoru Odpovědět 18.10.2012 18:01
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Já neprogramuju v ničem jinym než v C++, zkoušel sem i jiný jazyky ale žádnej mi nevyhovoval... nevim jak v klasickym C, protože v něm sem nikdy nic většího nepsal ale v C++ sem se správou paměti nikdy neměl moc problém. Taková chyba ve správě paměti aby ti kvuli tomu program padal se ti nestane pokud si dáváš pozor a když se stane, najít jí většinou neni zase takovej problém... Může se stát že někde zapomeneš dealokovat pár bytů ale garbage collector taky v paměti nějaký místo zabírat musí takže myslim že je jedno jestli zapomeneš pár bytů sám nebo ti pár bytu v paměti zabírá GC... nehledě na to že v C++ si na všechny důležitý věci který potřebujou dynamickou paměť můžeš napsat knihovnu ve který to vyřešíš, otestuješ a dál se u tý věci o správu paměti nemusíš starat. Třeba na dynamický pole si snadno uděláš šablonu třídy, pak jenom vytvoříš objekt, nastavíš datovej typ a velikost a o alokaci/dealokaci paměti se postará konstruktor/des­truktor... stačí si umět poradit a vážně je to o zvyku...

 
Nahoru Odpovědět 18.10.2012 18:45
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Alokaci paměti může dělat konstruktor, ale dealokace není práce destruktoru, ale až garbage collectoru. Destruktor pouze ukončí platnost objektu, ale o fyzickou dealokaci se nestará.

Nahoru Odpovědět 18.10.2012 18:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

C++ GC nemá takže tam to dělá z pravidla destruktor. Pokud teda nechceš po skončení platnosti objektu nechat paměť z nějakýho důvodu alokovanou.

 
Nahoru Odpovědět 18.10.2012 18:55
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

To souhlasí. Bohužel tohle nepříliš logické spojení bylo převzato i do C#, takže destruktor je tam spouštěn až garbage collectorem, což je někdy bohužel pozdě. Proto vývojáři C# přidali berličku "final", která tuto chybu obchází.

Nahoru Odpovědět 18.10.2012 19:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Ohledně C++ mi to logický přijde, konstruktor v době vzniku objektu alokuje paměť a destruktor ji v době skončení platnosti objektu dealokuje. Jak je to v C# nevim takže nemůžu soudit.

 
Nahoru Odpovědět 18.10.2012 19:20
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Jsou to 2 nezávislé akce. Jedna je zneplatnění objektu, druhá je fyzické odstranění z paměti. V C++ můžeš udělat jednu nebo druhou operaci - nejčastěji obě.

Podobně je to u lepších souborových systémů. Příkaz ke smazání souboru pouze smaže jméno souboru, ale fyzicky je soubor zlikvidován, až jsou smazány všechny jeho názvy a až ho zavřou všechny procesy, které s ním pracují. To umožňuje mazat otevřené soubory.

Nahoru Odpovědět 18.10.2012 19:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Tak jsem to myslel. V C++ se konstruktor volá vždy v době vzniku a destruktor vždy v době skončení platnosti. Jestli v konstruktoru alokuješ paměť a v destruktoru dealkuješ záleží na tobě, ale většinou se to tak dělá.
Operátor delete třeba zničí objekt a způsobí zavolání jeho destruktoru ale destruktor nemusí dealokovávat veškerou paměť kterou objekt používal. Jinak pokud objekt nebyl vytvořen operátorem new tak jeho platnost končí s blokem ve kterém byl deklarován a v tu chvíli se volá destruktor.

Editováno 18.10.2012 20:08
 
Nahoru Odpovědět 18.10.2012 20:06
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Opět jsi napsal něco jako když si dáváš pozor, tak se to nestane. To je ale špatný přístup, protože člověk není stroj a tohle je práce pro stroj. Viděl jsem několikrát co je to schopno udělat, takové bugy se průměrně hledají asi 2 dny, to je přeci jen dost práce. Je to proto, že chyba se projeví jen někdy (záleží na obsahu neuvolněné paměti) a v jiných částech aplikace, než kde je chyba. Kolega v objective C hledal podobnou botu 2 dny (naštěstí v novějších verzích už Apple přidal GC), i já jsem si v Delphi užil s tímhle své (také řádově dny). Že tě to ještě nepotkalo neznamená, že se to neděje.

Nahoru Odpovědět 18.10.2012 20:28
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

S tim souhlasim, proto ale tvrdim že je to individuální, někdo si pozor dává a třeba se mu to nestává. A nebo jak sem psal, udělat si knihovnu, tak se to v C++ řeší asi nejlíp, samozřejmě že je trochu otrava u velkýho programu neustále kontrolovat kde dealokovat který pole, pak neni nic jedoduššího než si napsat třídu pro pole, alokaci/dealokaci vyřešit v konstruktoru/des­truktoru a dál se nemusíš starat o nic, jenom používat... nebudu přece používat jiný jazyk jenom proto že má automatickou správu paměti když mi jinak ten jazyk nevyhovuje a se správou paměti většinou nemám problémy. :)

 
Nahoru Odpovědět 18.10.2012 20:36
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Drahomír Hanák:

Musím se taky přidat k názoru, že dělat chyby je lidské. Dokonce i v programovacích jazycích vyšší úrovně, kde je GC a spoustu dalších vymožeností, nejsou programy a hlavně programátoři bezchybní. Proto se taky píší testy, ale to je zase jiné téma. To, že ti to nedělá problém, je dost silné tvrzení. Pokud budeš dělat větší aplikaci, dovolím si tvrdit, že uděláš chybu na 100%. Je pak na tobě, za jak dlouho si jí všimneš (jestli vůbec), za jak dlouho ji najdeš (což může být opět velmi těžké) a jak se ti ji povede opravit.

 
Nahoru Odpovědět 18.10.2012 20:38
Avatar
Odpovídá na Drahomír Hanák
Lukáš Hruda (Luckin):

Tak samozřejmě, chyby prostě vznikají, netvrdim že se mi nikdy nestala chyba ve správě paměti ale mnohem horší chyby se mi stávali u uplně jiných věcí a jejich nalezení a odstranění mi trvalo daleko delší dobu. :D ...a jak už sem řikal, když si na často používaný věci napíšeš knihovny a napíšeš je dobře, tak se kolikrát o správu paměti ani nemusíš starat. Třeba v klasickym C kde nejsou třídy bych s tim asi měl větší problémy, proto programuju v C++. Nejčastější věc kde používáš dynamickou správu jsou pole, a na to se dá třída napsat celkem snadno...

 
Nahoru Odpovědět 18.10.2012 20:56
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Ale ne, vůbec to není jen záležitost polí, stačí zapomenout, že jsi už uvolnil pointer na objekt. Měl by sis o tom něco přečíst.

Vzpomněl jsem si, že když psal strejda interpreter vlastního jazyka v C++, hledal dlouho jeden leak. Problém byl, že mu ta chyba narušovala debugger, takže ho nemohl používat a hlásil nesmysly.

Nahoru Odpovědět 19.10.2012 10:08
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Neříkal jsem vždy, říkal jsem nejčastěji... pointery na objekty zase tak často nepoužívam. Nejhorší a nejčastější chyby ve správě paměti mi vždycky vznikaly v dynamických polích (Až už to byly pole proměnných nebo objektů - což vlastně je pointer na objekt).
Já tu netvrdim že automatická správa paměti je špatná věc, je to dobrá věc. Snažim se říct že (alespoň pro mě) to neni ta nejpodstatnější vlastnost pro volbu vyhovujícího programovacího jazyka. Proč programovat v C# nebo Javě když kromě toho že mají GC mi ve většině ohledech ani jeden z těch jazyků nevyhovuje. Když někomu jinýmu vyhovujou, tak dobře pro něj.

 
Nahoru Odpovědět 19.10.2012 11:02
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Teď najednou píšeš, že ti vznikaly "Nejhorší a nejčastější chyby ve správě paměti", tvrdil jsi, že jsi s tím nikdy problém neměl, zvláštní. Možná ses jen na moderní jazyky špatně podíval, člověk se těžko vzdává něčeho, co umí a přechází na něco lepšího, co ještě neumí. Co konkrétně se ti nelíbilo?

Nahoru Odpovědět 19.10.2012 11:15
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Tu větu sis špatně přečet :D ...napsal sem že nejhorší a nejčastější chyby ve správě paměti mi vznikali v polích (a to v dobách kdy sem ještě C++ pořádně neuměl a programoval jako prase) neni tam řečeno že ty chyby byly nějak závažný a rozhodně mi jejich oprava netrvala několik dní. Už sem tu jednou psal že daleko horší chyby mi vznikají v uplně jiných věcech.
Věc která mi na těchhle jazycích vadí uplně nejvíc je jejich na muj vkus přehnaná objektová orientace. Všechno musí bejt v nějaký třídě, ke všemu musíš používat objekty, skoro všechnou jsou objekty... Mě se líbí jak je to v C++, když třídu potřebuju tak si ji udělam, když ne tak programuju procedurálně, C++ prostě všemu nechává větší volnost. I způsob jakym tam fungujou právě reference se mi líbí mnohem víc.
Když bude potřeba tak nebudu mít velkej problém se třeba Javu naučit, což stejně budu muset až pudu na VŠ. Obráceně přecházet z Javy nebo C# na C/C++ by asi bylo horší.

Když už je řeč o refencích, mam malej dotaz. Vždycky mě zajímalo jak se v Javě a C# řeší když potřebuju funkci jako parametr předat proměnnou a chci aby když jí ta funkce změní aby se změnila i ta proměnná kterou sem za ten parametr dosadil. V C++ se tohle řeší právě přes reference. Pokud se v C# a Javě dá vytvořit reference na obyčejnou proměnnou, tak jak? A pokud ne, tak jak se to řeší? Předem díky za odpověď? :)

 
Nahoru Odpovědět 19.10.2012 13:06
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Co je to vlastně "dynamické pole"? Obvykle se pod tímto pojmem skrývá implementace některého z abstraktních datových typů, např. seznamu, slovníku, zásobníku, fronty apod. V C#, Javě a podobných jazycích se jen vybere správná kolekce a ta se použije. Pokud to někdo šmudlí v "dynamickém poli", dobře mu tak. Pokud sis tyto abstraktní struktury odladil, pak ti mohou i dobře sloužit jako moduly, ale vytvářet je stále znovu je hloupost.

Nahoru Odpovědět 19.10.2012 13:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Opět jsem přesvědčen, že tyto názory jsou pouze důsledkem nevědomosti a neznalosti objektového přístupu. Míchat objektový a procedurální kód je asi to nejhorší, co můžeš udělat, to poznáš sám, až pochopíš, jak objekty fungují. Větu "Přecházet z Javy na C# by bylo horší" nechápu, protože C# JE Java (přesněji z ní vychází).

Tvůj dotaz je špatně položený, protože nevíš, jak OOP funguje. Sice to C# umožňuje modifikátorem u parametru a Java určitě také, ale ve správně napsaném programu to nebudeš potřebovat. Ty sis jen otevřel Javu a zkoušel v ní programovat procedurálně, ani se nedivím, že ti to moc nešlo :)

Nahoru Odpovědět 19.10.2012 13:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Reference se v Javě a C# nedělají, protože je to prasárna. I když se to dá snadno obejít, když si tu proměnnou nadefinuješ jako objekt.

Nahoru Odpovědět 19.10.2012 13:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Aby to nepochopil špatně, že se pro každou proměnnou, co chce předat, musí dělat objekt :) Tady je otázka proč vůbec modifikovat nějakou proměnnou. Ta proměnná něčemu patří, má nějaký kontext, nějaký objekt. Proto předám ten objekt a modifikuji stav tohoto objektu ať již metodou nebo přímo.

Nahoru Odpovědět 19.10.2012 13:19
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Podle popisu mi spíš připadá, že Lukáš Hruda (Luckin) v C++ používá objekty jen za účelem vytvoření datové struktury proměnné délky, ale jinak programuje procedurálně. V tom případě bychom mu ale nemohli vyčítat, že by kombinoval procedurální a objektové programování.

Nahoru Odpovědět 19.10.2012 13:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Nenapsal sem z Javy na C# ale z Javy nebo C# na C/C++ :) Já chápu jak fungujou objekty v rámci C++. Ten jazyk je dělanej na to aby se v ném míchalo objektový a procedurální programování, taky to neni čistě OOP jazyk. Java a C# jsou čistě objektový jazyky a to je asi ten hlavní důvod proč se mi nelíbí. Líbí se mi styl jakym je to řešený v C++, objekty tam sou a já je často používam ale někdy mi prostě přijde lepší programovat bez nich. I v C++ můžeš programovat čistě objektově pokud chceš, ale přijde mi jako hloupost tam dělat třídu a následě objekt kvuli každej funkci. V podstatě se dá říct že mi nevyhovuje čistě objektový programování a proto mi nevyhovuje Java ani C#... Rozhodně si nemyslim že C++ je zastaralej jazyk a uplatnění si určitě najde a co se týče absence automatycký správy paměti, tak to sme tu myslim řešili už dost. :D

 
Nahoru Odpovědět 19.10.2012 13:29
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

"přijde mi jako hloupost tam dělat třídu a následě objekt kvuli každej funkci" - A to se jako někde dělá? Když chci letadlo, udělám si objekt Letadlo a dám mu atributy rychlost, počet_kormidel, jméno_kapitána, vzorek_preumatik, hladina paliva a nevím co všechno ještě. Funkcí tam dám také několik, třeba zasuň_podvozek(), přistaň(), vzlétni(), zapni_autopilota() a podobně. Jak říkám, vůbec nevíš, jak objekty fungují, tvé odpovědi nemají a nebudou mít žádný význam, dokud si o tom něco nenastuduješ.

Editováno 19.10.2012 13:33
Nahoru Odpovědět 19.10.2012 13:33
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

A co když chci funkci která do žádnýho objektu prostě nepatří... třeba funkci která prohodí dvě hodnoty, nebo funkci která seřadí pole, funkci která převede číslo do jiný soustavy, jakoukoliv všeobecnou funkci u který chci aby stála sama o sobě a volala se samostatně, maximálně byla součástí jmenného prostoru, což v C++ je v podstatě statická třída. Přece kvuli tomu nebudu dělat objekt.

 
Nahoru Odpovědět 19.10.2012 13:37
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

A co když chci funkci která do žádnýho objektu prostě nepatří... třeba funkci která prohodí dvě hodnoty, nebo funkci která seřadí pole, funkci která převede číslo do jiný soustavy, jakoukoliv všeobecnou funkci u který chci aby stála sama o sobě a volala se samostatně, maximálně byla součástí jmenného prostoru, což v C++ je v podstatě statická třída. Přece kvuli tomu nebudu dělat objekt.

 
Nahoru Odpovědět 19.10.2012 13:37
Avatar
Lukáš Hruda (Luckin):

Proč se to přidalo dvakrát? :D

 
Nahoru Odpovědět 19.10.2012 13:38
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Java i C# mají také statické třídy. Setřídění pole uděláš tak, že zavoláš pole.Setrid(). Ta metoda setřiď patří poli, nevím, proč by měla být někde jinde.

2x se to přidalo proto, že jsi klikl 2x na tlačítko odeslat.

Nahoru Odpovědět 19.10.2012 13:42
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Takovou funkci bys ani neměl chtít. Pokud potřebuješ prohodit 2 hodnoty v objektu, tak si na to uděláš metodu. Metoda pro řazení je již definována, převod do jiné soustavy také a vždy to patří nějakému objektu.

Nahoru Odpovědět 19.10.2012 13:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Lukáš Hruda (Luckin):

To byly jenom příklady, běžně potřebuju funkce který mají význam jenom v danym programu a potřebuju aby šli použí samostatně a ne s objektem. Třeba jako funkce na prohození dvou hodnot mimo objekt...

 
Nahoru Odpovědět 19.10.2012 13:54
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

C++ statický třídy nemá a klasický pole v C++ neni objekt ale pointer, s nim těžko zavoláš metodu. Samozřejmě můžeš mít třídu jejíž objekt se chová jako pole, pak by to takhle šlo, ale myslel sem to všeobecně.

 
Nahoru Odpovědět 19.10.2012 13:58
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Otázkou je, jestli ty dvě hodnoty nepatří náhodou do jednoho objektu. V objektovém programování se samostatné proměnné moc nepoužívají.

To vypadá, jako kdybys chtěl implementovat nějaký algoritmus, který již je součástí objektových jazyků. Jinými slovy v OOP takovou funkci nejspíš nebudeš potřebovat.

Nahoru Odpovědět 19.10.2012 14:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Nevim jak to napsat aby to bylo srozumitelný. Když se podíváte do zdrojových kódů k tomu mýmu tetris tak třeba funkce delay, set_block_types, restart, set_highscore, get_highscore, line... takový funkce mam na mysli, ty se prostě nehodí dávat do jakýhokoliv objektu, prostě stojí samostatně.

 
Nahoru Odpovědět 19.10.2012 14:12
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Každá funkce někam patří, jen to ještě nevíš, protože nad tím nejsi zvyklý přemýšlet :) Pokud nejde mít na poli funkci, udělal bych si statickou třídu třeba ArrayUtils a do té dal metody pro práci s polem, jistě jich bude více, třeba hledání. K čemu používáš prohození 2 čísel? Pokud k řazení, má být také ve třídě ArrayUtils. Ještě se mi nestalo, že bych si dělal třídu pro 1 funkci, udělám si tolik tříd, s kolika objekty pracuji a funkce si přehledně rozdělím tam, kam patří. I před OOP se přeci funkce členily do nějakých hlavičkových knihoven, objekty na to jen navazují a umožňují ještě přehlednější kód.

Nahoru Odpovědět 19.10.2012 14:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Nic nikdy nestojí samostaně. Jsou to funkce hry, patří do objektu Hra, Level, Tetris, pojmenuj si to jak chceš :) Pokud se ti stane, že je pro nějakou část hry moc funkci (třeba pro kostku), je dobrý nápad je vyčlenit do objektu kostka (rotace, pád, generování nové, načtení vzorů ze souboru...)

Nahoru Odpovědět 19.10.2012 14:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Právě tyto funkce by měly být součástí objektů, protože vůbec nejsou samostatné. Patří ke svým datovým strukturám.

Nahoru Odpovědět 19.10.2012 14:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Jelikož C++ nemá statický třídy tak pokud funkce nemá fungovat s objektem tak mi přijde jako hloupost dělat třídu plnou statických funkcí když ty funkce můžu napsat samostatně, bude to kratší a chovat se to bude stejně. Nebo dělat třídu kvuli jednomu objektu a pak volat funkce jako metody toho objektu. Přijde mi jednodušší ty funkce deklarova samostatně, často se používají jmenné prostory ale ty se většinou pak stejně obchází direktivou using...

 
Nahoru Odpovědět 19.10.2012 14:21
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Třída plná statických funkcí je statická třída, i když to jazyk nepodporuje, tak takto je definovaná, tedy C++ je evidentně má. Samostatná funkce je jen historický přežitek, stejně jako třeba globální proměnná.

Nahoru Odpovědět 19.10.2012 14:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Kit:

"... dělat třídu kvuli jednomu objektu ..."

Velmi často dělám třídu kvůli jednomu objektu. A nemyslím si, že by to bylo špatně.

Editováno 19.10.2012 14:30
Nahoru Odpovědět 19.10.2012 14:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Fajn, chápu ale řekni mi... když teď vezmu všechny ty samostatný funkce, vytvořim tedy statickou třídu třeba Game a všechny ty funkce a globální proměnný do ní dam... čim si vlastně pomůžu? Akorat když cokoliv stoho budu chtít použit tak to budu muset použít s tou třídou takže jenom místo restart(); budu volat Game::restart(); ...nevidim zásadní rozdíl, možná v určitých případech by to bylo přehlednější ale v menších projektech je to řek bych celkem jedno a způsob používání se nezmění vůbec.

 
Nahoru Odpovědět 19.10.2012 14:34
Avatar
Lukáš Hruda (Luckin):

Mě třeba v C# vždycky přišlo jako otrava psát třeba Console.Write­Line(...) ...místo jednoduše napsat jenom WriteLine(...) já vim že sou to maličkosti ale mě to prostě vadí.

 
Nahoru Odpovědět 19.10.2012 14:43
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Neobjektové části kódu se v objektových jazycích vždycky dělají trochu hůř. Proto je lepší v nich psát objektově.

Nahoru Odpovědět 19.10.2012 14:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Statické třídy bych raději nedělal. Degradují OOP.

Nahoru Odpovědět 19.10.2012 14:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

To ti vadí jen proto, že máš špatný návyk ze zastaralých jazyků. Když píšu do konzole, píšu Console.WriteLine, když píšu do souboru, píšu soubor.WriteLine, když píšu řádku kamkoli jinak, opět to budu volat na tom objektu. Kam dospěje jazyk, kde jsou funkce samostatně, se můžeš podívat u PHP, není to hezký pohled. Stejně má třeba všechny funkce pro pole pojmenované jako arrayněco, to už není rozdíl v tom, jestli to máš ve třídě.

Nedělal bys to jako statickou třídu, ale jako normální třídu. Tady je problém v tom, že ty OOP vůbec nerozumíš a myslíš si, že OOP je jen to, že vložíš metody do třídy a pak musíš psát delší kód. Jinými slovy nevidíš výhody (dědičnost, zapouzdření, polymorfismus...) a vidíš jen nevýhody (kterých je jen zlomek). Pouštět se tu do vysvětlování OOP je asi zbytečné, hlavně jsem to již dělal v článcích, přečti si toto: http://www.itnetwork.cz/…programovani a potom si stáhni a projeď zdroják tohodle: http://www.itnetwork.cz/…mi-bojovniky

Editováno 19.10.2012 15:00
Nahoru Odpovědět 19.10.2012 14:59
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Dobře tak bych místo statický třídy vytvořil normální třídu a udělal její objekt Game a pak bych volal Game.restart() to už je celkem jedno... žádnej další objekt tam nepotřebuju, kdyby jo tak bych tu třídu udělal. Já třídy používam když potřebuju vytvořit takovej datovej typ kterej obsahuje víc informací a potřebuju aby její objekty mohli prostřednictvím čelnských funkcí vykonávat nějaký činnosti, nebo když chci vytvořit datovej tak aby se pomocí přetížení operátrů a konverzních funkcí choval jako základní datovej typ.
Když budu programovat RPG tak si třeba vytvořim třídu Weapon, ta bude mít proměnný damage,accuracy,... a funkce třeba Attack, pak můžu používat její objekty který budou třeba součástí tříy Character, atd. Dědičnost se v tomhle případě taky dá dobře využít. Napřiklad kdybych odvodil třídu Enemy od třídy Character. V tomhle třídy pomáhají a takhle je používam a pokud vim tak přesně k tomuhle jsou třídy v C++ určený. Ale nevidim důvod proč psát třídu pro jeden objekt když dobře vim že víc objektů nikdy potřebovat nebudu...

 
Nahoru Odpovědět 19.10.2012 15:16
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Počkej, počkej. Jak můžeš udělat třídě objekt Game? Četl jsi, na co jsem tě navedl? Objekt je myšlený většinou ve smyslu instance, tu uděláš z třídy. Ta hra v sobě bude mít přeci další objekty, jako Kostka (ta co padá), příští kostka, dále třeba hrací plocha (to jsou ty napadané kostičky). Hra samoztná na sobě bude mít třeba metodu restart(), kostka třeba orotuj(), hracíplocha třeba připojkostku().

EDIT: Jo její objekt, no dobře, ale říkejme tomu prosím instance. Promiň, že čtu jak ponocný, ale docela dlouho jsme se nevyspal :)

Ty používáš třídy jako byly ve starém céčku struktury. Třída toho ale umí mnohem víc, než jen držet data.

" nevidim důvod proč psát třídu pro jeden objekt když dobře vim že víc objektů nikdy potřebovat nebudu" - Třeba proto, aby ten kód dával smysl :) Úplně stejně bych ti mohl říct, že nevidím důvod, proč nemít všechny proměnné globální, že mi to tak vždycky bude fungovat.

Editováno 19.10.2012 15:44
Nahoru Odpovědět  +1 19.10.2012 15:39
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Udělat objekt třídy Game jsem myslel jako udělat třídu a její instaci Game...
A co se týče toho ostatního co si teď napsal, takhle přesně to v tom programu je, ta hra v sobě má objekty jako kostka co padá, další koska, spadlý kostičky, přednastavený typy kostek který můžou spadnout... jenom to všechno je přímo v programu a ne v další třídě. V C++ nemáš žádnou základní třídu a funkce main stojí samostatně, proč si to dělat složitější tím že budu za každou cenu všechno dávat do nějaký třídy. Tak jak ten kód je mi to smysl dává naprosto perfektně.

 
Nahoru Odpovědět 19.10.2012 15:51
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

OK, tak si to piš špatně :) Necháme toho.

Nahoru Odpovědět 19.10.2012 16:16
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Špatně je dost relativní pojem, píšu to tak jak mi to vyhovuje :D Pokud vim tak v C++ se kombinovanym stylem programuje běžně :)

 
Nahoru Odpovědět 19.10.2012 16:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 50 zpráv z 50.