wlibaers
Legacy Member
Jormungand zei:Er zijn wel degelijk duidelijk gedefinieerde regels waaraan een taal moet voldoen om als een OOP taal door het leven te kunnen gaan. De talen die ik opnoemde voldoen aan deze eisen met glans. Het is bv. niet zo dat indien een taal het concept van een class ondersteund, dat deze daarom ook aanzien kan worden als een echte volwaardige OOP taal.
"OOP is subject to much contention as to its precise definition or its principal ideas."
http://en.wikipedia.org/wiki/Object-oriented_programming
Talen zoals Python en Objective-C hebben bijvoorbeeld bepaalde OOP-eigenschappen, maar niet alle delen van C++ of Java (private bijvoorbeeld ontbreekt, of wordt niet afgedwongen). Zijn dat dan geen OO talen? Nochtans worden ze wel vaak zo beschreven. C++ zelf zou je trouwens ook als gedeeltelijk niet-OOP kunnen beschouwen, omwille van het feit dat niet alles een object is en je losse functies hebt.
Bullshit. Ik heb hier nooit zitten zeggen dat niet-OO programmeurs per definitie slechts zijn, of sterker nog, losers zijn. De autheur van dat artikel moet nog volwassen worden.
Blijvende aanvallen op de persoon zonder te zeggen wat er specifiek mis mee is.
Er kan inderdaad goede code in C (bv.) geschreven worden, maar die begint al heel sterk te lijken op het concept van classes, dus waarom toch blijven volharden en het uzelf moeilijker (blijven) maken?
Er kunnen praktische redenen bestaan. Net zoals de reden voor het gebruik van C in DLL's bijvoorbeeld.
Populaire talen van het moment? C++ is een taal die er al van 1983 bestaat.
Begin dus niet te beweren dat die een populair taaltje van het moment is he. C++ is een volwassen taal, met zeer krachtige features. En tot op vandaag, met alle concurentie die ze krijgt van bv. Java, C# en zelfs VB.NET staat deze taal nog steeds zeer sterk. En ik wil hiermee ook niet zeggen dat die andere talen niet deugen (allee behalve VB dan).
Bij die uitspraak dacht ik eigenlijk eerder aan Java en C#. Sommigen zijn trouwens van mening dat geavanceerde macro's ("templates" in C++) belangrijker zijn dan de pure OOP-eigenschappen van de taal.
Zie het gelijk je wil, het is gewoon een feit dat veel legacy C code een grote mesthoop is. En dit heeft vooral te maken met (1) de ervaring van de programmeur, (2) dat een structured programming language een andere denkwijze in gang zet, met vaak dit verschrikkelijke resultaat.
Weet je, een gelijkaardige redenering werd door Dijkstra gebruikt tegen de hele praktijk van "software engineering" (inclusief OOP), door hem beschouwd als een soort kwakzalverij, door een volgens Dijkstra fundamenteel verkeerde aanpak van het probleem. http://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1024.html
(pagina 9)
Dat is weer zo een argument dat nergens op trekt. Je vergeet polymophism, een zeer belangrijk concept in OOP. En ja dat kan je ook nabootsten in C als je dat wil, ik zeg het al maar in jou plaats, maar dan ben je het jezelf wel zeer moeilijk aan't maken. Dat noem ik dan pas 'tijd verspillen'.
...
Wat ik dus zeker van jou ook kan zeggen. Je wil basis OOP technieken toepassen in bv. C. (Jou woorden: "Wat gewoon aantoont dat je geen "echte" OO taal nodig hebt om aan OO te doen."). Maar je wil zeker niet dit doen met een echte OOP taal. Dat noem ik nu eens koppig zijn en het uzelf moeilijk maken, of met jou woorden 'fanatisme'.
hetzelfde geldt voor "echte" OOP-talen. Want wat in die "echte" OOP programmeertalen voor polymorfisme doorgaat is maar een mager beestje hoor. Even verduidelijken?
"A programming language is low level when its programs require
attention to the irrelevant." - Alan Perlis
Dit is bijvoorbeeld toe te passen op geheugenbeheer. Als je geen specifieke strikte eisen stelt aan het geheugenbeheer (qua prestaties en ingenomen ruimte) ben je bijvoorbeeld doorgaans beter af met automatisch beheer (garbage collector) dan met manueel beheer (new/delete eventueel in combinatie met RAII, wat ook nog voor andere zaken toepasbaar is). Hetzelfde kan gezegd worden over vele OOP technieken. Wat jij als echte OOP-talen beschouwd zijn talen die specifieke uitbreidingen van de syntax hebben die dienen als afkortingen voor de code die je in eerdere programmeertalen zou moeten schrijven als je die functionaliteit wou.
Polymorfisme is daarvan een voorbeeld. In de oude stijl had je voor een functienaam een enkele echte functie die een enkele set argumenten kon aanvaarden. De zgn. "echte" OOP talen laten dan een specialisatie toe op basis van het eerste argument, door middel van speciale syntax (doorgaans a.f(b, c) i.p.v. het oude f(a, b, c), plus vaak nog extra sleutelwoorden zoals "virtual".
In bepaalde andere talen (die "wannabee OO taaltjes"?) heb je dan weer de zogenaamde generieke functie, die met een standaard syntax toelaat om op eender welk aantal parameters te specialiseren, zelfs als deze tijdens de compilatie nog onbekend zijn. C++ heeft ook iets in die zin, met de arbitraire (vanuit het standpunt van de gewone programmeur, voor de compilerschrijver is het belangrijk) restrictie dat het type tijdens de compilatie bekend moet zijn.
Dit is geen vergezocht voorbeeld. Dit soort generieke functie is geen zeldzaamheid. In de wereld van de "echte" OOP-talen staat dit, voor het geval van specialisatie op basis van twee parameters, bekend als het "visitor pattern". Het is ook geen alleenstaand geval, de hele Design Patterns literatuur is eigenlijk een grote bibliotheek bewijzen dat de "echte" OOP-talen, volgens bovenstaande definitie van Perlis, eigenlijk te low level zijn voor de taken waarvoor ze gebruikt worden.
Met andere woorden, wat je krijgt als je een "echte" OOP-taal gebruikt is een vereenvoudiging voor een klein aantal specifieke probleempjes van de vorige generatie. Je betaalt hiervoor met een berg nieuwe syntax en speciale gevallen omdat de OOP-programmeertalen die vandaag succesvol zijn hun succes eraan te danken hebben dat het direct of via C++ afstammelingen zijn van C waar alles maar bijgepropt werd.
En nee, overerving is ook niet echt algemeen. Het eenvoudige geval (slechts een parent class toegelaten) laat alleen toe die dingen te beschrijven die in een simpele boomstructuur passen, met multiple inheritance raak je al wat verder maar moet je wel uitkijken wat je precies doet.
En dan zijn er nog de toevoegingen zoals "private" die alleen dienen om ongedisciplineerde programmeurs uit andermans objecten te houden. Waarop men dan het concept van de "friend" functie uitvindt omdat de beveiliging gecontroleerd doorbreken soms wel nuttig kan zijn. Zijn we dan nog bezig met programmeren of eerder met bureaucratie?
Neen, dat heeft alles te maken met name mangling (of name-decoration) van een funtctie door de compiler. Bij C is dit simpel en heeft dus ook vaste regels. DLL's gecompileerd met de ene compiler zijn dus compatible voor een andere compiler (op voorwaarde dat ze de C standaarden handhaven.). Bij C++ is het probleem veel moeilijker omdat C++ oa. function overloading kent en dergelijke (er zijn nog vele andere problemen zoals namespaces, etc, etc). Men kan hier dus niet zomaar een simpel standaard name mangling scheme vastleggen. Met als gevolg dat er geen standaard is, en compiler uitgevers eigen schemes hebben. Als nadeel heeft dit natuurlijk dat dll's met c++ linkage niet gebruikt kunnen worden met verschillende compilers, soms zelfs niet met verschillende versies van dezelfde uitgever. Daarom vind ik C nuttig om DLL interfaces te maken. Dan kan ik als ik een paar regels in acht neem deze zelfs voor iemand die VB gebruikt ter beschikking stellen. Er zijn wel technieken om het C++ probleem op te lossen en er is ook zo iets als COM DLL's. Die zijn binair standaard.
Dit is eigenlijk een heel lange uitleg die bevestigt wat ik al vermeldde: de C ABI voor DLL's is min of meer gestandaardiseerd per platform, die voor C++ niet. (voor C trouwens alleen voor _cdecl in het geval van Windows systemen, in het geval van _stdcall past MSVC ook een lichte vorm van mangling toe, zie http://www.mingw.org/mingwfaq.shtml#faq-msvcdll ). Er is in principe geen reden waarom de name mangling niet standaard zou kunnen zijn (er is geen technische reden waarom compilers hier verschillen zouden moeten hebben), net zoals men voor de _cdecl C functies ervoor gekozen heeft dezelfde conventie te gebruiken. Het is gewoon niet gebeurd tot COM er kwam (COM is eigenlijk niet meer dan een set classes met virtuele functies volgens de MSVC structuur, met de voorwaarde dat elke COM class een set functies bevat om reference counting toe te passen voor al die objecten).
Ik spreek dan van een algorithm, dat kan men inderdaad perfect op een wiskundige manier beschrijven, als jij dat al een 'programma' noemt dan begin ik mij af te vragen of jij wel al eens aan 'echte' software hebt gewerkt?
1. Het is niet beperkt tot een enkel algoritme, maar kan in principe op hele programma's toegepast worden.
2. Daar zijn we weer met het pejoratief gebruik van het woord "echte". Om Dijkstra er nog even bij te halen...
"One American boasted that he had made an "algebraic translator" of 50,000 instructions, only to be immediately outdone by one of his compatriots, whose algebraic translator comprised no less than 80,000 instructions. Peter Naur broke the subsequent silence of awe by remarking that he had written an ALGOL translator of 5,500 instructions, upon which I could outdo him with a compiler of only 2,700 instructions. In short: our yardsticks for achievement measured in opposite directions!"
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD10xx/EWD1024.html
Wat mijn eigen ervaringen betreft: ik schrijf geen gigantische programma's, ik ben ook geen gediplomeerd informaticus, ik hou me wel als amateur bezig met programmeren, en op het werk (fysische scheikunde) programmeer ik om automatisch meetopstellingen te kunnen gebruiken en om gegevens te verwerken. Ik hou me niet bezig met gigantische monolithische applicaties, maar volg het UNIX-model van kleine programma's met een welomschreven taak, die indien nodig via de commandline en scripts gekoppeld kunnen worden (en eventueel het hele programma in een scriptingtaal schrijven). Dit model is waarschijnlijk het meest succesvolle geval van hergebruik van code. Alleen is het tegenwoordig niet meer zo bekend omdat de meesten de commandoprompt en shell scripts niet meer zo goed kennen door de opkomst van de GUI. Ik ben wel op de hoogte van OOP concepten en talen (Booch, Stroustrup,...) maar in mijn werk zou dat met een kanon op een mug schieten zijn.
Ik kan begrijpen dat diegenen die mastodont-applicaties schrijven andere noden hebben. Denk er van aan dat wat voor jou werkt niet noodzakelijk ideaal is voor diegenen in een andere situatie.
).

.
).
begint ma (niet onmogelijk, verre van, ma ik heb toch gevloekt