Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: nm 31. 05. 2018, 18:00:25
-
Zdravím.
Ve škole jsme se učili návrhové vzory pro objektové programování v jazyce JAVA. Jazyk C (tím myslím čisté C, nikoliv C++) není objektový jazyk. Domnívám se ale, že existují jisté postupy programování v C. A tak jsem se chtěl zeptat, jestli existuje něco, jako návrhové vzory (nebo postupy) v jazyce C?
-
V linuxovem kernelu se pouzivaji obcas struktury s vlastnimi ukazateli na funkce, takze jista forma objektu zde funguje.
Musi byt vsude objekty, ma to smysl? Kouknete na Go.
-
V linuxovem kernelu se pouzivaji obcas struktury s vlastnimi ukazateli na funkce, takze jista forma objektu zde funguje.
Musi byt vsude objekty, ma to smysl? Kouknete na Go.
Nebo na Haskell... :D
------------------------------------
Ale mám dojem, že dotaz mířil trochu jinam. Asi bych se podíval, jak se co dělá v POSIX nebo v Linuxovém kernelu. :)
-
Ja jsem si uz delsi dobu rikal, ze C je skvele, jan mit
Pro nej knihovnu jako je boost pro C++11, pak by i C bylo
Paradni k pouziti pro bezne lidi.
Podle me je dobre delat v C se zkusenosti z C++11 a Go.
-
Návrhové vzory se dají použít i v C a některé z nich se používají docela běžně.
-
Pojem „návrhové vzory“ má spousta lidí spojený s Javou a obecně objektovými jazyky a z celkem nesmyslných důvodů je nesnáší a nechtějí tento pojem používat, i když by se to v zásadě návrhovým vzorem nazvat dalo, i když tam třeba ani nejsou objekty.
Pro jazyky jako C hledej tedy spíš „idomy“ – jakési zažité postupy a obvyklé řešení určitých situací. V rychlosti jsem teď našel:
http://dept-info.labri.fr/~strandh/Teaching/MTP/Common/Strandh-Tutorial/idioms.html
http://www.adamtornhill.com/Idiomatic_expressions_in_C.pdf
Pro C++ potom:
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
-
jan mit Pro nej knihovnu jako je boost pro C++11, pak by i C bylo Paradni k pouziti pro bezne lidi.
Např. GLib ?
-
Pojem „návrhové vzory“ má spousta lidí spojený s Javou a obecně objektovými jazyky a z celkem nesmyslných důvodů je nesnáší a nechtějí tento pojem používat, i když by se to v zásadě návrhovým vzorem nazvat dalo, i když tam třeba ani nejsou objekty.
Pro jazyky jako C hledej tedy spíš „idomy“ – jakési zažité postupy a obvyklé řešení určitých situací. V rychlosti jsem teď našel:
http://dept-info.labri.fr/~strandh/Teaching/MTP/Common/Strandh-Tutorial/idioms.html
http://www.adamtornhill.com/Idiomatic_expressions_in_C.pdf
Pro C++ potom:
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
Nevím, zda se tazatel ptal právě na tohle. Idiomatické konstrukce a způsoby zápisu má každý jazyk a s návrhovými vzory (MVC, MVP, Observer, Producent-Konzument, ...) nijak nesouvisí. Mimochodem to setjmp(), longjmp() jako idiomatický způsob error handlingu v C zmíněný v tom prvním dokumentu je teda fakt nálož.
Kit to IMHO řekl dobře, návrhové vzory nejsou obecně omezené jazykem, lišit se může maximálně obtížnost implementace.
-
Pojem „návrhové vzory“ má spousta lidí spojený s Javou a obecně objektovými jazyky a z celkem nesmyslných důvodů je nesnáší a nechtějí tento pojem používat, i když by se to v zásadě návrhovým vzorem nazvat dalo, i když tam třeba ani nejsou objekty.
Pro jazyky jako C hledej tedy spíš „idomy“ – jakési zažité postupy a obvyklé řešení určitých situací. V rychlosti jsem teď našel:
http://dept-info.labri.fr/~strandh/Teaching/MTP/Common/Strandh-Tutorial/idioms.html
http://www.adamtornhill.com/Idiomatic_expressions_in_C.pdf
Pro C++ potom:
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
Nevím, zda se tazatel ptal právě na tohle. Idiomatické konstrukce a způsoby zápisu má každý jazyk a s návrhovými vzory (MVC, MVP, Observer, Producent-Konzument, ...) nijak nesouvisí. Mimochodem to setjmp(), longjmp() jako idiomatický způsob error handlingu v C zmíněný v tom prvním dokumentu je teda fakt nálož.
Kit to IMHO řekl dobře, návrhové vzory nejsou obecně omezené jazykem, lišit se může maximálně obtížnost implementace.
K tomu C jsem toho bohužel moc nenašel – sám bych taky uvítal nějaké dobré zdroje. Ale to, co je na těch Wikibooks k C++, se podle mého těm návrhovým vzorům celkem blíží – jsou tam i komplexnější věci, ne jen jak „procházet for cyklus od nuly“.
-
V linuxovem kernelu se pouzivaji obcas struktury s vlastnimi ukazateli na funkce, takze jista forma objektu zde funguje.
Ve Windows se též jedná o dosti oblíbený způsob řešení problémů (ChainOfResponsibility, Observer, nějaké ty Adaptery by se ašly také).
C
Jak již bylo řečeno, návrhové vzory nejsou omezeny na jazyk. Z jejich studia byste si neměl odnést, jak přesně je v určitém jazyce implementovat, ale jaká jsou za nimi myšlenky ("mám problém P, na který lze použít vzor X, který jej řeší cca takto").
Jistě, v C nemáš objekty, ale můžeš si je do potřebné míry implementovat. Třídu můžeš reprezentovat strukturou, její metody funkcemi, které jako parametr berou adresu té struktury. Dědičnost znamená, že struktura potomka v sobě obsahuje strukturu rodiče. Polymorfismus lze implementovat prostřednictvím pointerů na funkce (callbacky).
-
Chápu to tak, že v C se dá programovat mnoha způsoby, které zahrnují jak "idiomy", tak i nějaké C-čkové návrhové vzory. Takže by mě spíše zajímalo toto...
Mám problém P, který bych chtěl řešit programem v C. Zejména určitě už někdo podobný problém řešil a možná je řešení tak známé, že se může zařadit mezi "idiomy" případné "návrhové vzory". Takže mi zbývá jen ta, už vymyšlená řešení, na můj problém P, najít a buďto je použít, nebo, když se nehodí, vymyslet něco svého.
-
jak byste to rozdělili a jak vymezili tyto pojmy
Například jako návrhový vzor vidím něco, co není primo vázané na jazyk, ale může se to v nějakém jazyce lépe využít, když to umí. Nějakou techniku, která se hodí na určitou část funkcionality aplikacy (adaptér na čtení konfiguráků v různých formátech)
MVC bych jako návrhový vzor bych nepokládal, je to něco "nad tím", pokud si vyberu MVC, tak to znamená, že podle tohoto duchu budu dělat celou aplikaci
idiomy neznám
pak konrétní "střípky" - programové techniky - continuation, jumps, fluent
kam zařadit následující pojmy ?
(a teď jsem vybral opravdu paletu, které spolu nijak nesouvisí) Dependency injection, MVC, continuations, fibers/ generické typy, monkeypatching, iterators/iterable/enumerable, convency over configuration, Reflection ,fluent interface
Návrhové vzory
postupy programování
idiomy
-
Řekl bych, že problematika návrhových vzorů je spojena hlavně se staticky typovanými objektově orientovanými jazyky, kde se pomocí nich maskují neřešitelné rozpory mezi statickou typovou kontrolou a velmi pozdní vazbou vyžadovanou OOP. Takže v klasických strukturovaných jazycích to prakticky význam nemá a nestuduje se to.
-
Tak to bys řekl špatně. Mimochodem, ve staticky typovaných objektových jazycích dělám už hooodně dlouho a nejakých závažných neřešitelných rozporů jsem si nevšiml.
-
Pojem „návrhové vzory“ má spousta lidí spojený s Javou a obecně objektovými jazyky a z celkem nesmyslných důvodů je nesnáší a nechtějí tento pojem používat, i když by se to v zásadě návrhovým vzorem nazvat dalo, i když tam třeba ani nejsou objekty.
Pro jazyky jako C hledej tedy spíš „idomy“ – jakési zažité postupy a obvyklé řešení určitých situací. V rychlosti jsem teď našel:
http://dept-info.labri.fr/~strandh/Teaching/MTP/Common/Strandh-Tutorial/idioms.html
http://www.adamtornhill.com/Idiomatic_expressions_in_C.pdf
Pro C++ potom:
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
Vzor by mal byt definovany a definovatelny pomocou "pattern language", ktory vymyslel Christopher Alexander vo svojej knihe "Timeless way of building" a tiez potvrdeny niekolkymi nezavislymi autoritami ako dostatocne univerzalny. Vzorom sa dnes zvykne oznacovat vselico, preto ta averzia. A tiez ludia k nim zvyknu pristupovat dost nekriticky a bez rozumu, vzdy prevratim oci ked vidim zrudu typu "mediatorfactorysingletonholder". Vzory sa postupne stavaju idiomami jazyka, stale tam su, ale su skryte.
Neviem, co som tym chcel povedat, ale ked som to uz napisal, tak to poslem :) Asi tolko, ze vzory su dobra vec, ale treba pouzivat rozum, nie slepo opisovat implementacie z kniziek, skor poznat principy.
-
Jistě, v C nemáš objekty, ale můžeš si je do potřebné míry implementovat. Třídu můžeš reprezentovat strukturou, její metody funkcemi, které jako parametr berou adresu té struktury. Dědičnost znamená, že struktura potomka v sobě obsahuje strukturu rodiče. Polymorfismus lze implementovat prostřednictvím pointerů na funkce (callbacky).
Docela výstižné. Struktura by mohla obsahovat pointer na "třídu", která bude obsahovat pointery na "rodiče" a "metody".
-
tady je priklad 'adapteru' v C:
http://blog.jdesch.de/attach/adapter-pattern-in-c.c
-
Vždycky jsem si myslel, že návrhové vzory jsou spíš způsob myšlení a způsob kompozice / dekompozice problému/funkcionality na mensi celky, aby výsledný systém byl udrzovatelny I déle než měsíc po vydání pre-alpha. Jistě, některé "vzory" jsou jednodušší v jednom jazyku, jiné v druhém, některé třeba v jistých jazycích nedávají smysl, ale to jsou podle mne jen detaily. Viz třeba zde zmíněné oop v C.
-
Tak to bys řekl špatně. Mimochodem, ve staticky typovaných objektových jazycích dělám už hooodně dlouho a nejakých závažných neřešitelných rozporů jsem si nevšiml.
I to se některým lidem stává.
-
Jistě, v C nemáš objekty, ale můžeš si je do potřebné míry implementovat.
Docela výstižné. Struktura by mohla obsahovat pointer na "třídu", která bude obsahovat pointery na "rodiče" a "metody".
To už mi připadá jako dost překombinované (spíš "jak do C vnutit OOP za každou cenu" versus "jak v C využít to "dobré" z OOP" - pokud bych chtěl psát čistě OOP, tak asi použiju nějaký OOP jazyk, stejně jako nebudu implementovat monádu v nasmu i když by to šlo ;-) ).
Ale dva základní běžné přístupy jsou asi nějaké základní struktura která obsahuje nějaký typový field a v kódu se pak předává pointer na tento typ, společný kód je normální a speciality pro "zděděné třídy" nějaký switch/if plus přetypování (případně i funkce když je toho víc) - dost často to na daný problém plně postačuje, i když je zřejmé že se míchá kód rodiče a potomka.
A pak druhá možnost jak už bylo řečeno, do základní třídy prostě přihodit pointer na funkci na zpracování požadavku a máme klasickou virtuální metodu, když je obsluha rozdílná tak je to určitě přehlednější, ale když jde jen o jeden řádek navíc proti rodiči, tak je IMHO přehlednější první způsob.
Oboje může být dost přehledné i bezpečné, ale taky se dá krásně zprasit, jako v každém jazyce ;-)
-
Vždycky jsem si myslel, že návrhové vzory jsou spíš způsob myšlení a způsob kompozice / dekompozice problému/funkcionality na mensi celky, aby výsledný systém byl udrzovatelny I déle než měsíc po vydání pre-alpha. Jistě, některé "vzory" jsou jednodušší v jednom jazyku, jiné v druhém, některé třeba v jistých jazycích nedávají smysl, ale to jsou podle mne jen detaily. Viz třeba zde zmíněné oop v C.
To stále platí. Vzory slouží i pro pojmenování abstrakcí. Pokud jinému vývojáři řeknu, že to logování má udělat přes vzor Observer, tak by mi měl rozumět bez ohledu na jazyk, ve kterém programuje.
-
Tak to bys řekl špatně. Mimochodem, ve staticky typovaných objektových jazycích dělám už hooodně dlouho a nejakých závažných neřešitelných rozporů jsem si nevšiml.
I to se některým lidem stává.
Spíš se některým stává, že svoji neschopnost a hloupost považují za neřešitelný problém něčeho jiného.
-
Tak to bys řekl špatně. Mimochodem, ve staticky typovaných objektových jazycích dělám už hooodně dlouho a nejakých závažných neřešitelných rozporů jsem si nevšiml.
I to se některým lidem stává.
Spíš se některým stává, že svoji neschopnost a hloupost považují za neřešitelný problém něčeho jiného.
A. Kay ke staticky typovaným OO jazykům: I’m not against types, but I don’t know of any type systems that aren’t a complete pain, so I still like dynamic typing.
-
A?
-
Tak to bys řekl špatně. Mimochodem, ve staticky typovaných objektových jazycích dělám už hooodně dlouho a nejakých závažných neřešitelných rozporů jsem si nevšiml.
I/O psal, že problémy jsou řešitelné návrhovými vzory. Jestli používáš návrhové vzory, tak potvrzuješ co psal I/O.
-
I/O psal, že problémy jsou řešitelné návrhovými vzory.
To právě nepsal. Přečti si ten jeho příspěvek pořádně. I když obojí tvrzení je pitomost.
-
Návrhové vzory bych tedy nechal spíše pro OOP jazyky. V jazyce C by mě spíše tedy zajímali nikoliv návrhové vzory, ale spíše určité už vymyšlené a běžně používané konstrukce. Existuje tedy něco takového? Už zde byly zmiňované jakési "idiomy" nebo patterny. Takže existují nějaké zažité konstrukce, jak řešit jisté problémy?
-
Návrhové vzory bych tedy nechal spíše pro OOP jazyky. V jazyce C by mě spíše tedy zajímali nikoliv návrhové vzory, ale spíše určité už vymyšlené a běžně používané konstrukce. Existuje tedy něco takového? Už zde byly zmiňované jakési "idiomy" nebo patterny. Takže existují nějaké zažité konstrukce, jak řešit jisté problémy?
https://www.root.cz/knihy/pruvodce-labyrintem-algoritmu/
https://algoritmy.net/
https://www.root.cz/knihy/object-oriented-programming-in-ansi-c/
https://github.com/EbookFoundation/free-programming-books/blob/master/free-programming-books.md
Google dnes nefunguje?