Sziasztok!
Tudtok ajánlani jó C++ gyorstalpaló könyvet / e-könyvet / dokumentációt?
(sokadik nyelvként szeretném alapfokon megtanulni)
- 121264 megtekintés
Hozzászólások
Udv,
ha magyart akarsz, akkor ezt javaslom:
http://www.libri.hu/konyv/szoftverfejlesztes-c-nyelven.html
Angol tutorialokkal meg tele a net, de nem tudnek most kiemelni egyet sem :)
- A hozzászóláshoz be kell jelentkezni
Magyar forditas:
- A hozzászóláshoz be kell jelentkezni
Magyar forditas:
- A hozzászóláshoz be kell jelentkezni
NE, mert:
1) A magyar forditas f0s.
2) Stroustrup konyve qrvara nem "C++ gyorstalpaló"!
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
--> YouTube csatornám
- A hozzászóláshoz be kell jelentkezni
Szerintem meg egész jól sikerült a fordítás.
- A hozzászóláshoz be kell jelentkezni
Akkor talpalj gyorsan angolul : http://www.cplusplus.com/doc/tutorial/
- A hozzászóláshoz be kell jelentkezni
Ez viszonylag jó tutor, vizsgára készültem belőle kizárólag más nyelvekkel való tapasztalattal, sikerült.
- A hozzászóláshoz be kell jelentkezni
A magyar fordítással semmi probléma nincsen, ellenben a szerzői jog sértése a HUP szabályzatába ütközik...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
És gyanítom az ELTÉ-ébe is, meg annak a szervernek a használati feltételeibe, amire felpakolták.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Úgy érted leginkább a kiadó anyagi joga és a szerzői jogok megsértése törvénybe ütköznek :)
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Szerintem ez elég jó, ha angolul megfelel: http://cplusplus.com/doc/tutorial/
- A hozzászóláshoz be kell jelentkezni
+1 ez messze a legjobb
- A hozzászóláshoz be kell jelentkezni
++ (Tényleg nagyon jó és tömör!)
Szvsz a Stroustrup-könyv inkább azoknal szól -- mint egy referencia -- akik már eléggé ismerik a C++-t.
- A hozzászóláshoz be kell jelentkezni
Én a C++ Essentials-t használtam gyorstalpaló gyanánt. Mivel már volt tapasztalat C-ben, és az objektum orientált programozás sem volt idegen, ezért csak a c++ specifikus részeket olvastam át.
- A hozzászóláshoz be kell jelentkezni
Neeeeeeeeeeeeeeeeeeeeeeeeeeem!!!
C++ nem egy gyorsan tanulható/csinálható dolog. PONT! PERIOD! FULL STOP!
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Ahogy mondod, nincs is rosszabb, mint mikor jön egy Java developer, és elkezd C++-ozni, mert azt hiszi, azt is tudja. Jah de, van rosszabb, amikor egy C programozó csinálja ugyanezt.
Szóval a C++ egy igen összetett nyelv, és nehéz jól csinálni.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
A C oldalt aláírom. Én C-ben kezdtem. most kénytelen vagyok C++-ozni. Biztosan megvan mindkét nyelvnek a maga szépsége, de a C++ nekem nagyon nem fekszik. A C nekem sokkal praktikusabb, egyszerűbb, fölösleges sallangoktól mentes nyelv. Ahol ezek a számomra sallangok biztosan jól jönnek máshol, de aki C-ben megtanult proramozni, és szereti is annak az (pl)objektumorientáltság jó eséjjel nem fog tetszeni.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Amikor Linus hisztizett a C++ ellen, na az nagyon szánalmas volt, de valamire rátapintott. A C++ egy kezdőbarátabb nyelv, és emiatt sokkal több a balf*sz, aki képes alkotni benne valamit, és emiatt azt hiszi, érti a nyelvet. A C++-t lehet szimplán okosabb C-ként használni (szorosabb típusellenőrzés, prototípusellenőrzés, const, constexpr, okosabb structok, egyszerű template (defineok helyett)), és lehet magasabb szinten is használni, de ha valaki nem tudja, mit miért használ és mi mire való, az nagyon csúnya dolgokat tud csinálni C++-ban. C-ben ez ritkább, mert aki buta, az hamar elvérzik a hello world után.
Szóval én nem látom semmi hasznát a C-nek az olyan területeken kívül, ahol nem érhető el C++ fordító vagy nem kényszerülsz valamiért C-re, de tény, hogy C++-ban könnyebb rejtett működést produkálni, ami odafigyelést kíván.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Meglepett +1
(még szoknom kell, hogy szeretem a C++-t).
Hozzátenném, hogy beágyazott környezetben (nálam a programozásról elsősorban ez ugrik be) nem használnék C++-t (ennek ellenére tettem, de ez más kérdés), inkább C-t. Amúgy beágyazott rendszereknél NagyZ kedvenc Java-ja is elvérzik (többé-kevésbé, nyilván lehet vele szórakozni, de nem elterjedt, a mobiltelefonokról ne beszéljünk, az kicsit más kategória).
- A hozzászóláshoz be kell jelentkezni
Miért nem használnál C++-t beágyazott környezetben?
Eltekintve a toolok/fordítók hiányosságaitól, tisztán nyelvi szemszögből.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Nem hasznalnam ki a lehetosegeket, mert a kovetkezoket nem hasznalom: polimorfizmus, new, kivetelkezeles; stb.
Es lattam, ahol a C++ mar megerezheto overheadet hozott.
- A hozzászóláshoz be kell jelentkezni
Tudtommal akaratlan overheadja egy dolognak van csak: a kivételkezelésnek. Azt nyílván mellőzni kell embedded környezetben (ki lehet kapcsolni, a new sem fog bad_alloc-ot dobni).
Amúgy a C++ a zéró óverhed elvet tartja, tehát amit nem használsz, azért nem fizetsz. Polimorfizmus nem feltétlenül praktikus embedded rendszerben.
De mint említettem, a C++ szigorúbb fordítási idejű ellenőrzései már önmagában hasznosak, ha C kódot írsz és C++-al fordítod, már előrébb vagy. Érdemes egy kicsit const náculni is, valamint a C stílusú kasztolásokat lecserélni C++-osakra.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
> valamint a C stílusú kasztolásokat lecserélni C++-osakra.
Egyetértek azzal amit írsz, de ezen megakadt a szemem, nem tudtam. Miért érdemes?
- A hozzászóláshoz be kell jelentkezni
1. Pontosabban ki tudod fejezni, mit akarsz, a static_cast pl hibát ad fordításkor, ha egy privát bázisosztályra mutatóra vagy egy unrelated mutatóra akarsz konvertálni, a const_caston kívül semmi sem veszi el a constot, így nem tudsz véletlenül hibákat belerakni, pontosan azt kasztolsz arra, amit és ahogy akarsz, nincsenek implicit következmények. Jól definiáltak a műveletek (már ahol lehet).
2. A kasztolás rossz, és minél könnyebb őket megkeresni, minél jobban kiugrik a kódból, annál jobb. Ilyen szempontból a C stílusú kasztolás katasztrófa.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Értelek, van abban igazság amit mondasz. Főleg abban, hogy a castolás rossz :-) Pont tegnap említettem valakinek, hogy a const_cast arra való, hgy újragondold az architektúrádat, és kiirtsd :-)
- A hozzászóláshoz be kell jelentkezni
Elvileg egyetértek, de sajnos ismerek olyan problémakört, amit nem tudtam megoldani szépen úgy, hogy a const-ozás mindenhol konzekvens. Tipikusan shared pointereknél fordul elő ilyesmi.
- A hozzászóláshoz be kell jelentkezni
Ez gyakori vita tárgya amit írsz. Magam Scott Meyers véleményét osztom, h. a C++ overheadje zeró, vagy gyorsabb, mint a C. Persze a kivételkezelést ki kell kapcsolni.
Viszont szívesen látnék példát arról, hogy jó C++ kód lassabb, mint a C megfelelője.
- A hozzászóláshoz be kell jelentkezni
Az embereknek általában van egy téves előiteletük a C++-ról. Egyébként nincs olyan, hogy gyorsabb vagy lasabb nyelv, csak az van, hogy C++-ben lehetséges gyorsabb programokat írni mint C-ben (ha tudod, hogyan) :)
És még csak annyit, ha tényleg az ember full-stack programozó akar lenni, akkor mindkettő kötelező (C is és C++ is), hiszen majdnem minden igazán fontos kód a világon vagy C vagy C++.
- A hozzászóláshoz be kell jelentkezni
Definiáld a "fontos" szót. Gyanítom nem ezeken a nyelveken írják az igazán biztonságkritikus szoftvereket, vagy a Voyagerek 40 éve üzemelő cuccát.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Azok nem fontosak :) és sok +.
A biztonságkritikus szoftver halál, ha C/C++-ban van írva. Redundáns, újra fel nem használható fost írnak biztonságkritikus szoftver címen, oly módon, hogy a kód kb. 40%-a bullshit. A követelményeket programozáshoz nem értő bullshitter excel mérnökök állítják össze.
Legalábbis amit én láttam. Pl. CRC-vel védenek egy apró kis memóriaterületet, mondván, hogy az kritikus, és a kozmikus részecskék megváltoztathatják a memória állapotát. Jobb ilyenben nem részt venni.
Orvosi műszerekben, fékekben, hasonlókban fordul elő ilyesmi.
Nem tudom mi lenne a helyes, gondolom nem C, hanem valami más nyelv, és a redundanciát meg egy külön elfedett absztrakciós layer hozná be.
- A hozzászóláshoz be kell jelentkezni
Az ADA nem lett volna rossz erre, kár érte, nekem tetszett, amikor belenéztem.
- A hozzászóláshoz be kell jelentkezni
The Unreasonable Effectiveness of C.
http://damienkatz.net/2013/01/the_unreasonable_effectiveness_of_c.html
- A hozzászóláshoz be kell jelentkezni
jajj ez egy iszonyatos faszsag (mondom ugy, hogy a mai napig a c a kedvenc nyelvem, c++ utan is)
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Pont most akartam írni egy kicsit arról, miért faszság, de nem tudom érdemes-e egyáltalán, vagy mindenkinek egyértelmű.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Én csak azt nem értem, mi köze van a linknek az ADA nyelvhez :-).
Az ADA szóra rákeresve két találatom volt benne:
- headaches
- readability
De sebaj.
- A hozzászóláshoz be kell jelentkezni
ADA is a great toy, but... you can't build the Real World with a toy.
A link azért jött ide mert elmondja, hogy miért uralkodik a C (és miért nincs és soha nem is lesz semmi esélje annak a többi "tökéletes" nyelvnek, hogy átvegyék a helyét). Röviden, a C és C++ mérnökök terméke és ezért csak a mérnököknek tetszik... de hát azok is építik a Real World-ot, az infrastrukturát amire minden épül és minden függ.
Nem kell mindenre C vagy C++ és sok mindenre nem is az a legjobb megoldás, de vannak (fontos) dolgok amire igen.
- A hozzászóláshoz be kell jelentkezni
Igen, leírja miért uralkodik a C. Vagyis nem írja le, de kiderül az írásból. Mert rengeteg a hozzá hasonló szűk látókörű barom, aki hozzáfingás nélkül ócsárol mindent, ami túlmutat a C-n. Igen, rád gondolok Linus.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Írd le, mert nekem nem világos. Néhol kicsit túloz a csávó, meg látszik a stíluson, hogy akkor írta, amikor épp nagyon el volt szállva a C-től. De szerintem nem mond annyira faszságokat.
- A hozzászóláshoz be kell jelentkezni
"The syntax and semantics of C is amazingly powerful and expressive."
"Its semantics are so simple and the syntax so powerful it lowers the cognitive load substantially, letting the programmer focus on what's important."
Ez az ember nem érti, mit jelentenek a fogalmak, amiket használ. C-ben a problémára lehet koncentrálni? Pont C-ben? Amikor millió hülyeségre kell odafigyelni mellette, kézzel foglalni a memóriát, kézzel kezelni a változást, mindig az adott helyen hibaellenőrizni stb? Ne már. Egyszerű és tiszta nyelv a C, kevés a rejtett működés benne, de ne keverjük ezt össze a kifejezőerővel.
"the "surface area" of C APIs tend to be simple and small."
Ez az ember szerintem még nem látott C APIkat. Pont hogy sokkal összetettebbek a függvényhívások, mert nincsenek objektumaid, minden szart oda kell írni, tele van minden flagekke, unionokkal.
"C is the fastest language out there, both in micro and in full stack benchmarks."
qsort vs sort
A C++ soha nem lassabb, és néha gyorsabb, mint a C, ha megfelelően van használva.
"there are dangling pointers and memory/resource leaks, bolted-on support for concurrency, ..., no namespaces. Error handling can be painfully cumbersome and verbose."
Tök jó, hogy ezekre a problémákra a C++-nak kész válaszai vannak, és egyedül a hibakezelésben van emiatt performance tradeoff.
Nem más ez, mint egy félig művelt C-fan rantolása.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
De attól függetlenül még igaz, hogy a C (és még hozzátenném a C++ is) kiraly.
Egyébként az a "millió hülyeségre kell odafigyelni" az ami "important" ha akarod, hogy a megoldásod jó legyen. Ignorance is NOT bliss! Nem csak a MIT csinál a kód a fontos, hanem a HOGYAN csinálja a kód is fontos (programozás esetében super_important!)
Ez lehet, hogy neked hülyeség és disztrakció, de egy kompetens mérnöknek akinek nem csak a kényelem és a "first_row" rövid távú - látható - produktivitás a fontos, hanem mindenekelőtt a tehnikai validitás amelyre tovább lehet építeni és ami a hosszu távú - kevésbé látható - produktivitást növeli annak ez nagyon fontos.
- A hozzászóláshoz be kell jelentkezni
Te kevered a dolgokat. Csak azért, mert nem akarok mindig mindent kézzel csinálni, még érthetem, hogy mi történik. Csak azért, mert nem kézifúróval fúrok, még értem, hogy a fúrógép hogy fúr, és alkalomadtán, ha szükséges, kézzel is meg tudom csinálni.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Rossz összehasonlitás (a fúró).
A lényeg abban van, hogy ha valamivel nem kell foglalkoznod akkor azzal nem fogsz foglalkozni. Nem vagyok biztos benne, hogy egy programozó ezt minden esetben megengedheti magának. Csak ennyi. De ez nem csak C vagy C++ esetében érvényes, mondtam már, hogy JVM/CLR és akár egy Lisp Machine esetében is fájni fog ha a gépet nem tartod szem előtt.
- A hozzászóláshoz be kell jelentkezni
Ilyen hozzaallassal meg mindig assemblyben programoznank. Mert hat a legtobb C koder nincs is tisztaban az assembly nyelvvel, kovetkezeskepp nem is fogllakozik a generalt gepi koddal.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Nem tudtam, hogy van a bullshit generatorból IT-re optimalizált verzió.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
In his classic talk at the Turing awards, Dijkstra remarked that computer programming is an “intellectual challenge which will be without precedent in the cultural history of mankind”. What is it that makes software development so hard? Dijkstra himself gave the answer by concluding that a “competent programmer is fully aware of the strictly limited size of his own skull”.
so... it's not about programming languages it's about the size of the skull ;)
but...
It’s a reference made to the great cognitive challenges of software development. Programming stretches our cognitive abilities to a maximum and we need to counter with effective design strategies to handle the complexity inherent in software.
so... programming language facilities are important too :)
How's this for BS? :)))
- A hozzászóláshoz be kell jelentkezni
"C is clearly not the cleanest language ever designed nor the easiest to use, so why do so many people use it?
• C is flexible: It is possible to apply C to most every application area, and to use most every programming technique with C. The language has no inherent limitations that preclude particular kinds of programs from being written.
• C is efficient: The semantics of C are ‘low level’; that is, the fundamental concepts of C mirror the fundamental concepts of a traditional computer. Consequently, it is relatively easy for a compiler and/or a programmer to efficiently utilize hardware
resources for a C program.
• C is available: Given a computer, whether the tiniest micro or the largest super-computer, the chance is that there is an acceptable-quality C compiler available and that that C compiler supports an acceptably complete and standard C language and library. There are also libraries and support tools available, so that a programmer rarely needs to design a new system from scratch.
• C is portable: A C program is not automatically portable from one machine (and operating system) to another nor is such a port necessarily easy to do. It is, however, usually possible and the level of difficulty is such that porting even major pieces of software with inherent machine dependences is typically technically and economically feasible."
Bjarne Stroustrup
- A hozzászóláshoz be kell jelentkezni
És ezzel azt akartad mondani, hogy ...
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Linux, BSD, Windows, AIX, OSX, QNX, VxWorks, JVM, CLR, Oracle, SQL Server, IBM DB2, MySQL, SAP, Exchange Server, Apache Web Server, IIS, GNOME, KDE, QNX, GCC, LLVM/Clang, Intel Compilers, Microsoft Compilers, Visual Studio, Chrome, Firefox, IE, Safari, OpenGL, DirectX, OpenCL, CUDA, VMware, Hyper-V, Citrix Software, Cisco Software, Adobe Software, Autodesk Software, Microsoft Office, OpenOffice/LibreOffice, Amazon, Bloomberg, Google Search Engine, Catia, almost all the game/3D engines...
és persze az INTEGRITY-178B RTOS (the OS of Airbus A380, Boeing 787 and of course B-2, F-22 and F-35), Next Generation Air Transportation System (NGATS)...
elég?
ha nem akkor:
"The current stable version of GCC is 4.7.2, which was released on September 20, 2012. GCC now uses C++ as its implementation language."
Szóval már nem is C hanem C++ :)
- A hozzászóláshoz be kell jelentkezni
Igen, tudom hogy "the world runs on c and c++" (talán sutter mondta ezt a gonative konferencián?), csak a "majdnem minden" volt nekem egy kicsit túlzó. Amúgy igen, minden fontos szoftver C/C++, mert a fontos szoftvereknél általában komoly erőforrás megszorítások vannak.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Hát nem tudom, nekem nincs gyomrom a C-hez.
Hányingerem van, ha meglátok egy macro-t.
Zavar, hogy nincs konstuktor destruktor.
Persze lehet, h. azért mert nem láttam még szép C projectet, viszont szép C++ projectet már láttam.
Egy idő után minden általam látott C project leimplementált egy virtuális metódus hívó rendszert. Ilyenkor felmerül a kérdés, hogy akkor miért nem használun C++-t???
Szóval C-t én inkább úgy látom, hogy kis, rendszerkritikus feladatok nyelve, ahol az egyszerűség előny.
Illetve C++ kódban néhány hardcore optimalizáció C (ciklus mag optimalizációk pl.), de az ilyen kódok engem jobban emlékeztetnek az gépi kódra, mint a C-re.
- A hozzászóláshoz be kell jelentkezni
Szerintem te túlságosan rózsaszínben látod a C nyelvet. Vegyünk egy egyszerű példát, string1-hez szeretnéd hozzáfűzni a string2-t.
Ezt C-ben hogyan implementálod le? Leméred a két char* string hosszát (2*strlen), átméretezed a string1-et (realloc), hozzámásolod a string2-t (memcpy, mivel az strcat folyton 0-t keresne) és lezárod nullával. Napi szinten szerintem ezrével írják ezt le az emberek és százával rontják el. Ráadásul az strlen nem egy gyors művelet.
Nyilván C-ben tudsz saját string típust létrehozni, ahol tárolod a hosszt, a típusodhoz írsz procedúrákat. De innentől lényegében már egy osztályt hoz létre az ember, csak rendes nyelvi támogatás nélkül. Másképp fogalmazva elég ritka olyan projectet találni, ahol nincs szükség containerekre. Ezeket meg sokkal biztonságosabb C++-ban megírni mint C-ben. A keletkező gépi kód meg nem kéne, hogy eltérjen.
- A hozzászóláshoz be kell jelentkezni
Szerintem nem olvastad el, amiket irtam.
- A hozzászóláshoz be kell jelentkezni
Szerintem nem vetted a lapot, hogy nem +1-eztem, hanem ++1-eztem. :)
- A hozzászóláshoz be kell jelentkezni
:-) OK
- A hozzászóláshoz be kell jelentkezni
Napi szinten szerintem ezrével írják ezt le az emberek és százával rontják el.
Igen, de legalább egyszerűen és gyorsan ki lehet javítani.
C egy egyszerű nyelv, egyszerűen felismerhető és javítható hibalehetőségekkel. C++ bonyolult nyelv, amely jól használva sok C-ben elkövethető egyszerű hibát megakadályoz. Viszont a bonyolultság olyan hibalehetőségeket teremt, amilyenről egy C programozó nem is álmodhat. Összességében nem vagyok meggyőződve arról, hogy egy C++ projektnél kevesebb időt kell tölteni debugolással.
- A hozzászóláshoz be kell jelentkezni
"Igen, de legalább egyszerűen és gyorsan ki lehet javítani."
Ez biztos? Nagyon könnyű stringkezelésbe kis memóriatúlírási hibákat beletenni, amik kivédéséhez minden ilyen kis vacak kódot külön-külön tesztelni kell sokféle inputtal, gcc -fstack-protector-all, dmalloc, Valgrind és hasonló barátainkkal karöltve. C++-ban annyival egyszerűbb és gyorsabb ezeknek a kijavítása, hogy elég azt az egy-két string osztályt letesztelni, amit az ember életében ír.
- A hozzászóláshoz be kell jelentkezni
C fejlesztőként a Valgrind használata kötelező, de mondok valami újat: C++-ban is, mivel a memóriát ugyanolyan közvetlenül kezeli az is.
- A hozzászóláshoz be kell jelentkezni
"mondok valami újat"
Én csupán azt írtam, hogy C++-ban ritkábban kell újra és újra alap stringkezeléssel vacakolni. De azt nem írtam, hogy kevesebb volna a hibázási lehetőség ezen alkalmakkor. Igen, kell Valgrind C++ esetén is.
- A hozzászóláshoz be kell jelentkezni
"Nyilván C-ben tudsz saját string típust létrehozni, ahol tárolod a hosszt, a típusodhoz írsz procedúrákat. De innentől lényegében már egy osztályt hoz létre az ember, csak rendes nyelvi támogatás nélkül."
Az objektum orientált programozás messze-messze nem erről szól, hogy objektumaid vannak meg azokba dobálod bele a függvényeid.
Ha szerinted ez az OOP, akkor fogalmad sincs, hogy mi az.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
írd már le légyszi mi az OOP. Most komolyan. Tegnap kellett elmagyarázzam egy managernek, és nem jött össze. Hátha tudsz segíteni.
- A hozzászóláshoz be kell jelentkezni
Alapvetően egy modellezési szemlélet amely a megoldandó feladat adatait és az azokon végzett folyamatokat absztrakt módon és opcionálisan lazán csatolva, az egyes részegységeket egyszerűen cserélhetően, tesztelhetően, rétegekre és részekre bonthatóan ad megoldást. Mindezt úgy, hogy az adott részfeladat megvalósítását képes elrejteni előled.*
Példák:
A téged érintő világot objektumokkal modellezed le. Például vegyünk egy webshopot: vannak benne Termékkategória, Termék, Termékkép, Terméktulajdonság, Vevő, Kosár, Kosárelem, stb. objektumod. Ezeket szépen lemodellezed, az objektumoknál szépen felvésed a viselkedését is hozzácsatolva az objektumhoz. Pl. a Kosár.KosárbaTesz(Termék) metódusod módosít a kosár tartalmán. Ez eddig ugye trivi.
Viszont amibe már nagyon sokan nem gondolnak bele, hogy objektumokkal nem csak "tárgyakat" lehet modellezni, hanem folyamatokat vagy magát az alkalmazást is. Példa: van egy termékkategóriád amely tartalmaz magában Termék objektumokat. Te ezt meg akarod jeleníteni de a felhasználó kiválaszthatja, hogy név vagy ár szerint akarja rendezni. Ilyenkor készítesz egy egy RendezveListázó absztrakt osztályt, majd ebből származtatsz egy név és egy ár szerint rendező objektumot majd ezzel rendezteted. (Egyébként nagyjából ez a strategy pattern lényege).
Na de te ki akarod szervezni az egészet egy külső modulba ami teljesen cserélhető. Ekkor már bejön az az (egyébként nagyon elhanyagolt alapelv, hogy) felületre fejlesztés. Te csak annyit tudsz, hogy van egy IRendezveListázó interface-d, amelyről annyit tudsz, hogy van egy Rendez(Termékkategória) metódusa. Arról, hogy mi és hogyan van mögötte implementálva, arról fogalmad sem lehet, az számodra egy fekete doboz. Ami mögötte van az cserélhető, jöhet bárhonnan, míg megvalósítja azt a "felületet".
Vagy például mondhatnám a melóhelyi projektem: az úgy néz ki, hogy minden modul egy külön dll. (.NET-es a cucc), amelyben vannak modulok, amelyek implementálhatnak ilyen-olyan interfacet. Természetesen ezek a modulok hívogatják egymást. Meg lehetne csinálni azt is, hogy minden modul hordozza magával a saját singletonját/globális változóját/static változóját/egyéb kedvenc megoldását de meg lehet csinálni azt is, hogy van egy Application objektum, amelytől le lehet kérni adott interface-t megvalósító modulokat. Aztán, hogy azon belül hogyan van megvalósítva egy modul (vagy egyáltalán melyik .dll-t tölti be) az már csak és kizárólag a config fájltól függ.
* Egyébként szerintem sokaknak ez a problémája, hogy nem képesek absztrakt fogalmakkal dolgozni. pl. ott egy sima mezei echo "bizbasz", ami megjelenít egy szöveget a képernyőn/weblapon/bármin. Valójában ez akár sok-tízezer CPU utasítás lehet, azonban számukra egy egyszerű, elemi művelet. Viszont úgy látom, hogy sokakat zavar, hogy ha nem látják pontosan a szemük előtt a megvalósítást. Pl. 6 példányban CTRL+C,V-zett listázó, mert nem tudott az elvont "Valamit Listázó" fogalmával megbarátkozni, csak azzal, hogy ez a kód itt egy olyan listázó, ami X-et kilistáz.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Ez jó cucc amit írtál, de úgy érzem, hogy akinek nincs OOP szemlélete, annak ez üres szöveg. Akinek meg van, az eleve így dolgozik. :-)
- A hozzászóláshoz be kell jelentkezni
Az OOP olyan, mint a vi: tudni kell használni és nem mondom, hogy egyszerű jól megtanulni.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
C++-ban sem lehet mindig elkerülni a makrózást. De inline függvények pl. már C99-ben is vannak.
Én kifejezetten örülök neki, hogy nincs konstruktor a C-ben. Egy kutya közönséges függvénnyel is meg lehet konstruálni egy objektumot, nem kell ehhez külön nyelvi elem. Ráadásul írhatok olyan konstruktorfüggvényt, amely pointert ad vissza a létrehozott objektumra (a C++ nyelvi elem csak értéket adhat vissza), így NULL-lal tudom jelezni, ha hiba van. Így aztán nem vagyok rákényszerítve a kivételkezelésre sem (másik borzasztó feature); C++-ban viszont csak úgy lehet a konstruktort failelni.
Hát virtuális metódusokat azt csinálok. Bár jelenleg azért fejlesztek C-ben, hogy lássam, hogy C++ nélkül is lehet élni. Eddig elég élhetőnek tűnik.
- A hozzászóláshoz be kell jelentkezni
Az ugye megvan, hogy ami C-ben lehetséges, az C++-ban is (eltekintve a variable length arraytől)? Tehát egy kutya közönséges függvénnyel tudsz konstruálni objektumokat, senki nem kényszerít a konstruktorok használatára. A konstruktor nem ad vissza semmiféle értéket, nem is értem, hogy keverted ide.
Illetve ha borzasztónak tartod a kivételkezelést, az mondjuk jelzi, hogy nem értesz a programozáshoz úgy általában.
Persze ha vezérlési szerkezetként van használva, az nem jó, de szar programot mindennel lehet csinálni.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
"Illetve ha borzasztónak tartod a kivételkezelést, az mondjuk jelzi, hogy nem értesz a programozáshoz úgy általában."
+1. Össze lehetne számolni, hogy hány helyen ellenőrzik egyáltalán a malloc eredményét...
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Na, ezt nem akartam írni, pedig pont ez jelzi azt, hogy a C fejlesztők hiszik azt, hogy végtelen a memória :)
- A hozzászóláshoz be kell jelentkezni
Pont ezt akartam kérdezni,hogy akkor minden egyes memóriafoglalásánál végig
kell nézni, hogy ha nem sikerült, akkor mit tudunk csinálni, hogyan tudunk
az adott ágból normálisan kiszállni? Nem teszi ez iszonyatosan bonyolulttá
a kódot? (ha kihagyom, akkor gondolom nem :))
- A hozzászóláshoz be kell jelentkezni
És tényleg... mivel a malloc a gyakorlatban soha nem vall kudarcot, ha normálisan van felparaméterezve.
- A hozzászóláshoz be kell jelentkezni
Mi garantálja neked C-ben azt, hogy van elég memória ahhoz az adott pillanatban, hogy a kívánt memóriatartományt le tudd foglalni. Mert szerintem semmi.
- A hozzászóláshoz be kell jelentkezni
A user előbb lövi le a programot az iszonyatos lassúság miatt, mint hogy a rendszer kifogyjon a swapból. :)
- A hozzászóláshoz be kell jelentkezni
Az ilyen hozzáállás miatt szokták szidni a C#/Java programozókat. :P
- A hozzászóláshoz be kell jelentkezni
Nem minden C-ben írt rendszer alatt van swap. Vagy akár filerendszer.
- A hozzászóláshoz be kell jelentkezni
Én mondjuk olyanokat még nem programoztam, de igaz. A lényeges kérdés azonban: mit tudsz csinálni, ha elfogy a memória, azon kívül, hogy kiírsz egy hibaüzenetet, és leállítod a programot?
- A hozzászóláshoz be kell jelentkezni
Pl. üríted a cache-t, amiben az objektumaidat tárolod. Én dolgoztam már ilyen rendszerrel, saját cache-ünk volt embedded device-on, ami nyilvánvalóan sokat gyorsított, viszont ha kellett az új, "hasznos" memória, akkor kellett futtatni egy GC-t.
Attól, hogy nem láttál még ilyen rendszereket, valószínűleg kismillió lehetőség van.
- A hozzászóláshoz be kell jelentkezni
De itt már gyakorlatilag saját memory managementet implementáltál. És szükséged volt ehhez kivételkezelésre (csak hogy az eredeti kérdéskörhöz visszakanyarodjunk)?
- A hozzászóláshoz be kell jelentkezni
Erről beszéltem. Amikor strukturált programozó nekiáll objektum orientáltan próbálkozni,
aztán meglepődik, amikor az eddig használt megoldásai nem igazán működnek.
- A hozzászóláshoz be kell jelentkezni
"Az ugye megvan, hogy ami C-ben lehetséges, az C++-ban is (eltekintve a variable length arraytől)?"
Ez bizonyos alacsony-szintű optimalizációknál rendben is van, és hasznos.
De tessék azt megmondani, hogy akkor két olyan C++ programozó, amelyik a C++ nyelv különböző részhalmazát használja és tartja jó feature-nek, vajon egy nyelvet beszél-e? Hány nyelv is akkor a C++?
Mert nem csak nyelvek vannak, hanem szokások és konvenciók is, hogy mit hogyan szokás (kell) megcsinálni. Ezek mind szükségesek ahhoz, hogy több fejlesztő együtt tudjon működni.
Ha pedig valaki a C++ extra feature-eit inkább károsnak tartja, akkor nem érdemesebb inkább C-t használnia, hogy ezzel C programozónak kategorizálja magát, és a magához hasonló gondolkodásúak között mozogjon?
"Illetve ha borzasztónak tartod a kivételkezelést, az mondjuk jelzi, hogy nem értesz a programozáshoz úgy általában."
Szerintem a kivételkezelés csak egészen kivételes esetekben hasznos. Pl. ha olyan kódod van, ami nem tudja, hogy mit hív meg.
Konkrét példa arra, hogy hogyan ne használjuk a kivételkezelést: Java API.
Hint: kivételkezelés != hibakezelés. Nem minden hiba kivételes.
És ha már a szokásokról beszéltem: C++-ban van egy szörnyű következménye a kivételkezelés bevezetésének. Ez pedig az, hogy a szokás arra kényszerít, hogy exception safe code-ot írj, mert valaki előbb-utóbb úgyis kivételt fog keresztül küldeni a kódodon. Az exception safety pedig behozza a RAII-t, a destruktorokat és még egy pár dolgot, amire figyelni.
Overdesign. Ez az, amire a C++ (részben a szokás által) csábít és kényszerít. Ezért használok C-t, mert ott elég nagy a penalty az overdesignhoz, hogy ne csábuljon el az ember, és kezdjen el olyan dolgokkal foglalkozni, amire lehet, hogy soha nem lesz szükség.
- A hozzászóláshoz be kell jelentkezni
"Hány nyelv is akkor a C++?"
Többé kevésbé 1, de igazad van, hogy sokan sokféleképp használják. Ezért kell egy közös guideline, hogy adott projekten belül mit és hogy szabad használni. Ha az a szabály, hogy csak olyan kód kerülhet be, ami C és C++ fordítóval is lefordul, már előrelépés a C-hez képest, és innentől már látható, hogy megfelelő szabályozással megfelelő kód fog létrejönni. A C++ fícsöreit elhagyni csak azért, mert rettegsz a többi programozótól, ez olyan open source dolog. Pedig vannak jó open source példák is, lásd webkit.
A kivételkezelés igenis hibakezelés. Az a jó a kivételkezelésben, hogy az fogja kezelni a hibát, aki tudja, mit kezdjen vele, és ez teljesen automatikusan történik, az erőforrások leakelése nélkül. Nyílván nem mindig értelmes használni, de a C++ pont erre épít, hogy a programozó tudja, mikor melyik eszközhöz nyúljon.
Ha a te libed azt mondja, hogy NEM vagyok exception safe, akkor nem lesz az. Nem kényszerít senki rá, akkor a user fog vigyázni rá, hogy ne rakjon kivételdobást a konténereidbe, algoritmusaidba, vagy viseli a következményeket. C-ben sem kezel le mindenki minden hibát (csak hogy a legalapvetőbbet nézzük, a malloc hibáit), könyvtárakban sem.
Mellesleg az exception safety nagyrészt ingyen van (érdemes megnézni a standard könyvtárat ilyen szempontból), és ha neked a RAII egy olyan dolog, ami nyűg, akkor visszautalok arra, hogy nem érted ezt a programozás dolgot. A RAII olyan, mint egy falat kenyér, hatékony környezetben biztosítja az erőforrások felszabadítását.
"elég nagy a penalty az overdesignhoz, hogy ne csábuljon el az ember, és kezdjen el olyan dolgokkal foglalkozni, amire lehet, hogy soha nem lesz szükség."
És ezért nehéz robosztus programot írni C-ben.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
"Az a jó a kivételkezelésben, hogy az fogja kezelni a hibát, aki tudja"
Igen, a mesében így van. A gyakorlatban pedig az történik, hogy hiba esetén dobunk egy kivételt, az elkapással meg ráérünk addig várni, amik tesztelés során eszkalálódik egy kezeletlen kivétel.
A RAII nagyon jó dolog, a baj nem a RAII-val van. A baj az, hogy RAII nem egy opció, hanem egy kényszer, kötelező használni, mert az exceptionök kockázata mellett még mindig ez a legnormálisabb módja az erőforrás-felszabadításnak.
- A hozzászóláshoz be kell jelentkezni
Az még egy ideális helyzet, ha repül a kivétel, és nem kapja el semmi, mert akkor esély van arra, hogy egy logból kiderüljön, hogy a szokásos nem gömbölyűhöz képest sem gömbölyű valami.
Az igazán elegáns az, amikor a kivétel nagyon is el van kapva, és... és semmi... valami középrétegi hiba szépen, gondosan eltemetve egy catchben, utána az özönvízzel.
- A hozzászóláshoz be kell jelentkezni
Ha nem kapja el semmi a kivételt, hogyan keletkezne logsor?
Sokan elfelejtik amúgy azt, hogy kivételt ott kell elkapni, ahol tudunk vele valami értelmeset kezdeni. Ha olyan helyen kapunk el kivételt, ahol már nem vagy még nem lehet semmit csinálni a kivételt okozó helyzettel, akkor igazából édesmindegy a dolog.
- A hozzászóláshoz be kell jelentkezni
Kezeletlen kivétel => terminate => abort => coredump.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Gondolom ilyesmire gondolnak:
void method1() throws Method1Exception{
throw new Method1Exception();
}
void method2(){
try{
method1();
} catch (Method1Exception e){
// TODO something should happen here ...
}
}
De az ilyenek ellen a kódanalizátort kell bevetni..
- A hozzászóláshoz be kell jelentkezni
Es van is olyan kivetel, ahol a program ertelmesen nem tudja tovabb folytatni a futasat.
- A hozzászóláshoz be kell jelentkezni
Elmeséled, hogy mi a baj a Java-ban használt Exception kezeléssel? (szándékosan nem
fordítom magyarra). Érdekelne.
Java-ban úgy van megoldva, hogy van Runtime exception, ami bármikor jöhet, de alapvetően
nem kellene használni, aztán van a normál exception, amit te beleírsz a kódodba, hogy
ha ott valami elszáll, akkor bizony ez fog jönni, és erről a hívó fél tud, és neki
ezt kötelező lekezelnie.
"Nem minden hiba kivételes." ezt sem értem.
- A hozzászóláshoz be kell jelentkezni
A Java nyelv exception handlingjével nincs nagyobb bajom, szerintem elfogadhatóan meg van csinálva. A baj csak annyi, hogy a standard könyvtárban gyakorlatilag hibakezelés = exception-kezelés. Szerintem ez egy visszalépés a C hibakezeléséhez képest.
- A hozzászóláshoz be kell jelentkezni
Mondanál erre egy példát?
- A hozzászóláshoz be kell jelentkezni
Nem.
- A hozzászóláshoz be kell jelentkezni
"Pl. ha olyan kódod van, ami nem tudja, hogy mit hív meg."
Egy moduláris programnál meg gyakorlatilag ilyen hívások tömkelege van.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Hagyd, sokan nem tudják elképzelni a loosely coupled architektúrákat.
- A hozzászóláshoz be kell jelentkezni
Na, olyankor lehet értelme a kivételeknek.
- A hozzászóláshoz be kell jelentkezni
Jujj. A kivételkezelésnek vannak előnyei, amelyek normál programok esetén is hasznosak. Nem tökéletes, de a hibakódozásnál jobb az esetek nagy részében. Vannak nyelvek, amelyek ennél tovább mentek, pl. a Lisp.
- A hozzászóláshoz be kell jelentkezni
Hibakódnak akkor van értelme, hogyha az user felé jelenik meg: rövid, tömör és nyelvfüggetlen. De ez nem zárja ki az Exceptionokat.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
A Lisp egy high-level nyelv, sokkal inkább az, mint a C++ vagy Java. Ahogy már mondtam, a kivételkezelésnek lehet értelme, de káros egy mid-level nyelvre ráerőltetni, mint a C (ahogyan a C++ teszi), vagy orrba-szájba erőltetni hibakezelésre (ahogyan a Java standard könyvtár teszi).
De mondok egy nyelvet, amelyek nincs annyira távol a megszokottaktól, és helyén kezeli a kivételkezelést: Go.
- A hozzászóláshoz be kell jelentkezni
Kifejtenéd, hogy mi a baj a Java "orrba-szájba" kivétel "erőltetésével"?
- A hozzászóláshoz be kell jelentkezni
Keress ra mas hsz-eimre ebben a topicban, ahol arrol irok, hogy a Java-ban gyakorlatilag hibakezeles = kivetelkezeles, holott a hibak nagy resze egyaltalan nem kiveteles.
- A hozzászóláshoz be kell jelentkezni
Egyrészt konkrét példát nem adtál arra, amikor kivétellel jeleznek egy nem kivételes hibát (bár elhiszem, hogy van ilyen, nekem fejből egy eset sem ugrik be). Másrészt ez miért is baj? Attól, hogy a hiba nem kivételes, annak kezelésére épp ugyanolyan jól alkalmazható a kivételes hibákhoz használt megoldás.
- A hozzászóláshoz be kell jelentkezni
Pl. egy fajlt nem sikerul megnyitni. Azert baj, mert azt a hamis illuziot kelti, hogy ezt a hibat majd egyszer valaki kesobb elkapja, es lekezeli.
- A hozzászóláshoz be kell jelentkezni
Ebben mi a logikai bukfenc? Azt a műveletet adtam utasításba, hogy nyisson meg egy fájlt a rendszer. Nem sikerült, kaptam egy Exceptiont a képembe egyébként megyek tovább a megszokott módon.
Szerintem pont, hogy tisztábbá teszi a kódot az, hogy nem kiscsillió ellenőrzéssel túrom tele a kódot, hanem csak azt ellenőrzöm, ami valóban a logikához tartozik. Kivételes esetekkel (mivel a program szempontjából az volt az elvárt, hogy a fájl megnyitása sikerül, emiatt "kivétel") meg foglalkozok ott, ahol akarok vagy lehet.
Ha sehol nem lehet, akkor meg szálljon el az app/thread, mint a győzelmi zászló.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Mint már egyszer leírtam, java-ban az exception-ök jó részét KÖTELEZŐ elkapni. Nem opcionális,
hogy elkapod-e, vagy sem, hanem a fejlesztőnek a metódusban jeleznie kell, hogy ez bizony hibát
tud dobni, és a fejlesztőnek kötelező try-catch-be rakni, vagy továbbdobni.
Igy az egész logika végén valakinek muszáj elkapnia az exception-t, és ha ő ezzel utána nem
foglalkozik, az egy programozási hiba.
Példa:
FileInputStream fs = new FileInputStream("c:\temp.dat");
fs.read();
ezt így simán le sem írhatod, mert nem fog lefordulni. Helyette kötelező:
try{
FileInputStream fs = new FileInputStream("c:\temp.dat");
fs.read();
} catch (FileNotFoundException e){
// ide jön a hibakezelés...
}
- A hozzászóláshoz be kell jelentkezni
Ezt a tulajdonságát mondjuk nem túlzottan szeretem a Java-nak, ugyanis sokszor nagyon nem a közelében kell lekezelni a hibát, hanem jóval "odébb".
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Hát, van lehetőséged továbbdobni a hibát a hívó rétegnek, vagy pedig
lekezeled helyben. Láttál esetleg olyan megoldást, ahol ezt szebben
megcsinálták?
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Köszi, ez érdekes volt.
Viszont azzal nem értek egyet, hogy ha mondjuk használok 3 modult amik 3
különböző exception-t adnak, akkor azt az én metódusomnak ahogy vannak,
tovább kellene dobnia a felső szintnek.
Mi ezt a problémát úgy oldjuk meg, hogy a hívó fél elől elrejtjük a belső
exception-t. Ezzel nem szennyezzük szét az interface-t.
public interface MyInterface{
public void myMethod() throws MyException;
}
és az implementációban:
public class MyClass implements MyInterface{
void myMethod() throws MyException{
try {
... do some stuff
} catch (AException e){
throw new MyException(e);
} catch (BException e){
throw new MyException(e);
} catch (CException e){
.. ezzel már tudok valamit kezdeni
} finally{
.. itt pedig mindent lezárok
}
}
tehát a metódusom a hívó fél felé nem adja tovább
az összes lehetséges hibaokot, hanem szépen bezárja
egy saját exception-be. Ha valami okból a felső rétegnek
szüksége van mégis a belső exception típusára, akkor a
MyException-ből ki tudja vadászni.
- A hozzászóláshoz be kell jelentkezni
De ez értelmetlen. Van mondjuk egy modulom, amely termékeket kezel és van egy modulom, amely mondjuk a kosarat. Meg van egy modulom, amely tutujgatja mindkettőt közvetett módon, megfelelő interfacekon keresztül. Ha lekérdezek egy terméket, hogy átadjam a kosár modulnak, de érvénytelen cikkszámot adok át, akkor miért ne dobna Exceptiont a termékkezelő mopdul?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Alapelv, hogy a kivételt ott kapjuk el, ahol még értelmesen lehet vele valamit kezdeni. Csak amiatt, mert az APi azt kérte, hogy kapjuk el a kivételt, ne kapjunk el kivételt, nyugodtan dobjuk feljebb.
- A hozzászóláshoz be kell jelentkezni
Lásd lent. Ha interface "ellen" programozol, akkor ezt nem
biztos, hogy meg kell csinálnod.
- A hozzászóláshoz be kell jelentkezni
Nem ugyanarról beszélünk. Nem egymás melletti szintekről, hanem egymás
alatti szintekről.
A kérdés az, hogy mondjuk elszáll a termék lekérdezés egy adatbázis hiba miatt. Akkor mit csinálsz?
Ami szerintem a logikus:
class ProductLogicImplementation implements IProductLogic{
public void getProduct(int id) throws ProductNotAvailableException{
try{
return dao.getProduct(id);
} catch (SQLException e){
throw new ProductNotAvailabeException(e);
}
}
}
Az nem logikus, hogy tetszőleges Exception-t továbbdobunk, hogy aztán majd
a felső réteg lekezelje:
public void getProduct(int id) throws SQLExeption{...}
Mivel pl. semmi nem garantálja, hogy a jó eséllyel interfaceként hivatkozott
osztályból pont SQLException fog jönni, hiába dobja egy konkrét implementáció
éppen azt.
Erre most jöttem rá, de hát végülis jobb későn, mint soha :)
- A hozzászóláshoz be kell jelentkezni
"Az nem logikus, hogy tetszőleges Exception-t továbbdobunk"
Nem is ezt mondtam. A fenti példa jó.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
C# nekem ilyen szempontból szimpibb, hogy nem kényszeríti rám.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Amikor meg akarok nyitni egy fájlt, akkor azt azért teszem, mert szükségem van rá (vagyis utána olvasni/írni akarom a fájlt), vagyis az a feltételezésem, hogy a fájl ott van és van jogosultságom a megnyitására. Ha ez nem sikerül, az bizony kivételes hiba. Az más kérdés, hogy jóval nagyobb a valószínűsége ennek az exceptionnek a bekövetkezésére, mint mondjuk az OutOfMemoryExceptionnek, és gyakrabban is le lehet úgy kezelni, hogy a program folytathassa a futását.
Közben még az jutott eszembe, javaban azért tűnhet úgy, hogy túl sokat foglalkozik a kivételkezeléssel, mert checked exceptionök vannak, vagyis minden metódusban vagy kezelni kell a keletkező exceptiont, vagy jelezni, hogy továbbdobásra kerüljön. Ettől még nincs több kivételkezelés, mint máshol (pl. .net), csak jobban látszik a kódban.
- A hozzászóláshoz be kell jelentkezni
Magyarul nem ismered normálisan az OOP-t és/vagy eldöntötted egyes elemeiről, hogy elvből nem használod.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
Hallottam már elég sokat az OOP-ről, programoztam is olyan nyelvekben, amelyek ezt a paradigmát támogatják. De igazából nem tudom megmondani, mi az OOP, szerintem egy rakás bullshit, aminek az egyetlen haszna, hogy segít a hozzá nem értő fejlesztőknek strukturált spagetti kódot írni.
Amit meg tudok mondani, hogy C++-ban egyetlen olyan feature segíti az OO fejlesztést, ami nincs benne a C-ben. Ez pedig az, hogy a C++ compiler automatikusan legenerálja a virtuálismetódus-táblákat. A többi a C-ben is elérhető. Az meg, hogy van private-protected-public láthatóság, az nem egy lényeges/hasznos feature.
- A hozzászóláshoz be kell jelentkezni
Talán tervezhetővé teszi a programot, nem egy nagy spagetti kódot kell írni.
- A hozzászóláshoz be kell jelentkezni
Spaghetti kódot minden paradigmában lehet írni... de, hogy igazán spaghetti legyen OOP-re van szükség. ;)
- A hozzászóláshoz be kell jelentkezni
"Az meg, hogy van private-protected-public láthatóság, az nem egy lényeges/hasznos feature."
Oh. Már bánom, hogy kifejtettem neked fentebb a C-s rantolásról a véleményem. Egy ilyen után látom, te sem a hozzáértők táborát gazdagítod.
Hadd kérdezzek valamit: a constról mi a véleményed?
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Nézd, Stroustrup is megmondta, hogy a protected láthatóság egy hack, és gyakorlatban is általában úgy használják.
Az tiszta OOP-nek az felelne meg, ha az adattagok private-ek, a metódusok pedig public. Ezt pedig a C-ben magától értetődően megoldható. Egyszerűen nem kell berakni headerbe a struct definícióját, csak annyit hogy "struct Object;" vagy "typedef struct _Object *Object;". Ezzel már megvan a név, lehet rá pointert csinálni, és így meg lehet írni a headerben a függvény-prototípusokat. C++ épp ugyanúgy pointerként adja át az objektumot a metódusnak (this), csak ez el van rejtve. És ennek ellenére a C++ kényszerít, hogy fordítsd újra a kódod, ha valaki hozzárak a használt osztályhoz egy private adattagot (idióta value semantics). Jó, persze lehet pimpl-özni, de hol van az a C egyszerűségéhez képest, amikor ugyanazt adja, ami C-ben magától értetődő volt?
- A hozzászóláshoz be kell jelentkezni
Komolyan nem értem, minek vitatkozol, ha nem értesz a C++-hoz. Pointert pontosan ugyanúgy lehet használni C++-ban is előre deklarálás után.
Csak ott kell az osztály definíciója, ahol konkrétan használod az osztály valamilyét, tehát létrehozol egy példányt belőle, meghívod egy függvényét, eléred egy adattagját.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Nem érted, mit mondtam.
Ha C++-ban azt írod: "obj.f(2)", akkor ott szükség van annak az osztálynak a definíciójára (természetesen adattagokkal), amelyikbe az obj tartozik.
- A hozzászóláshoz be kell jelentkezni
http://stackoverflow.com/questions/2672015/hiding-members-in-a-c-struct
Jelenleg a 3. válasz, amiben a kód úgy kezdődik, hogy struct SomeStruct;
Ha változik a private rész, nem fog az összes kód újrafordulni, ami használja az adott "osztályt". Ha C-ben megy, akkor gondolom C++ is megengedi, csak idegen tőle.
- A hozzászóláshoz be kell jelentkezni
"Hadd kérdezzek valamit: a constról mi a véleményed?"
Hopp, ez kimaradt.
Egy ideig szép dolognak tűnt, meg hasznos, meg fordítási idejű védelem, meg stb.
De amikor egy nem triviális esetben már nem tudom mennyi ideje azzal szopok, hogy normális legyen const-korrektség, és ne sírjon compiler, meg ne kelljen ocsmány const castokat alkalmazni, na, akkor megkérdőjelezem, hogy tényleg produktívabb lett-e ettől a fejlesztés.
Én azt gondolom, hogy sokkal inkább szolgálja a produktivitást, ha a fejlesztő odafigyel arra, amit éppen csinál, mint a C++ védelmi mechanizmusai.
- A hozzászóláshoz be kell jelentkezni
Ez igy eros, megalol.
- A hozzászóláshoz be kell jelentkezni
"• General rules:
C++’s evolution must be driven by real problems.
Don’t get involved in a sterile quest for perfection.
C++ must be useful now.
Every feature must have a reasonably obvious implementation.
Always provide a transition path.
C++ is a language, not a complete system.
Provide comprehensive support for each supported
style.
Don’t try to force people to use a specific programming style.
• Design support rules:
Support sound design notions.
Provide facilities for program organization.
Say what you mean.
All features must be affordable.
It is more important to allow a useful feature than to
prevent every misuse.
Support composition of software from separately developed parts.
• Language-technical rules:
No implicit violations of the static type system.
Provide as good support for user-defined types as for
built-in types.
Locality is good.
Avoid order dependencies.
If in doubt, pick the variant of a feature that is easiest
to teach.
Syntax matters (often in perverse ways).
Preprocessor usage should be eliminated.
• Low-level programming support rules:
Use traditional (dumb) linkers.
No gratuitous incompatibilities with C.
Leave no room for a lower-level language below C++
(except assembler).
What you don’t use, you don’t pay for (zero-overhead
rule).
If in doubt, provide means for manual control."
Bjarne Stroustrup
- A hozzászóláshoz be kell jelentkezni
Szerintem racionális magyarázata ennek nincs. A C++ simán használható extended C-ként, ami extra feature-t akarsz belőle használni, azt használod, amit nem akarsz, azt nem használod. Ha akarod, használhatod kényelmes C fordítónak is (// kommentek).
Én anno régen írtam Turbo C++ 1.0-ra programot, amit egy 4.77MHz-es PC/XT futtatott éveken át. Semmi template, semmi exception, semmi STL (ezeket szerintem nem is ismerte a fordító), sima objektumok, és ennyi.
A Java-t ne keverd ide, mert az GC-s nyelv, ami vagy tolerálható egy környezetben, vagy nem.
- A hozzászóláshoz be kell jelentkezni
Mert objektumorientáltság egyfajta gondolkodásmódot kíván, mintákkal, best-practice-okkal
együtt. Egy c programozó (de lehet pascal,etc.) ezt a C-ből/pascal-ból/etc. nem fogja
tudni levezetni, mert máshogy old meg bizonyos problémákat.
Megjegyzés: az objektumorientált gondolkodásmód azért sokat adott a programok tervezhetőségéhez...
- A hozzászóláshoz be kell jelentkezni
Egyetértek veled. Sokan bebizonyították már nekem, hogy a C kódok sokkal hosszabbak, és átláthatatlanabbak, mint a C++ Egyet is értek velük. Annyit akartam ezzel mondnai, hogy nekem jobban fekszik a C, és valóban igaz, C++-os munkám sokal kókányabb, mert nem ezt ismerem. Egyébként manapság van amolyan aha-élményem a c++-al kapcsolatban, hogy milyen remek ötlet ez az... Megvan a maga helye.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.
- A hozzászóláshoz be kell jelentkezni
ezért is teljesen ellenjavallom az OO programozás tanulását c++-ban.
Az a tapasztalatom, hogy az OO gondolkodásmód a tervezéssel, tervezési mintákkal, stb. java-ban nagyon hamar előjön, mert a java nyelv egy sok nehézséget levesz az ember nyakából, és jórészt a probléma OO alapú megoldásán tud gondolkodni, kevésbé a nyelvvel kell küzdeni. Mondhatni azt is, hogy belekényszeríti az embert, ami aztán ízlés kérdése, hogy ez jó, vagy nem jó.
Éppen ezért a java fejlesztők az idő jó részét architekturális tervezéssel, tervezési mintákkal való összelegózással, integrálással, unit teszteléssel töltik, aminek az a következménye, hogy egy átlagos csapat egy java szerű menedzselt (c#, etc.) nyelvben sokkal produktívabb, mint egy c++-os, és sokkal könyebb felhozni egy kevésbé jó képességű fejlesztőt használható szintre, mint c++ esetén.
- A hozzászóláshoz be kell jelentkezni
"Az a tapasztalatom, hogy az OO gondolkodásmód a tervezéssel, tervezési mintákkal, stb. java-ban nagyon hamar előjön, "
Az én tapasztalatom az, hogy ami hamar előjön, az csupán annyi, hogy legalább egy osztály mindenképpen létezik... a többi jól megtervezett kopipészt.
De ez nem is csoda: az absztraháláshoz érni kell, mint a blueshoz (korán érő tehetségek és zsenik léteznek). Nincs az a nyelvi kényszerítő eszköz, ami ezt pótolja.
- A hozzászóláshoz be kell jelentkezni
"... és sokkal könyebb felhozni egy kevésbé jó képességű fejlesztőt használható szintre, mint c++ esetén."
:)
Igen könyebben lehet irni "működő" szemetet, és be kell vallani, hogy a "fejlesztők" legalább 90% másra nem is képes (C++-ban makogni sem tudna).
Uncle Bob szépen mondta már, hogy sok "fejlesztő"-nek nem kellene ebben a szakmában dolgoznia, a programozás nem munka hanem mesterség, hivatás és az aki nem azért csinálja mert szereti az inkább ne csinálja!
- A hozzászóláshoz be kell jelentkezni
Mit értesz működő szemét alatt? Tényleg kíváncsi lennék... mert bizony nem kevés c/c++ kódot láttam segfault-tal elszállni, szóval
nem igazán a nyelv határozza meg, hogy adott program jó-e, vagy sem, hanem az, hogy a célnak, amire készült, megfelel-e.
Tovább megyek: mi indokolja 2013-ban, hogy egy fejlesztőnek memória foglalással, stack vagy heap-en létrehozott objektumokkal,
copy construktorokkal, ki-kinek a tulajdonosa, 32 vagy 64 bites rendszerek közötti különbséggel, és egyéb hasonló problémákkal
küzdjön, ahelyett, hogy a feladatot oldaná meg. Mert a sokat hangoztatott "teljesítmény miatt" általában nem igaz, a programok
80-90%-ban ha az adott termék normálisan megtervezett, megfelelő algoritmusok vannak használva (nem O(n^x) lehetőség szerint)
nem szokott probléma lenni, nagyon ritkán van szükség bitvadászatra.
- A hozzászóláshoz be kell jelentkezni
Ha jól tévedek, az alaptétel az volt, hogy a java a kezdetektől jó fejlesztői magaviseletre nevel.
Ezzel szemben ami a kezdetektől megjelenik, az az a viselkedés, hogy bármekkora objektumot bármikor le lehet és érdemes foglalni és bármeddig életben tartani, ami abból a hitből ered, hogy memória, az mindig van, és amikor nincs, a gc mindig pont úgy intézi, hogy jó legyen.
Ezt a viselkedést és hitet csak autoszívás, vagy főnöki/megrendelői pofonok tudják kiverni, miután kiderül, hogy egy (szemét) program csak-csak elvan egy jvm-ben (a finalizer sóhajt egyet, és elvégzi a rabszolgamunkát), de amint több ilyen appnak kéne egy motoron osztoznia, előjön a mindenki szív mindenki miatt jelenség -- pedig, illetve mert a gc tényleg megtesz minden tőle telhetőt.
- A hozzászóláshoz be kell jelentkezni
A félreértés: nem igaz, hogy bármennyi memória van. Ha egy java fejleszőtől ezt hallottad, akkor valamit nagyon benézett. JVM-ben induláskor meg tudod adni, hogy mi
az a max heap méret, amit garantálnia kell tudni. Erre való a -Xmx paraméter. Ezután, ha a fejlesztő több memóriát foglal le, akkor bizony kap egy out of memory
excepion-t a vm-től, és lehet dolgozni a feladaton. Általában ilyenkor egy profiler-t kell indítani, megnézni,hogy mi az, ami sokat zabál, és megoldani, hogy ezt
ne tegye.
- A hozzászóláshoz be kell jelentkezni
" nem igaz, hogy bármennyi memória van. Ha egy java fejleszőtől ezt hallottad, akkor valamit nagyon benézett. JVM-ben induláskor meg tudod adni, hogy mi
az a max heap méret, amit garantálnia kell tudni. Erre való a -Xmx paraméter. "
Oszt ha meghallják, hogy a szerverben a JVM 2, 3, 4 gigáján túl még van pártucat giga, akkor sértődötten követelik annak a hozzácsapását is, szándékosan észre nem véve, hogy a 2, 3, 4 G GC ciklusai már kézifék, fékezőernyő és horgony együttes aktiválását jelentik, és a GC log a finalizer üzenőfalának tekinthető.
- A hozzászóláshoz be kell jelentkezni
A lusta fejlesztők ellen nincs védelem, akármilyen nyelvben is programozzanak. Esetleg
parallel gc-t, meg a jdk 1.7-ben bejött új GC verziókkal próbálkoztatok már?
- A hozzászóláshoz be kell jelentkezni
"A lusta fejlesztők ellen nincs védelem"
Ide akartam kilyukadni. A java az ájtí aloe verája: a jó píár ellenére nem lesz tőle fittebb vagy pedánsabb, aki alapból igénytelen.
- A hozzászóláshoz be kell jelentkezni
En a Java helyett a manapsag divatos dinamikusan tipusos szkriptnyelveket mondanam aloe veranak, mint pl. a Ruby, Scala, Python es tarsaik.
Aki nem tud programozni, az ezekben a nyelvekben sem fog tudni programozni. Hiaba old meg helyetted a Rails sok mindent, aki nem tudja, hogy mit csinal, az nem fog tudni osszedobni egy blogot benne 15 perc alatt :)
- A hozzászóláshoz be kell jelentkezni
JVM-ben korlátos a memória, a JVM-nek megadható, hogy mennyi a maximálisan használható heap méret, alapértelmezetten a memória egynegyede vagy 1GB érték közül a kisebb érték.
Pont a Java fejlesztők tudják a legjobban, hogy véges a rendelkezésükre álló memória.
- A hozzászóláshoz be kell jelentkezni
Nekem 32GB van a gépben, de már két évvel ezelőtt is 16GB volt... mégis úgy állok neki mintha 64KB lenne (pazarlás szempontjából) :)
JVM, CLR vagy XYZ... csak azért mert sok memória van nem kell pazarolni. Használni kell a memóriát mert lényegessen jobb lessz a szoftver, de pazarolni nem kell.
- A hozzászóláshoz be kell jelentkezni
Senki nem mondta, hogy parazolni kell, arrol volt szo, hogy a java fejlesztok azt hiszik, vegtelen a memoria. Pedig pontosan ok tudjak, hogy veges :)
- A hozzászóláshoz be kell jelentkezni
Annak az eredménye pedig nem más mint pazarlás.
- A hozzászóláshoz be kell jelentkezni
Ez logikailag hogy jött ki? :)
- A hozzászóláshoz be kell jelentkezni
if programmer_believe_memory_is_infinite is true
-> programmer_care_about_memory_use is false
-> programmer_waste_memory is true
- A hozzászóláshoz be kell jelentkezni
De pont ezaz, hogy a Java fejleszto NEM hiszi, hogy vegtelen a memoria. Azaz a feltetel nem teljesul, onnantol kezdve nem igaz a kovetkeztetes sem.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Tehát a Java programozó, számolja a byte-okat? Gondolom a GC is arra ösztönzi... :)
Egyébként ha még nem világos, nekem semmi bajom a Java-val... (vagy akármelyik másik nyelvel) a rossz "programozókkal" viszont annál inkább ;)
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Valószínűleg ami itt hiányzik az a "Java fejlesztő" fogalom pontos definíciója.
A definíció hiányában értjük félre egymást.
Ha úgy definiáljuk, hogy Java fejlesztő az, aki már eljutott odáig, hogy ne higgye, hogy a memória (akár a fizikai, akár a JVM-é) a végtelenségig növelhető (mellékhatás nélkül), akkor egyetértek mindennel, és elnézést kérek az összes Java fejlesztőtől, mind a háromtól. (kidding)
- A hozzászóláshoz be kell jelentkezni
Pl. mert szükséged van teljesítményre?
Mindenkinek van war-story-ja erről. A VM sok esetben szűk keresztmetszet lehet.
Emlékszem, hogy kollega .NET-ben több ezer képen kellett, hogy dolgozzon, egy akkoriban izmos szerveren.
Mit ad Isten az lett a vége, hogy heap-pel és memória felszabadítással kellett szívnia .NET alatt.
Az "O(n) limit elégséges" szemlélet sokszor a kódot régen látott elméleti srácok sajátja. Bizony az O(n) előtt kihagyott konstans szorzó az, ami miatt szívunk.
Amúgy nem csak szerverek vannak. Az olyan arcok mint Te, elfelejtik, hogy a jelenlegi HW-ek 95%-án nincsen virtuális memória, és sajnos a rendszer-malloc sok esetben gagyi. Ebből az következik, a fejlesztő FŐ feladata, hogy stack és heap használatot optimalizáljon. Bizony, vannak területek, ahol ez különbözteti meg az amatőrt a profitól.
Feladatra koncentrálás: röhögnöm kell, amikor az i3 CPU-m 30%-át eszi vmelyik VM zenelejátszáskor.
- A hozzászóláshoz be kell jelentkezni
Most ugye embedded fejlesztésről beszélünk? Nyilván embedded fejlesztés egy teljesen különálló történet.
Mert átlag gépnél (legyen az desktop vagy szerver) tudom értelmezni a "nincs virtuális memória" kitételt. Egyébként se látom, hogy ez hogy kapcsolódik a virtuális gépekhez, Java-ban a VM-nek megadod, hogy mennyi a max heap méret (-Xmx512m pl.), ebből gazdálkodhat, ebbe kell beleférni. Ha nem fér bele, akkor dobja az OutOfMemoryException-t.
- A hozzászóláshoz be kell jelentkezni
Az amit nagyon nehéz továbbfejleszteni mert egy totál spaghetti (tudod az a VB mentalitással fejlesztett kód ami kb. 1000x komplikáltabb mint kellene és egy "super coupled dependency jungle"... de működik.
Egyébként én elég sokat .NET/C# (ASP.NET MVC) dolgozok, de ha nem ismered a CLR-t, annak viszonyát a géphez és OS-hez, akkor nem vagy jó programozó. Szóval "write high level, abstract as much as you should (but not more than that), but think low level".
Egyébként a legtöbb szoftver esetében nem az algoritmusokkal van a gond, hanem a "komponensek" egymáshoz viszonyulásával és az 1000x nagyobb komplexitással mint ami kell.
- A hozzászóláshoz be kell jelentkezni
Jajj, VB mentalitással fejlesztett kód. Olyat nekünk is kellett átvenni. Leginkább a kerékbetörést tudtam volna ajánlani a "kedves fejlesztőnek",
napjában kétszer... :)
- A hozzászóláshoz be kell jelentkezni
Milyen igaz.
- A hozzászóláshoz be kell jelentkezni
Ha más nem (mint pl. OO nyelvek C forrása), a GTK (amúgy bűnronda) API-ja a példa rá, hogy aki akar, egyszerre lehet a két szemléletmódban... valamennyire.
- A hozzászóláshoz be kell jelentkezni
Rondaság ízlés kérdése. Meg lehet szokni.
- A hozzászóláshoz be kell jelentkezni
A szubjektív sík megkérdőjelezhetetlen, de amit "meg lehet/kell szokni", annál azért felvetődik, hogy nem tetszik érdek nélkül.
- A hozzászóláshoz be kell jelentkezni
"tanulható/csinálható"
Azért nagyon nem mindegy, hogy melyikről van szó. Egy (tetszőleges) programozási nyelvet megtanulni nem nehéz, ellenben programozni megtanulni nehezebb, és eltart egy darabig. A C++ sem annyira nehezen tanulható nyelv, ellenben megtanulni C++-ban programozni sokkal nehezebb.
- A hozzászóláshoz be kell jelentkezni
Nem. Egy nyelv nem csak maga a nyelv, hanem a stilus is és ami még fontosabb, a módszerek amelyekkel az adott nyelvben megoldod a problémákat. Minden nyelvre más expressiveness/permissiveness jellemző, és nem mindegy, hogy milyen a gondolkodásod amikor használod. Ha mondjuk Java-ban gondolkodsz (vagy C-ben, Python-ban stb.) akkor függetlenül, hogy ismered e a C++ alapjait, nem fogsz jó C++ kódot irni... és ha nem tudsz jó kódot irni akkor (praktikus és produktiv szempontból) nem is tanultad meg a nyelvet.
- A hozzászóláshoz be kell jelentkezni
Az igazi programozó bármilyen programnyelven képes Fortran programot írni :D
- A hozzászóláshoz be kell jelentkezni
Megnéznék egy prologban írt fortran programot :)
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Vagy Forth-ban.
- A hozzászóláshoz be kell jelentkezni
Tudom, hogy a legöregebb "dinoszaurusz nyelvek" között van a fortran, de akkor is a kedvencem. Matekra nagyon jó, és gyorsan futó binárist ad.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.
- A hozzászóláshoz be kell jelentkezni
Kedvencem a másik "dinoszaurusz nyelv" a Lisp :) csak annyi, hogy a Lisp az még mindég verhetetlen... és az is marad. :)
...és persze a C is...
...egyébként minden más nyelv a Lisp és a C között van... (assembly az nem nyelv!)
"The most powerful programming language is Lisp. If you don't know Lisp (or its variant, Scheme), you don't know what it means for a programming language to be powerful and elegant. Once you learn Lisp, you will understand what is lacking in most other languages." - RMS
- A hozzászóláshoz be kell jelentkezni
Többször is volt futó lelkesedésem, hogy én most ránézek mi a nagy hűhó a LISP körül, de soha nem találtam egy olyan leírást sem, ami az alapoktól indul, ami nem a gyakorlati programozásba akar bevezetni valami variánson keresztül, hanem konkrétan az alapfogalmakba, a lényegi részbe magyaráz bele. Ha tudsz ilyet, szeretettel várom.
És ugye tudod, hogy egy RMS idézet általában nem segít a népszerűsítésben?
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Clojure! - elég népszerű és nem RMS! :)
és ez talán segít: http://mitpress.mit.edu/sicp/
- A hozzászóláshoz be kell jelentkezni
Igen, pontosan erről beszélek, mindenhol lisp dialektusok vannak. Sehol sem a core.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Core?
- A hozzászóláshoz be kell jelentkezni
Semmilyen funkcionális nyelvet nem tanultál soha? ML? Erlang? Haskell?
Ha egyet megismersz, érted a lényeget.
- A hozzászóláshoz be kell jelentkezni
Haskellt szeretnék egy kicsit tanulni, de az volt a benyomásom, hogy a LISP az nem egy egyszerű funkcionális nyelv.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
A Lisp az multi-paradigm nyelv (functional is), a Haskell az purely functional...
- A hozzászóláshoz be kell jelentkezni
Igen, ezért nem értem, vl miért mondta, amit.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Azért írtam, mert aki már látott _bármilyen_ funkcionális programozási nyelvet, az utána már más funkcionális nyelvekre nem boci szemekkel fog nézni.
És hát tudtommal informatika szakokon legalább egy funkcionális nyelvvel illik összeismertetni a hallgatókat, már csak azért, hogy tudják, hogy léteznek ilyenek.
- A hozzászóláshoz be kell jelentkezni
Nem tartottam soha sokra a tisztán valamilyen nyelveket, funkcionális elemei meg bőven vannak pl a Pythonnak is. Tudok egy csomó mindent a funkcionális nyelvekről, de a LISP nekem úgy jött át, hogy az egy ilyen generál nyelv, minden nyelvek nyelve, amiben bármi kifejezhető.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Bármi... és még azon túl :)
- A hozzászóláshoz be kell jelentkezni
szvsz egy gyorstalpaló bármiből a lehető leghatékonyabb tanulási módszer.
Egyrészt gondolni kell arra, hogy az ember ember és gyors sikerélményt akar, másrészt meg egyébként is: ráér a dolgokkal akkor foglalkozni, amikor kell. Mondjuk 21 napra 21 A4-es papíron mennyi minden elfér - ellentétben a 600+ oldalas, témakörök szerint tagolt szakkönyvekkel
- A hozzászóláshoz be kell jelentkezni
sub
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
javazz inkabb ;)
- A hozzászóláshoz be kell jelentkezni
Jah, ahhoz elég egy gyorstalpaló :)
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
C++ kód írásához is elég egy gyorstalpaló, csak mások C++ kódjának az értelmezéséhez nagyon nem elég.
- A hozzászóláshoz be kell jelentkezni
talan mert nem egy okadek, hulladek nyelv, mint a cpp :)
- A hozzászóláshoz be kell jelentkezni
Persze, szögelni is könnyű megtanulni, de ha minden problémát szöggel és kalapáccsal akarsz megoldani, problémáid lesznek.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Amikor egy éve programoztam C++-ban, azt hittem jó nyelv.
Öt év után azt hittem, okádék.
Most valahol a 7.-9. évnél járok, és most úgy érzem, hogy nagyon szép, letisztult nyelv. Főleg a C++11.
- A hozzászóláshoz be kell jelentkezni
A C++ nagyon jó nyelv, csak tudni kell használni. Egyébként nem tudom miért gondolod, hogy a C++11 letisztult? Hiszen semmitől sem lett megfosztva, csak kapott olyan újdonságokat amelyek még jobban növelik az erejét és még jobban megerősítik azt, hogy "tudni kell használni".
- A hozzászóláshoz be kell jelentkezni
Sokkal könnyebb deklaratívan programozni.
Könnyebb tisztábban kifejezni az ideáidat (deleted/defaulted függvények, move szemantika, constexpr, user defined literálok, meg még ami nem jut eszembe).
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
+ std::shared_ptr, rvalues
- A hozzászóláshoz be kell jelentkezni
A C++ igazán nagy értéke nem az, hogy könnyű (mert még véletlenül sem az), hanem az, hogy gyakorlatilag nem korlátoz, nem akar semmire sem kényszeriteni (sem OOP sem XYZ...). Ezért lehet benne nagyokat alkotni és ezért lehet benne kinyirni is magad (főleg, ha nem tudod mit csinálsz).
- A hozzászóláshoz be kell jelentkezni
Ahogy idosodok, egyre inkabb egyetertek a C++ bizottsag donteseivel.
Pl. regen nem ertettem, hogy miert nem a konstruktor inicializalasi listaja donti el a hivasi sorrendet. Ez azert volt, mert meg nem nott ki a fejem. Most mar ertem, es magam sem csinalnam maskeppen.
Ezt jelenti szamomra a letisztult.
- A hozzászóláshoz be kell jelentkezni
1990-ben kezdtem használni... Borland Turbo C++...
- A hozzászóláshoz be kell jelentkezni
Hubazdmeg, akkor te vagy a master programmer! :-)
- A hozzászóláshoz be kell jelentkezni
:) nope, there is no such thing as master in programming... only continuous learning (and unlearning).
- A hozzászóláshoz be kell jelentkezni
A Zortech C++ volt at első normális C++ compiler i386 környezetben.
A Borland ipari tanuló sem volt akkor még.
:)
---------------------------------------------------
Talisker Single Malt Scotch Whisky aged 10 years :)
- A hozzászóláshoz be kell jelentkezni
C++ in 6 days
Day 1: variables, conditional blocks
Day 2: loops, operators, stdin, stdout
Day 3: functions, arrays
Day 0x400d08: pointers, dynamic memory
Segmentation fault
- A hozzászóláshoz be kell jelentkezni
C++ in 24 hours:
Hour 1: basics
...
...
...
Hour 24: go home and write some disastrous, wretched, miserable code!
- A hozzászóláshoz be kell jelentkezni
Nem ezt a képet kerested? :-)
- A hozzászóláshoz be kell jelentkezni
Nope... 21 days is too long :) we need something faster... we need 24 hours :)
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Az a gyorstalpalt C++ olyan, mint lefogyni 30 nap alatt 30 kg-t (megoldható, csak nem érdemes)?
- A hozzászóláshoz be kell jelentkezni
Jó szar példa.
A programozást ill. annak a tanulását, bármilyen nyelvről legyen is szó, valahogyan el kell kezdeni. Arra pedig egy gyorstalpaló is megfelelő lehet. Persze tisztába kell lenni a tudásszinttel, és ennek tudatában használni ezt a tudást. És ez az utóbbi mondat minden tudásszintre igaz, bár az elején fontosabb.
A kérdező még csak nem is utalt rá, hogy olyan gyorstalpalóra vágyik, ami után egyből profi lesz.
- A hozzászóláshoz be kell jelentkezni
Olyan is van? ;)
- A hozzászóláshoz be kell jelentkezni
+sub
---------------------------------------------------
Talisker Single Malt Scotch Whisky aged 10 years :)
- A hozzászóláshoz be kell jelentkezni
Yep. De az Ardbeg Corryvreckan kiüti a Taliskert felkészülés nélkül! ;)
- A hozzászóláshoz be kell jelentkezni
Ajánlom figyelmedbe ezt is ... ha már :)
Benrinnes 1974 | 21 Year Old | Rare Malts Selection
60.4% - mennyei
Meg hát a "Classics": Oban, Glenkinchie, Cragganmore, Talisker, Dalwhinnie, Lagavulin
---------------------------------------------------
Talisker Single Malt Scotch Whisky aged 10 years :)
- A hozzászóláshoz be kell jelentkezni
Caol Ila, Macallan és még a Kilchoman sem rossz, esetleg még Bowmore és Dalmore :)
A felsoroltak közül még csak a Dalwhinnie-hez és a Benrinnes 1974-hez nem volt szerencsém :)
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Bármit csak ezt ne! Lehetőleg ne kezdjen egy újabb szerencsétlen egy óriási vendor lock-innal meg a végtelenül szabványos és "szép" system("PAUSE")-val. :(
- A hozzászóláshoz be kell jelentkezni
Már vártam erre is.
- A hozzászóláshoz be kell jelentkezni
Még mindig jobb, mint amikor void maint írnak, mert a 10 éves C++ könyvük azt mondta, mert turbó c-t használt.
A system pause-t én sem szeretem, mert nem a problémát oldja meg (ti. eltűnik a konzolablak), hanem workaround, amikor pedig simán meg is lehetne oldani (indítsd konzolból bmeg).
De legalább találkozik a kölök a system függvénnyel.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
Igen, egy workaround egy sor cout-ra es utána egy sor cin-re ;) És ez a két soros megoldás helyette nem jó, mert véletlenül pont platformfüggetlen :(
- A hozzászóláshoz be kell jelentkezni
Azt nem mondanám, hogy platformfüggetlen, hiszen nincs garantálva, hogy any keyre a cin fog olvasni valamit, még enterre sincs garantálva, hogy a konzol azt oda fogja adni a cinnek. De lényegesen függetlenebb, mint bármilyen system hívás. Persze még mindig jobb lenne, ha a kezdő eleve IDÉtlenül programozna, mert C/C++ világban a fordítási modell megértése nélkül nagyon sokat lehet szívni, azt pedig IDE nélkül a legkönnyebb megtanulni.
----
India delenda est.
Hülye pelikán
- A hozzászóláshoz be kell jelentkezni
+1
Ellenben amit a kollega linkelt, az kapásból a Visual Studio jelenlétére épít. Nem rossz az a Visual Studio (sőt, kifejezetten jó IDE haladóknak), de ne azzal kezdjen már az ember több okból sem.
- A hozzászóláshoz be kell jelentkezni
"simán meg is lehetne oldani (indítsd konzolból bmeg)."
Én be szoktam rakni egy breakpointot. :)
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Halihó!
Milyen jellegű programnyelveket ismersz? C, C#, Java? Vagy esetleg a scriptnyelvekben vagy otthon?
Szerintem elég időigényes dolog megérteni a C++ -t azoknak, akik még nem foglalkoztak olyan programnyelvekkel, ahol ennyire figyelni kell a memóriakezelésre.
Bár ezzel nem elrettenteni akarlak e remek nyelv megismerésétől, de én úgy tudom, hogy kevés ember van, akinek pikk pakk sikerül elsajátítania.
- A hozzászóláshoz be kell jelentkezni
Főleg scriptnyelvekben: PHP, Python, JS, régről Delphi/Pascal
--
Kum G.
Linux pólók HUP pólók Linux tanga
- A hozzászóláshoz be kell jelentkezni
Hát én inkább egy Javát, vagy egy C#-ot ajánlanék átmenetnek a C++ -hoz. Szerintem itt is nagyok az eltérések a scriptnyelvekhez képest.
- A hozzászóláshoz be kell jelentkezni
Azért a Pascal/Delphi pont abban áll közelebb a C++-hoz, mint amiben a általában szkriptnyelvek és a Java is távolabb
- A hozzászóláshoz be kell jelentkezni
Azt sajnos nem ismerem.
- A hozzászóláshoz be kell jelentkezni
A hőskorban és empatikusabb iskolákban ma is a deklarált statikus változós pascalos alapozás után zúdították/ják rá az érzékenyebb lelkű diákságra a heapkezelést a pontereivel (még mindig Pascalban), hogy miután ott készségszinten beivódott mindez, C-ben, mint szükséges alapismeretet használatba vehessék.
- A hozzászóláshoz be kell jelentkezni
Nem gyorstalpaláshoz, de C++ -hoz:
http://hup.hu/node/121405
--
unix -- több, mint kód. filozófia.
Life is feudal
- A hozzászóláshoz be kell jelentkezni
Köszönöm szépen mindenkinek a segítséget!
--
Kum G.
Linux pólók HUP pólók Linux tanga
- A hozzászóláshoz be kell jelentkezni