Mijn pagina op youtube http://www.youtube.com/groeneg
Efficient programmeren is onder andere code hergebruiken zonder veel moeite. Wat in mijn geval wil zeggen dat ik zonder veel problemen losse functies hergebruik, soms templated, soms met basic argumenten als pointers en sizes waardoor ze nog steeds relatief onafhankelijk zijn van data types.
Basic objecten gebruik enkel als er overduidelijk state moet worden bijgehouden en wanneer het een geknoei wordt om die state 'los' bij te houden.
In mijn huidig project gebruik ik inheritance en polymorphisme op een fancy manier, het werkt prima maar het heeft me volgens mij ook al evenveel kopzorgen bezorgd omdat er erg veel dingen gebeuren die niet meer intuitief zijn (maar wel prima werken als je het zorgvuldig programmeert).
Conclusie: ik weet het niet goed. Als je OO tot het uiterste gebruikt moet je er heel erg goed je hoofd bij houden, anders schiet je jezelf in no time in je eigen voet. Tiens, dat lijkt heel erg op wat er op de gebruiksaanwijzing van C++ staat
[ Voor 34% gewijzigd door Bob op 22-01-2014 10:03 ]
Is dat wat je zegt
Mijn pagina op youtube http://www.youtube.com/groeneg
Nah niet echt. Als je gewoon zonder OO imperatief programmeert is het moeilijk(er) jezelf in de voet te schieten. OO, inclusief de fancy stuff, maakt het ingewikkelder.Groeneg2 schreef op woensdag 22 januari 2014 @ 10:19:
Wij van WC eend adviseren WC eend mits je je houdt aan de beperkingen van WC eend
Is dat wat je zegt
Dat ben ik dus met je eens.Bob schreef op woensdag 22 januari 2014 @ 10:21:
[...]OO, inclusief de fancy stuff, maakt het ingewikkelder.
Maar vraag ging ook over hoe het momenteel gesteld is met OOP. Zweren we er nog bij of is het toch een beetje van zijn voetstuk gevallen?
Mijn pagina op youtube http://www.youtube.com/groeneg
Maar terug kijkend op ruim 15 jaar webdevven vraag ik mij de laatste tijd ook steeds vaker af, zijn wij niet doorgeslagen. Frameworks van een paar 100 classes om een relatief simpel formulier + opslaan facebook appje te maken wat je normaal in 3 a 4 bestanden maakt. Dus tja... Ik denk dat met het volwassen worden van mijn deel van de industrie ook het inzicht komt dat het geen schande is om terug naar de basis van eenvoud te gaan zonder uit het oog te verliezen dat je wel een bepaalde herbruikbaarheid van componenten wilt, al was het alleen maar om de scheiding tussen logica en presentatie af te dwingen en DRY tussen projecten te handhaven.
Driving a cadillac in a fool's parade.
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
2nd that.kwaakvaak_v2 schreef op woensdag 22 januari 2014 @ 10:40:
OO is geen religie, het is een manier om een doel te bereiken. Maar niet voor elke klus de manier om dat doel te bereiken. In webdevelopment land is het de heilige graal en worden relatief simpele dingen volledig uit zijn verband getrokken om het maar OO te doen. (ja ik beken direct schuld!)
Maar terug kijkend op ruim 15 jaar webdevven vraag ik mij de laatste tijd ook steeds vaker af, zijn wij niet doorgeslagen. Frameworks van een paar 100 classes om een relatief simpel formulier + opslaan facebook appje te maken wat je normaal in 3 a 4 bestanden maakt. Dus tja... Ik denk dat met het volwassen worden van mijn deel van de industrie ook het inzicht komt dat het geen schande is om terug naar de basis van eenvoud te gaan zonder uit het oog te verliezen dat je wel een bepaalde herbruikbaarheid van componenten wilt, al was het alleen maar om de scheiding tussen logica en presentatie af te dwingen en DRY tussen projecten te handhaven.
Om even te kijken naar de libraries die ik momenteel gebruik in mijn project:
De helft is OO, de helft is platte C. Ook opmerkelijk: de libs die OO zijn, gebruiken allemaal template code om hun code herbruikbaar genoeg te maken. Ik denk dat er wel iets van aan is, dat pure OO moeilijk herbruikbaar is.
- http://c2.com/cgi/wiki?ArgumentsAgainstOop
- http://programmers.stacke...popular-in-the-age-of-oop
- Dit zou ik niet classificeren als een serieuze site. Moeilijk te lezen, vol met meningen.
- Hier gaat het over de #2 taal. De #1 taal (Java) is OOP gebaseerd.
let the past be the past.
Ja.farlane schreef op woensdag 22 januari 2014 @ 10:51:
Het maakt geen hol uit wat je doet, als je het maar (zo) gestructureerd (mogelijk) doet.
Softwarelandschap zit vol met trends
Event driven programming, OOP, God classes, NoSQL, ORM's... Steeds is het weer iets anders wat je MOET gebruiken omdat je anders gek bent.
Over een paar jaar is een ORM bijv vast wel weer een slecht idee volgens ongeveer iedereen want ...
Lekker op de bank
Driving a cadillac in a fool's parade.
Ik denk in elk geval dat het erg vroeg is om te spreken van een "val" van OOP. Zolang er geen beter paradigma de kop opsteekt zal OOP in de meeste gevallen de way to go blijven om je code te structureren.
Inderdaad. Je zou in C met behulp van structs en slim gebruik van headerfiles best in de buurt kunnen komen bij het overzicht van OOP. Zonder inheritance en polymorphism en dergelijken, maar goed genoeg om goed gestructureerde code te schrijven in een "platte" taal.farlane schreef op woensdag 22 januari 2014 @ 10:51:
Het maakt geen hol uit wat je doet, als je het maar (zo) gestructureerd (mogelijk) doet.
Klopt...
...maar een groot deel van de dingen hier zijn geen trends. Die benaming doet geen recht aan de grote paradigmawijzigingen die ze teweeggebracht hebben.Event driven programming, OOP, God classes, NoSQL, ORM's... Steeds is het weer iets anders wat je MOET gebruiken omdat je anders gek bent.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Ik merk zelf dat hoe meer ik aan de data kant zit, hoe minder OOP nuttig is. Dan gebruik ik veel static methodes en classes, immutables en is het functionele paradigma ook nuttig. Voor GUI programmeren is OOP denk ik zeer nuttig.
Het zijn ook andere manieren van denken. Denk je vanuit de data en welke transformaties en berekeningen nodig zijn. Of denk je vanuit het object en wat het moet kunnen (welke methodes) en wat het voor interface biedt. Je kan het ook prima combineren. Een class die iets abstraheert en daarachter de methodes die een library aanspreekt die data-georienteerd is opgebouwd.
Wat je ook niet moet vergeten is dat een object state bijhoudt. En zeker als je iets abstraheert in privates, dan heb je overal classes waar een deel van de state bijgehouden word die op de een of andere manier aan elkaar gekoppeld dienen te worden.Daarom vind ik webdevelopment en OOP zo raar. Alles is stateless, behalve wat in de database zit, dus wat heb je aan objecten? Je hebt alleen maar methodes nodig om iets uit de database te halen, iets te transformeren en weer in de database te stoppen.
True. Het woord trend is wat dat betreft een beetje ongelukkig gekozen omdat ik alles op 1 hoop gooi.NMe schreef op woensdag 22 januari 2014 @ 11:44:
[...]
...maar een groot deel van de dingen hier zijn geen trends. Die benaming doet geen recht aan de grote paradigmawijzigingen die ze teweeggebracht hebben.
Dat soort technologien komen wel altijd met een grote klap binnen (net als de meeste trends) en hoewel soms (extreem) zinvol, niet altijd de juiste aanpak.
Een beetje "if all you have is a hammer..."
Lekker op de bank
Ik zit zelf doorgaans niet dichter op de data dan nodig is voor een (complexe) website maar ik ben nog geen situatie tegengekomen waar goeie ORM een probleem vormt waardoor je alsnog terug zou moeten vallen op functioneel programmeren of stapels static methods. Ik kan me redelijk lastig voorstellen dat dat in andere situaties wél een probleem is, afgezien van situaties weer elke microseconde aan snelheidswinst telt.Waster schreef op woensdag 22 januari 2014 @ 11:55:
Ik merk zelf dat hoe meer ik aan de data kant zit, hoe minder OOP nuttig is. Dan gebruik ik veel static methodes en classes, immutables en is het functionele paradigma ook nuttig. Voor GUI programmeren is OOP denk ik zeer nuttig.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
C is iha de eerste compiler die geschreven wordt voor een (hardware) platform, of dat nou embedded is of iets anders: Windows, Unix Linux en what not zijn allemaal geschreven in C.Waster schreef op woensdag 22 januari 2014 @ 11:55:
Maar C is toch met name populair omdat het heel veel gebruikt wordt op embedded systems.
Een belangrijke oorzaak daarvan zal zijn dat er nou eenmaal een schier oneindige voorraad code is die je kunt gebruiken als er een C compiler bestaat voor je platform.
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Je kunt ook gebruik maken van OO zonder een framework te gebruiken. Dat gezegd hebbende, als iets echt zo klein is dan maakt het niet uit hoe je het programmeert. Als je het later moet aanpassen is het bij zoiets kleins namelijk toch geen moeite om even te kijken hoe het werkt.kwaakvaak_v2 schreef op woensdag 22 januari 2014 @ 10:40:
OO is geen religie, het is een manier om een doel te bereiken. Maar niet voor elke klus de manier om dat doel te bereiken. In webdevelopment land is het de heilige graal en worden relatief simpele dingen volledig uit zijn verband getrokken om het maar OO te doen. (ja ik beken direct schuld!)
Maar terug kijkend op ruim 15 jaar webdevven vraag ik mij de laatste tijd ook steeds vaker af, zijn wij niet doorgeslagen. Frameworks van een paar 100 classes om een relatief simpel formulier + opslaan facebook appje te maken wat je normaal in 3 a 4 bestanden maakt. Dus tja... Ik denk dat met het volwassen worden van mijn deel van de industrie ook het inzicht komt dat het geen schande is om terug naar de basis van eenvoud te gaan zonder uit het oog te verliezen dat je wel een bepaalde herbruikbaarheid van componenten wilt, al was het alleen maar om de scheiding tussen logica en presentatie af te dwingen en DRY tussen projecten te handhaven.
Wat webdevelopment betreft is MVC gewoon heel belangrijk, en dat is gewoon lekker makkelijk te doen met OO. Je kunt het ook wel op een andere manier doen, maar ik betwijfel dat dat makkelijker is.
Vanuit een ontwikkelaars oogpunt is het gaaf om een ingewikkelde structuur neer te zetten die goed werkt. Als het je eigen werk is kun je er goed mee werken, snel aanpassingen doen, etc. Maar zodra de oorspronkelijke architect het team verlaat zit de volgende met de gebakken peren.
Ik denk dat we steeds meer gaan naar talen die puur een functioneel doel dienen. Hoe kun je met zo min mogelijk regels code zoveel mogelijk functionaliteit realiseren. Data layers, interfaces, inheritance, ORM, etc. zijn technische gimmicks die vaak meer problemen (performance, onderhoudbaarheid, etc) opleveren dan dat je er winst mee behaalt.
De populariteit van platformen zoals NodeJS onderstrepen dat.er meer behoefte is aan eenvoud. Hergebruik van code wordt gerealiseerd door library's en de eenvoud waarmee ze gedeployed worden. (npm).
http://hawvie.deviantart.com/
Het hele idee van OOP is dat je code, vooral in grote projecten, beter te begrijpen maar. Hoe class X werkt is alleen de zaak van class X, en niet van allerhande andere scripts. Als OOP je werk 'complexer' maakt, doe je iets niet goed.Bob schreef op woensdag 22 januari 2014 @ 10:21:
Nah niet echt. Als je gewoon zonder OO imperatief programmeert is het moeilijk(er) jezelf in de voet te schieten. OO, inclusief de fancy stuff, maakt het ingewikkelder.
https://niels.nu
Het klopt wel redelijk dat OOP je bestandsstructuur wat uitgebreider maakt, maar IMO is dat tegelijkertijd inderdaad overzichtelijker. Zeker omdat je bij bugs niet verder hoeft te graven dan noodzakelijk en OOP dat gedrag niet afdwingt maar wel beloont.Hydra schreef op woensdag 22 januari 2014 @ 13:07:
[...]
Het hele idee van OOP is dat je code, vooral in grote projecten, beter te begrijpen maar. Hoe class X werkt is alleen de zaak van class X, en niet van allerhande andere scripts. Als OOP je werk 'complexer' maakt, doe je iets niet goed.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Dat, en veel linux open source, vooral kernel spul. En dat is een compleet andere wereld dan waar de meeste developers in werken, enterprise (web) applicaties.Waster schreef op woensdag 22 januari 2014 @ 11:55:
Maar C is toch met name populair omdat het heel veel gebruikt wordt op embedded systems.
Wat heeft dat met OOP te maken? Toen ik hier kwam werken moest ik ook een hoop niet-OO code leren begrijpen. Omdat de samenhang (door het gebrek aan OO) weinig duidelijk is, is dat echt niet eenvoudiger hoor.HawVer schreef op woensdag 22 januari 2014 @ 12:58:
Wat ik persoonlijk een nadeel vind van OOP is dat het al snel leidt tot een warboel aan classes. Met name als er ook interfaces en overerving worden toegepast. Zodra er nieuwe mensen in je team komen kost het redelijk wat tijd om ze in te werken en ervoor te zorgen dat ze voldoende vertrouwen krijgen om een deel van de applicatie aan te passen.
Een slecht ontwerp heeft niks met OO te maken, een goed ontwerp ook niet.Vanuit een ontwikkelaars oogpunt is het gaaf om een ingewikkelde structuur neer te zetten die goed werkt. Als het je eigen werk is kun je er goed mee werken, snel aanpassingen doen, etc. Maar zodra de oorspronkelijke architect het team verlaat zit de volgende met de gebakken peren.
Het aantal regels code maakt code niet meer/minder leesbaar. Voor iemand die 'into Java' is, is java code perfect leesbaar. Het heeft veel meer met ervaring te maken dan met hoeveel regels je precies nodig hebt. Daarnaast is wat extra spul voor een classdefinition ook het issue niet; de complexe algorithmische dingen zijn in vrijwel elke taal vrijwel net zo complex.Ik denk dat we steeds meer gaan naar talen die puur een functioneel doel dienen. Hoe kun je met zo min mogelijk regels code zoveel mogelijk functionaliteit realiseren. Data layers, interfaces, inheritance, ORM, etc. zijn technische gimmicks die vaak meer problemen (performance, onderhoudbaarheid, etc) opleveren dan dat je er winst mee behaalt.
Gebruik zelf Node.js ook, en de populariteit heeft vooral te maken met de integratie van backend en frontend. Daarnaast kun je in JavaScript prima OO programmeren, doe ik zelf ook.De populariteit van platformen zoals NodeJS onderstrepen dat.er meer behoefte is aan eenvoud. Hergebruik van code wordt gerealiseerd door library's en de eenvoud waarmee ze gedeployed worden. (npm).
[ Voor 75% gewijzigd door Hydra op 22-01-2014 13:27 ]
https://niels.nu
Dit is volgens mij niet uniek voor OOP. Welke taal je ook gebruikt, bij een niet-triviaal systeem zul je op een gegeven moment een warboel aan dingen hebben, als je geen/weinig aandacht besteedt aan het goed organiseren van je code. Bij OOP talen kun je dit organiseren door packages of namespaces te gebruiken, bij C door .c/.h files in directories te groeperen, etc.HawVer schreef op woensdag 22 januari 2014 @ 12:58:
Wat ik persoonlijk een nadeel vind van OOP is dat het al snel leidt tot een warboel aan classes. Met name als er ook interfaces en overerving worden toegepast.
Laatst ben ik weer eens op het aloude Entity-Control-Boundary pattern gestuit. Dit is een voorbeeld van een pattern dat je helpt om je code op zo'n manier te structureren dat het enigszins inzichtelijk blijft, ook als het systeem wat groter wordt. Zo zijn er nog wel meer patterns die je daarbij helpen. Net zoals het probleem van de "warboel" speelt voor alle talen, zijn dit soort patterns in alle talen bruikbaar.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Vergelijk het een beetje met de NoSQL hype; ineens moesten we allemaal van SQL af (en staken er zelfs weer immutable database de kop op) maar een paar jaar later zie je dat mensen toch weer naar 'traditionele' SQL databases grijpen. Het is (net als OOP) toch een bewezen tool waar mensen zich prettig bij voelen.
Dat is dus per definitie waar! MVC is niet de heilige graal, zoals die webdevelopment land gepreekt wordt!Patriot schreef op woensdag 22 januari 2014 @ 12:15:
[...]
Wat webdevelopment betreft is MVC gewoon heel belangrijk, en dat is gewoon lekker makkelijk te doen met OO. Je kunt het ook wel op een andere manier doen, maar ik betwijfel dat dat makkelijker is.
Webdevelopment draait om het HTTP protocol en het gegeven dat een request *altijd* een response moet opleveren. En hoe je dat in je router/controller/script oplost is jouw zaak. Dat een view en een controller daar handig bij zijn ben ik met je eens. Maar het kan ook gewoon een closure in je router zijn die een repsonse terug geeft zonder dat daar een model of een view bij nodig is. Het is maar net wat de context van je webapp is.
Driving a cadillac in a fool's parade.
Het is daarentegen wel de allereerste wiki site.SPee schreef op woensdag 22 januari 2014 @ 10:54:
[...]
- Dit zou ik niet classificeren als een serieuze site. Moeilijk te lezen, vol met meningen.
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Het gaat natuurlijk om grotere / complexere applicaties. Het MVC model is primair bedoeld om onderhoudbare applicaties te bouwen.kwaakvaak_v2 schreef op woensdag 22 januari 2014 @ 13:32:
Webdevelopment draait om het HTTP protocol en het gegeven dat een request *altijd* een response moet opleveren. En hoe je dat in je router/controller/script oplost is jouw zaak. Dat een view en een controller daar handig bij zijn ben ik met je eens. Maar het kan ook gewoon een closure in je router zijn die een repsonse terug geeft zonder dat daar een model of een view bij nodig is. Het is maar net wat de context van je webapp is.
Waarom het niet de meeste gebruikte is is wel duidelijk.RayNbow schreef op woensdag 22 januari 2014 @ 13:32:
Het is daarentegen wel de allereerste wiki site.
[ Voor 14% gewijzigd door Hydra op 22-01-2014 13:35 ]
https://niels.nu
Mee eens. Het hangt absoluut af van de mentaliteit en de kennis van de ontwikkelaar. Als je designpatterns, inheritance, etc goed doorvoert kan dat alsnog leiden tot een complexe niet te onderhouden structuur. Ik denk dat de ene taal er meer vatbaar voor is dan een andere taal.Dricus schreef op woensdag 22 januari 2014 @ 13:15:
[...]
Dit is volgens mij niet uniek voor OOP. Welke taal je ook gebruikt, bij een niet-triviaal systeem zul je op een gegeven moment een warboel aan dingen hebben, als je geen/weinig aandacht besteedt aan het goed organiseren van je code. Bij OOP talen kun je dit organiseren door packages of namespaces te gebruiken, bij C door .c/.h files in directories te groeperen, etc.
Laatst ben ik weer eens op het aloude Entity-Control-Boundary pattern gestuit. Dit is een voorbeeld van een pattern dat je helpt om je code op zo'n manier te structureren dat het enigszins inzichtelijk blijft, ook als het systeem wat groter wordt. Zo zijn er nog wel meer patterns die je daarbij helpen. Net zoals het probleem van de "warboel" speelt voor alle talen, zijn dit soort patterns in alle talen bruikbaar.
Designpatterns zijn een soort van onofficiële code onder ontwikkelaars om er voor te zorgen dat het niet uit de hand loopt. Mijn punt is dat het een lapmiddel is voor problemen van het concept.
Overigens denk ik niet dat er een silver bullet is. Ik hoop alleen wel dat die er ooit komt.
http://hawvie.deviantart.com/
Dat snap ik, en dat bedoel ik dus met de context. Maar niet elke webapp is een complexe of grote applicatie, net als dat MVC niet altijd de beste keuze is. Alles hangt van die context af.Hydra schreef op woensdag 22 januari 2014 @ 13:33:
[...]
Het gaat natuurlijk om grotere / complexere applicaties. Het MVC model is primair bedoeld om onderhoudbare applicaties te bouwen.
Driving a cadillac in a fool's parade.
Het is nogal duidelijk dat hij het over webapplicaties had en niet over een simpel statusscriptje.kwaakvaak_v2 schreef op woensdag 22 januari 2014 @ 13:36:
Dat snap ik, en dat bedoel ik dus met de context. Maar niet elke webapp is een complexe of grote applicatie, net als dat MVC niet altijd de beste keuze is. Alles hangt van die context af.
Waarom? Je kunt rotzooi in iedere taal produceren.HawVer schreef op woensdag 22 januari 2014 @ 13:35:
Mee eens. Het hangt absoluut af van de mentaliteit en de kennis van de ontwikkelaar. Als je designpatterns, inheritance, etc goed doorvoert kan dat alsnog leiden tot een complexe niet te onderhouden structuur. Ik denk dat de ene taal er meer vatbaar voor is dan een andere taal.
Want?Designpatterns zijn een soort van onofficiële code onder ontwikkelaars om er voor te zorgen dat het niet uit de hand loopt. Mijn punt is dat het een lapmiddel is voor problemen van het concept.
[ Voor 45% gewijzigd door Hydra op 22-01-2014 13:40 ]
https://niels.nu
Content Management Systemen hebben meestal een database structuur die desastreus is voor ORM mappers (aan de achterkant dus!), aan de voorkant kun je natuurlijk uitermate geschik ORM en of NoSql gebruiken.NMe schreef op woensdag 22 januari 2014 @ 12:00:
[...]
Ik zit zelf doorgaans niet dichter op de data dan nodig is voor een (complexe) website maar ik ben nog geen situatie tegengekomen waar goeie ORM een probleem vormt waardoor je alsnog terug zou moeten vallen op functioneel programmeren of stapels static methods. Ik kan me redelijk lastig voorstellen dat dat in andere situaties wél een probleem is, afgezien van situaties weer elke microseconde aan snelheidswinst telt.
In ORM mappers kun je over het algemeen prima zelf ingrijpen. Maar je maakt nu een (terechte) case tegen ORMs, niet een case tegen OOP.raptorix schreef op woensdag 22 januari 2014 @ 13:41:
Content Management Systemen hebben meestal een database structuur die desastreus is voor ORM mappers (aan de achterkant dus!), aan de voorkant kun je natuurlijk uitermate geschik ORM en of NoSql gebruiken.
Da's een fase waar iedere junior > medior doorheen gaatraptorix schreef op woensdag 22 januari 2014 @ 13:44:
Ik ben zelf geen enorme fan van OO, komt ook omdat ik meer een scripter ben dan een hardcore developer, echter het laatste jaar krijg ik er steeds meer mee te maken omdat we onze webapplicaties beter structureren, zelf vind ik dat sommige OO liefhebbers nog wel eens willen doorschieten, en tot in het oneindige blijven abstraheren omdat het "puurder" is, leuk vanuit OO perspectief, maar in de praktijk vaak omslachtig en nutteloos.
[ Voor 40% gewijzigd door Hydra op 22-01-2014 13:45 ]
https://niels.nu
Klopt, je kunt natuurlijk ook een stored procedure of view gebruiken, maar dan nog is het niet ideaal, simpelweg omdat he databasemodel daar niet op gemaakt is, ik gebruik zelf veel Umbraco, in versie 5 hebben ze het geprobeerd met nHibernate, is een fiasco geworden en na 1.5 jaar development hebben ze er zelf maar de stekker uit getrokkenHydra schreef op woensdag 22 januari 2014 @ 13:45:
[...]
In ORM mappers kun je over het algemeen prima zelf ingrijpen. Maar je maakt nu een (terechte) case tegen ORMs, niet een case tegen OOP.
[...]
Da's een fase waar iedere junior > medior doorheen gaat
Dat inderdaad. ORM mappers zijn leuk maar je kan maar tot een bepaald punt automatiseren, de rest zul je zelf moeten doen. Als je het echter eenmaal goed hebt zitten kan ik zeker voor webdevelopment eigenlijk geen situatie bedenken waar OOP géén goed idee is.Hydra schreef op woensdag 22 januari 2014 @ 13:45:
[...]
In ORM mappers kun je over het algemeen prima zelf ingrijpen. Maar je maakt nu een (terechte) case tegen ORMs, niet een case tegen OOP.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Dat hoeft helemaal niet. Sommige mensen gaan ook van weinig abstractie naar precies het goede niveau. Ja, je hebt er die lui bij die extreem doorschieten en denken dat je zover moet door abstraheren dat een class nog maar 1 regel code bevat, maar dat is echt niet een standaard onderdeel van het leerproces.Hydra schreef op woensdag 22 januari 2014 @ 13:45:
[...]
Da's een fase waar iedere junior > medior doorheen gaat
Klopt. Vandaar de smiley.Caelorum schreef op woensdag 22 januari 2014 @ 13:55:
Dat hoeft helemaal niet.
Ik vind Hibernate zelf ook een aardige draak. M.i. ben je in veel gevallen eigenlijk een hoop programmeerwerk aan het verplaatsen naar XML files. ORMs zijn m.i. ook een mixed blessing. Heb voor simpele projecten wel graag gebruik gemaakt van http://ormlite.com/, gewoon met annotations.raptorix schreef op woensdag 22 januari 2014 @ 13:49:
Klopt, je kunt natuurlijk ook een stored procedure of view gebruiken, maar dan nog is het niet ideaal, simpelweg omdat he databasemodel daar niet op gemaakt is, ik gebruik zelf veel Umbraco, in versie 5 hebben ze het geprobeerd met nHibernate, is een fiasco geworden en na 1.5 jaar development hebben ze er zelf maar de stekker uit getrokken
[ Voor 69% gewijzigd door Hydra op 22-01-2014 14:03 ]
https://niels.nu
Euhm, dat heb je niet goed volgens mij. OOP werd pas eind jaren 80 *echt* populair. En aangezien C nog altijd ergens bovenaan staat zou ik OOP zelfs niet 'meest populair' durven noemen.Bigs schreef op woensdag 22 januari 2014 @ 13:21:
Alternatieven voor OOP (denk LISP) bestaan al sinds eind jaren 60 en toch heeft OOP al die tijd de overhand gehad als meest populaire manier van ontwikkelen.
[ Voor 12% gewijzigd door farlane op 22-01-2014 14:04 ]
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Je hebt gelijk, ik dacht even teveel vanuit m'n eigen wereld waar je nooit C tegen komt. Er zijn natuurlijk ook eindeloze gigabytes aan C, Perl PHP, Javascript gekeken waar van OOP of een andere gestructureerde aanpak geen sprake is dus als je het zo bekijkt is OOP inderdaad niet zo populair. Echter voor enterprise, web en GUI applicaties leent het zich m.i. wel uitstekend.farlane schreef op woensdag 22 januari 2014 @ 14:00:
[...]
Euhm, dat heb je niet goed volgens mij. OOP werd pas eind jaren 80 *echt* populair. En aangezien C nog altijd ergens bovenaan staat zou ik OOP zelfs niet 'meest populair' durven noemen.
Jij hebt exacte cijfers van het gebruik van OO concepten van begin tot eind jaren 80?farlane schreef op woensdag 22 januari 2014 @ 14:00:
Euhm, dat heb je niet goed volgens mij. OOP werd pas eind jaren 80 *echt* populair.
Je noemt 1 hele niet-OO taal die veel gebruikt wordt in embedded / kernel systemen waar het belangrijkste gewoon geheugenruimte is. Dat is gewoon een aparte tak van sport.En aangezien C nog altijd ergens bovenaan staat zou ik OOP zelfs niet 'meest populair' durven noemen.
Dan nog: ik redeneer vooral vanuit mensen die als professioneel oogpunt aan complexe applicaties werken. Als ik zelf een simpel stuk tekst moet parsen maak ik daar ook gewoon een scriptje voor. Best tool for the job.Bigs schreef op woensdag 22 januari 2014 @ 14:14:
Je hebt gelijk, ik dacht even teveel vanuit m'n eigen wereld waar je nooit C tegen komt. Er zijn natuurlijk ook eindeloze gigabytes aan C, Perl PHP, Javascript gekeken waar van OOP of een andere gestructureerde aanpak geen sprake is dus als je het zo bekijkt is OOP inderdaad niet zo populair. Echter voor enterprise, web en GUI applicaties leent het zich m.i. wel uitstekend.
[ Voor 37% gewijzigd door Hydra op 22-01-2014 14:17 ]
https://niels.nu
En mijn punt is dat je bij élk concept, of dat nu OOP of gestructureerd- of functioneel programmeren is of wat anders, tegen dit soort problemen aan zult lopen. Dit is geen probleem van het concept, maar een probleem van de mensen die het proberen toe te passen.HawVer schreef op woensdag 22 januari 2014 @ 13:35:
Mee eens. Het hangt absoluut af van de mentaliteit en de kennis van de ontwikkelaar. Als je designpatterns, inheritance, etc goed doorvoert kan dat alsnog leiden tot een complexe niet te onderhouden structuur. Ik denk dat de ene taal er meer vatbaar voor is dan een andere taal.
Designpatterns zijn een soort van onofficiële code onder ontwikkelaars om er voor te zorgen dat het niet uit de hand loopt. Mijn punt is dat het een lapmiddel is voor problemen van het concept.
In de hoogtijdagen van de ICT zijn er hele volksstammen aan "ontwikkelaars" op de markt gekomen die leuk kunnen knutselen, maar totaal geen verstand hebben van hoe je een systeem op een degelijke manier ontwerpt. Daar hebben we tot op de dag van vandaag last van. De verleiding is dan groot om dit soort problemen te wijten aan een tekortkoming van een bepaald programmeerconcept, maar ik vraag me serieus af hoe de invloed van dat soort vermeende tekortkomingen zich verhoudt tot de tekortkomingen van ontwikkelaars.
Mijn gevoel is dat dit vooral een probleem is van gebrek aan vakmanschap bij ontwikkelaars. Dit is vooral gebaseerd op ervaringen die ik heb opgedaan in de teams waarin ik de afgelopen jaren gewerkt heb.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Ik ben zelf erg geinteresseert in distributed systems. Daar zie je vaak developers richting functionele programmeertalen gaan, met name Erlang.
Dit heeft met name te maken met hoe applicaties met elkaar communiceren, wat bij distributed systems altijd message passing is. Of dit nou met RPC, IPC, SOAP, een message bus, of wat dan ook is maakt niet uit.
Tegenwoordig is de kern van het OO programmeren, wat ook message passing is, verloren gegaan door allerlei technische hoogstandjes. Want argumenten op de stack duwen en dan naar een ander geheugenadres gaan en ze er weer afhalen is eigenlijk een snelle manier van een bericht sturen
Als je bijvoorbeeld TDD doet, zul je merken dat als je je functie als blackbox behandelt, je tests logischer worden en je code stabieler. Je flow wordt dan: eventuele state die nodig is initialiseren, functie aanroepen, kijken of de state gewijzigd is zoals je verwacht. Oftewel: message in -> functie -> message out.
Als je het message passing concept in je OO code hanteert, zul je zien dat het al een stuk logischer wordt om op die manier te programmeren. Maar goed, had je dan niet beter in Erlang kunnen programmeren?
Daarnaast, wat ik vaak zie (en zelf ook fout gedaan heb), is veel inheritance gebruiken. Maar een grondregel van OO is, composition over inheritance. Al je objecten moeten meer dan dan de som van alle onderdelen. Door simpele regels kan je complex gedrag krijgen.
Al die lagen van abstractie puur om een veelal overdreven gevoel van 'puurheid' te krijgen, dat is gewoon killing voor de architectuur van je applicatie. Zal wel een junior -> medior inzicht zijn, zodra je die pijn een keer gevoeld hebt weet je dat je dat niet moet doen
Nee, ik baseer dat mede op een Wikipedia artikel en uiteraard mijn eigen ervaring.Hydra schreef op woensdag 22 januari 2014 @ 14:15:
Jij hebt exacte cijfers van het gebruik van OO concepten van begin tot eind jaren 80?
Ik baseer die uitspraak met name op deze index. Overigens worden iha systeem libraries voor de verschillende OS'en ook in C geschreven, ik denk eerlijk gezegd dat dat het merendeel van de C code is die er geproduceerd is. ( Daar heb ik geen cijfers van ) en dan heb je het echt niet meer over "embedded/kernelsystemen".Je noemt 1 hele niet-OO taal die veel gebruikt wordt in embedded / kernel systemen waar het belangrijkste gewoon geheugenruimte is. Dat is gewoon een aparte tak van sport.
Dit afdoen als een 'aparte tak van sport' is trouwens ook wel apart, op diezelfde manier is "server side software" ook een aparte tak van sport.
Die 'guideline' is er pas gekomen nadat men er achter kwam dat diepe inheritance trees eigenlijk niet zo heel handig waren. Het is geen grondregel van OO trouwens.Maar een grondregel van OO is, composition over inheritance.
[ Voor 16% gewijzigd door farlane op 22-01-2014 15:25 ]
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Nee, want geen (complete, encoding aware) stringsHMS schreef op woensdag 22 januari 2014 @ 15:17:
[..]
Als je het message passing concept in je OO code hanteert, zul je zien dat het al een stuk logischer wordt om op die manier te programmeren. Maar goed, had je dan niet beter in Erlang kunnen programmeren?
[..]
Begrijp me niet verkeerd, OOP is geen slecht concept. Ik zal dat zeker niet beweren. Je kunt er mooie dingen mee bereiken. Alleen het feit dat je er een zooi kan maken van de architectuur is een tekortkoming van het concept. Onbeperkte diepe inheritance vind ik daarin een mooi voorbeeld.Dricus schreef op woensdag 22 januari 2014 @ 14:37:
[...]
En mijn punt is dat je bij élk concept, of dat nu OOP of gestructureerd- of functioneel programmeren is of wat anders, tegen dit soort problemen aan zult lopen. Dit is geen probleem van het concept, maar een probleem van de mensen die het proberen toe te passen.
In de hoogtijdagen van de ICT zijn er hele volksstammen aan "ontwikkelaars" op de markt gekomen die leuk kunnen knutselen, maar totaal geen verstand hebben van hoe je een systeem op een degelijke manier ontwerpt. Daar hebben we tot op de dag van vandaag last van. De verleiding is dan groot om dit soort problemen te wijten aan een tekortkoming van een bepaald programmeerconcept, maar ik vraag me serieus af hoe de invloed van dat soort vermeende tekortkomingen zich verhoudt tot de tekortkomingen van ontwikkelaars.
Mijn gevoel is dat dit vooral een probleem is van gebrek aan vakmanschap bij ontwikkelaars. Dit is vooral gebaseerd op ervaringen die ik heb opgedaan in de teams waarin ik de afgelopen jaren gewerkt heb.
Dan zijn er twee oplossingen; één ervan is er voor zorgen dat de gebruikers beter geschoold worden en de andere oplossing is het oplossen van de problemen in het concept. Bijvoorbeeld maximaal drie niveaus diep inheritance toestaan.
Ik ben het ook met je eens dat alle huidige talen/concepten het toestaan om er een zooi van te maken. Ultiem zou zijn een taal/concept waarin je het 'zooi-risico' tot een minimum beperkt met wel zoveel mogelijk flexibiliteit. Alleen ik besef dat dat een paradox is omdat met flexibiliteit ook tegelijk complexiteit toeneemt.
http://hawvie.deviantart.com/
Ik denk dat het vooral draait om een beetje een misinterpretatie van zijn bericht. Ik ging er niet vanuit dat hij bedoelde dat OOP vanaf de jaren 60 altijd de dominante / meest gebruikte vorm van programmeren was.farlane schreef op woensdag 22 januari 2014 @ 15:18:
Nee, ik baseer dat mede op een Wikipedia artikel en uiteraard mijn eigen ervaring.
Ik vind die index echt volkomen waardeloos. Er zijn andere bronnen die gebaseerd zijn op zaken als jobpostings, SO vragen en google hits die een veel beter beeld geven, afgezien van dat het onmogelijk is een echt beeld te krijgen van 'populariteit'. Ik bedoel; Javascript en Transact SQL zijn even 'populair'? Gebaseerd op google result? Google er maar eens op...Ik baseer die uitspraak met name op deze index. Overigens worden iha systeem libraries voor de verschillende OS'en ook in C geschreven, ik denk eerlijk gezegd dat dat het merendeel van de C code is die er geproduceerd is. ( Daar heb ik geen cijfers van ) en dan heb je het echt niet meer over "embedded/kernelsystemen".
Helaas wordt die index te pas en te onpas gebruikt om aan te tonen dat C zo populair is. Sorry, maar als je naar stackoverflow, monsterboard en google kijkt is er steeds een redelijke 5:1 verhouding op hits tussen java en C, en dan heb je nog het issue dat je als je op C zoekt vaak ook hits op objective C, C# en C++ krijgt.
Ze gebruiken een groot aantal verschillende search engines. Ik heb hiervoor bij een search engine 'fabrikant' gewerkt en weet hoe moeilijk text search is.
Er wordt gewoon reteweinig in C gedaan in verhouding tot enterprisy applicaties, ongeacht de mening van een brakke index.Dit afdoen als een 'aparte tak van sport' is trouwens ook wel apart, op diezelfde manier is "server side software" ook een aparte tak van sport.
Da's net zo iets als zeggen dat een auto slecht is omdat slechte chauffeurs er mee crashen.HawVer schreef op woensdag 22 januari 2014 @ 16:25:
Begrijp me niet verkeerd, OOP is geen slecht concept. Ik zal dat zeker niet beweren. Je kunt er mooie dingen mee bereiken. Alleen het feit dat je er een zooi kan maken van de architectuur is een tekortkoming van het concept. Onbeperkte diepe inheritance vind ik daarin een mooi voorbeeld.
En dan heb je er net een keer 4 nodig? Wat een onzin. Een objectstructuur hoort logisch te zijn. Een onlogische structuur geforceerd in 4 niveau's is slechter dan een logische met 5. Je gaat arbitraire limieten bedenken omdat sommige mensen slechte software schrijven? Echt?Dan zijn er twee oplossingen; één ervan is er voor zorgen dat de gebruikers beter geschoold worden en de andere oplossing is het oplossen van de problemen in het concept. Bijvoorbeeld maximaal drie niveaus diep inheritance toestaan.
Euh, of je neemt gewoon geen incompetente lui aan. Problem solved.Ik ben het ook met je eens dat alle huidige talen/concepten het toestaan om er een zooi van te maken. Ultiem zou zijn een taal/concept waarin je het 'zooi-risico' tot een minimum beperkt met wel zoveel mogelijk flexibiliteit. Alleen ik besef dat dat een paradox is omdat met flexibiliteit ook tegelijk complexiteit toeneemt.
[ Voor 26% gewijzigd door Hydra op 22-01-2014 16:35 ]
https://niels.nu
Ook competente lui kunnen minder netjes schrijven. Proof of concepts die onder tijdsdruk ineens gepromoot worden tot release, of (wederom onder tijdsdruk of door spec-herzieningen vanuit de klant) wordt er niet vastgehouden aan het oorspronkelijke design en daardoor komt er rotzooi uit. Soms kom je daar gewoon niet onderuit als je mee wil komen in de markt.Hydra schreef op woensdag 22 januari 2014 @ 16:28:
[...]
Euh, of je neemt gewoon geen incompetente lui aan. Problem solved.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Heb je daar een bron voor?Hydra schreef op woensdag 22 januari 2014 @ 16:28:
[...]
Er wordt gewoon reteweinig in C gedaan in verhouding tot enterprisy applicaties, ongeacht de mening van een brakke index.
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Je quote je eigen ervaring, ik ook. Daarnaast kun je zelf ook eens gaan zoeken op bijvoorbeeld monster.com (heb ik zelf ook gedaan) en dan kom je uit op een 5:1 hit rate verhouding tussen C en Java (daarin niet gecompenseerd voor het probleem dat je met C hits krijgt op C, C++, Objective C en C#). Da's NOGAL wat anders dan wat die brakke index meldt.farlane schreef op woensdag 22 januari 2014 @ 17:09:
Heb je daar een bron voor?
Dit valt nogal buiten deze discussie m.i.NMe schreef op woensdag 22 januari 2014 @ 17:01:
Soms kom je daar gewoon niet onderuit als je mee wil komen in de markt.
https://niels.nu
Jij was degene die competentie gelijk stelde aan nette code terwijl dat net zo min enkel daarvan afhankelijk is als van het gekozen paradigma.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Ik vraag me af waar je deze vele verhalen hoort. Ik hoor ze totaal niet namelijk...Groeneg2 schreef op woensdag 22 januari 2014 @ 09:53:
Ik hoor de laatste tijd veel verhalen over het minder populair zijn/worden van OOP?
Wat is er waar van deze verhalen?
http://c2.com/cgi/wiki?ArgumentsAgainstOop
http://programmers.stacke...popular-in-the-age-of-oop
http://www.drdobbs.com/cpp/why-code-in-c-anymore/240149452
Daarbij geef je links die uit mei 2013, maart 2012 en februari 2013 komen. Niet heel erg recent toch?
En ik deel de mening niet, in mij wereldje, enterprise software, is het nog steeds OOP wat de dienst uitmaakt. Daarnaast kijkend naar mobile is het ook OOP (iOS, Android development).
OOP is here to stay, zou ik zeggen. Het is alleen niet de Holy Grail die in elke situatie het beste werkt. Maar dat is elke taal / concept / pattern enz. niet...
Ja en dat was niet voldoende dus ik vraag jou ook of je een bron hebt, naast je eigen subjectieve waarneming.Hydra schreef op woensdag 22 januari 2014 @ 17:19:
Je quote je eigen ervaring, ik ook.
Er van uitgaande dat een search op monster.com wel een goede indicatie zou zijn ( de vraag naar developers in een bepaalde taal is vergelijkbaar als de populariteit van een taal? ) zou dat dus betekenen dat de vraag naar Java developers 5x zo groot is als de vraag naar C, C++, Objective C en C# *bij elkaar*. Waaruit je dan volgens jou kunt concluderen dat de populariteit van Java ( en OOP ) dus ook 5 maal zo hoog zou zijn.Daarnaast kun je zelf ook eens gaan zoeken op bijvoorbeeld monster.com (heb ik zelf ook gedaan) en dan kom je uit op een 5:1 hit rate verhouding tussen C en Java (daarin niet gecompenseerd voor het probleem dat je met C hits krijgt op C, C++, Objective C en C#).
Hier ook een site waar C nog altijd behoorlijk hoog eindigt (Java ook trouwens) : http://langpop.com
Ik kan niet anders concluderen dat C na 40 jaar nog behoorlijk populair is. ( en daarmee dus ook non-OOP programmeren ).
Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.
Lees mijn bericht nog eens. Ik zeg niet dat OOP slecht is. In tegendeel. Ikzelf dat het een tekortkoming is. Net als dat het een tekortkoming is van een auto dat hij kan crashen.Hydra schreef op woensdag 22 januari 2014 @ 16:28:
[...]
Da's net zo iets als zeggen dat een auto slecht is omdat slechte chauffeurs er mee crashen.
Mijn punt is meer dat als een taal/concept onlogische structuren toestaat dit een tekortkoming is.[...]
En dan heb je er net een keer 4 nodig? Wat een onzin. Een objectstructuur hoort logisch te zijn. Een onlogische structuur geforceerd in 4 niveau's is slechter dan een logische met 5. Je gaat arbitraire limieten bedenken omdat sommige mensen slechte software schrijven? Echt?
Ik denk dat er vanuit de markt behoefte is aan talen/concepten die minder complex zijn. Dit is met name om een grotere groep (nieuwe) ontwikkelaars aan te kunnen spreken. Want er is nog altijd een tekort. En nee ze hoeven niet direct 3D games te kunnen schrijven.[...]
Euh, of je neemt gewoon geen incompetente lui aan. Problem solved.
http://hawvie.deviantart.com/
Tsja, dit principe geldt zo'n beetje voor alles dat ooit door de mens uitgevonden en gemaakt is. Kort door de bocht: Geef een willekeurig iets aan een idioot en hij doet er idiote dingen mee. Of in het Engels: A fool with a tool is still a fool.HawVer schreef op woensdag 22 januari 2014 @ 18:49:
Lees mijn bericht nog eens. Ik zeg niet dat OOP slecht is. In tegendeel. Ikzelf dat het een tekortkoming is. Net als dat het een tekortkoming is van een auto dat hij kan crashen.
Kun je dit aan de tool wijten? Volgens mij niet. Het feit dat je met een tool (of taal of concept for that matter) iets compleet idioots neer kunt zetten zegt mijns inziens nog het meest over de gebruiker van die tool. De enige idiot-proof tool is een tool waar je niks mee kunt.
Dus het feit dat je met een hamer iemand dood kunt knuppelen is een tekortkoming van de hamer? Verder, zie hierboven.Mijn punt is meer dat als een taal/concept onlogische structuren toestaat dit een tekortkoming is.
Een aantal hier genoemde talen zijn talen die vanaf op MBO niveau onderwezen worden. Het meerendeel van de vacatures voor ontwikkelaars is op HBO niveau. Van een HBO niveau werknemer mag je mijns inziens verwachten dat hij/zij in staat is om concepten zoals OOP, gestructureerd programmeren, functioneel programmeren, etc zich eigen te maken.Ik denk dat er vanuit de markt behoefte is aan talen/concepten die minder complex zijn. Dit is met name om een grotere groep (nieuwe) ontwikkelaars aan te kunnen spreken. Want er is nog altijd een tekort. En nee ze hoeven niet direct 3D games te kunnen schrijven.
Beweringen zoals die hierboven hoor je managers (vooral hoog in de boom) ook vaak roepen: "We moeten meer van hetzelfde doen", "we moeten de standaards en richtlijnen aanscherpen zodat we niet overal zo over hoeven nadenken" en meer van dit soort zinsnedes. Ze gaan hiermee volledig voorbij aan het feit dat het maken van software een echt vak is. Een vak waar niet alleen een gedegen opleiding, maar ook jaren aan praktijkervaring voor nodig is om het goed te beheersen.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Je weet nogal wat informatie te halen uit een enkel zinnetje.NMe schreef op woensdag 22 januari 2014 @ 17:31:
Jij was degene die competentie gelijk stelde aan nette code
En net zoals dat het onmogelijk is een nuttige auto die werk op het hedendaagse net uit te vinden die niet kan crashen, is het onmogelijk een bruikbaar logisch programmeerparadigma uit te vinden dat alle fouten van z'n gebruikers voorkomt. Net zoals dat een chirurg een opleiding nodig heeft om op een goeie manier te opereren is voor developers een gedegen opleiding nodig om op een goeie manier software te ontwikkelen.HawVer schreef op woensdag 22 januari 2014 @ 18:49:
Lees mijn bericht nog eens. Ik zeg niet dat OOP slecht is. In tegendeel. Ikzelf dat het een tekortkoming is. Net als dat het een tekortkoming is van een auto dat hij kan crashen.
Zie boven. Een programmeerparadigma voorkomt geen fouten, het biedt een raamwerk om je te helpen. Het is een denkfout van jouw kant dat je denkt dat het uberhaupt een doel of mogelijkheid is dat een paradigma fouten 100% voorkomt.Mijn punt is meer dat als een taal/concept onlogische structuren toestaat dit een tekortkoming is.
Er is niks complex aan Java. Er is niks complex aan assembly. Wat complex is, is de software zelf. Vooral grote enterprise systemen zijn enorm complex. OO biedt houvast in dergelijke omgevingen, helpt structuur aan te brengen. Maar het ook daadwerklijk structuur aanbrengen is een taak van een software dev, daar zit de ervaring in. Of je dan OO of een ander paradigma aanhangt is om het even.Ik denk dat er vanuit de markt behoefte is aan talen/concepten die minder complex zijn. Dit is met name om een grotere groep (nieuwe) ontwikkelaars aan te kunnen spreken. Want er is nog altijd een tekort. En nee ze hoeven niet direct 3D games te kunnen schrijven.
[ Voor 6% gewijzigd door Hydra op 22-01-2014 19:23 ]
https://niels.nu
Wij ontwikkelen hier financiële software. Als je daar toestaat om een journaalpost te maken die niet in evenwicht is kun je dat de gebruiker verwijten. Hij had beter kunnen weten. De gebruiker zet juist een tool in om hem te helpen om het op de juiste manier te doen. Spreekt dan ook voor zich dat de tool dit niet toestaat.
Als een tool bedacht wordt zou het streven altijd moeten zijn om het systeem foolproof te maken. Heb je dat streven niet dan zul je er ook niet in de buurt komen. Op het gebied van OOP is die noodzaak er nooit geweest omdat we de tekortkomingen wijten aan het tekort aan kennis en ervaring of opleiding. En waarom zou je het streven voor een foolproof systeem hebben? Je maakt jezelf overbodig om dat de kennis en ervaring in het systeem zit.
Eerder werd gezegd dat meer denken in standaarden een management kreet is. Ik denk het niet. Bij het bedrijf waar ik werk hebben we het streven om de code 100% te laten genereren. Dit wordt afgeleid van een model die het domein beschrijft icm met code templates. Voordeel is dat wanneer een template aangepast wordt dit direct overal in je systeem door verwerkt wordt. De best practices qua applicatie architectuur liggen vast in de code templates. Dit is een systeem wat prima werkt voor enterprise applicaties.
Edit. Overigens is dit niet de heilige graal. Ik ben me er van bewust dat specialistische software specialisten vereist.
[ Voor 3% gewijzigd door HawVer op 22-01-2014 20:15 ]
http://hawvie.deviantart.com/
Door codegeneratoren toe te passen kun je het verkeerd combineren van die onderdelen deels voorkomen. Als je dat doet, dan ontstaat er al snel iets dat je een domain specific language (DSL) zou kunnen noemen. Je maakt feitelijk met een programmeertaal een andere taal die je binnen een bepaald probleemdomein helpt om minder fouten te maken bij het maken van software. Die DSL is zelf alleen weer net zo goed als die generieke talen onderhevig aan de problemen die onkunde met zich meebrengen.
En dat is nu eenmaal de aard van programmeerconcepten. Ze bieden je de nuts en bolts, maar kunnen niet voor 100% vookomen dat je die verkeerd gebruikt om een specifiek probleem op te lossen. Dat is niet het probleem van de nuts en bolts, maar van degene die ze op een verkeerde manier gebruikt.
Edit: Wat ik tegen heb op die "managementkreten" is dat die in mijn werkomgeving vaak bedoeld zijn om het ontwikkelen van software te reduceren tot een soort van lopendebandproces. Standaarden en richtlijnen zijn uiteraard goed om te hebben en na te leven. Het gaat mij met die opmerking dus om de intentie, niet om de standaards op zich.
[ Voor 10% gewijzigd door Dricus op 22-01-2014 20:50 ]
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Verder wil je meestal een vorm van polymorphisme. Dat hoeft niet per se inheritance en virtual functions te zijn, dat kunnen ook templates zijn en/of duck typing.
Wat wel duidelijk zo is, is dat slechte OO code slecht is... mensen, zeker beginners, willen het vaak "te OOP" maken. Alles behalve interface inheritance is bv bijna altijd slecht, toch leer je dat als eerste. Die websites gaan ook allemaal op dit soort voorbeelden in.
Zie deze blog van Robert Martin voor een iets uitgebreidere (en humoristischere
In veel OO programma's leidt dit tot een rare, verwarrende mix van datastructuren, validatie en persistence in de vorm van domeinclasses die zowel business logica bevatten als informatie over hoe de data gepersisteerd moet worden in een database (dmv annotations en/of mappings in een XML file).
Dit is denk ik deels te wijten aan de aard van het OO paradigma. OO biedt je niet echt een manier om datastructuren te modelleren. Je kunt natuurlijk classes maken die niets meer zijn dan een setje private fields met bijbehorende getters en setters, maar dan houd je jezelf denk ik een beetje voor de gek. Je doet dan net alsof een datastructuur uit te drukken is in termen van gedrag terwijl dit in werkelijkheid niet echt kan omdat data en gedrag conceptueel orthogonale concepten zijn.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Maar dat is toch juist een goed iets? Iemand die de class niet geschreven heeft en dus niet weet hoe die intern werkt hoeft dat ook niet te weten en hoeft ook niks te weten over de data-opslag of -structuur. Gebruikers van een klasse zijn juist domweg meer geïnteresseerd in gedrag in plaats van de datastructuur die erbij hoort.Dricus schreef op woensdag 22 januari 2014 @ 22:00:
Teruggrijpend op de posts over ORM's eerder in dit topic is er denk ik wel een probleem met puur OOP denken. Objecten zijn lastig te zien als een datastructuur. Wat zie je als je vanaf de buitenkant naar een object kijkt: Methods. Eventuele state is vanaf de buitenkant niet direct zichtbaar. Het is indirect zichtbaar doordat het gedrag van een object wijzigt als zijn state wijzigt. Die wijziging van state is het gevolg van het aanroepen van een method op dat object door een ander object. Een object is vanaf de buitenkant gezien dus een abstractie van gedrag, niet van data.
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Helemaal mee eens. Het probleem dat ik probeer te beschrijven is dat er binnen OOP niet echt een ondubbelzinnig gedefinieerde manier is om datastructuren te modelleren. In het geval van te-persisteren data voelt het raar aan dat je binnen OOP die data moet modelleren in termen van gedrag.NMe schreef op woensdag 22 januari 2014 @ 22:26:
Maar dat is toch juist een goed iets? Iemand die de class niet geschreven heeft en dus niet weet hoe die intern werkt hoeft dat ook niet te weten en hoeft ook niks te weten over de data-opslag of -structuur. Gebruikers van een klasse zijn juist domweg meer geïnteresseerd in gedrag in plaats van de datastructuur die erbij hoort.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Ik snap dat niet helemaal: je kan elke data structuur toch juist perfect modelleren? Dat iets data opneemt en daar gedrag aan koppelt is een extra abstractie. Als ik puur een alleen de data structuur wil benader ik bv de database wel direct. Wat je in een programma wilt is juist gedrag toevoegen aan data. Ook wil je die data dan encapsuleren, zoals hierboven ook gezegd. Wat is er mis met een object dat aan de ene kant een interface heeft om zichzelf te serialisen, en aan de andere kant functionaliteit op de data biedt? Het lijkt dubbelop, maar dat is het niet: het is een volgende abstractie. Wederom separation of concerns, abstractere concepten modelleren en de details hiden.Dricus schreef op woensdag 22 januari 2014 @ 22:35:
Helemaal mee eens. Het probleem dat ik probeer te beschrijven is dat er binnen OOP niet echt een ondubbelzinnig gedefinieerde manier is om datastructuren te modelleren. In het geval van te-persisteren data voelt het raar aan dat je binnen OOP die data moet modelleren in termen van gedrag.
Tuurlijk, dat kan in elke OO taal op zich prima, daar zijn allerhande praktische oplossingen voor. Echter, als je er wat meer beschouwend naar kijkt, dan zou je kunnen concluderen dat een datastructuur onmogelijk een object kan zijn.Zoijar schreef op woensdag 22 januari 2014 @ 23:37:
Ik snap dat niet helemaal: je kan elke data structuur toch juist perfect modelleren?
What is a data structure? It's a bunch of public data with no methods. Compare that to an object which is a bunch of public methods with no visible data. These two things are the exact opposites of each other!
Ik denk dat er een verschil is tussen de concepten data en state. Data is wat we uiteindelijk willen persisteren en waar we in veel gevallen zonder al te veel omwegen bij willen kunnen vanuit allerlei plekken in onze programmatuur. Encapsulatie van data wordt over het algemeen niet zo belangrijk gevonden. We doen dan vaak net alsof we encapsulatie doen door domeinclasses te maken die private fields hebben met getters en setters om die fields te manipuleren. Dit is natuurlijk geen echte encapsulatie, de complete interne state van zo'n object is via de getters en setters zichtbaar en manipuleerbaar.Dat iets data opneemt en daar gedrag aan koppelt is een extra abstractie. Als ik puur een alleen de data structuur wil benader ik bv de database wel direct. Wat je in een programma wilt is juist gedrag toevoegen aan data. Ook wil je die data dan encapsuleren, zoals hierboven ook gezegd.
State is de verzameling aan object-eigen gegevens die bedoeld is om een object de mogelijkheid te geven zijn gedrag over tijd aan te passen. State willen we encapsuleren en mag van buitenaf niet anders zichtbaar zijn dan indirect, door verandering in observeerbaar gedrag van dat object.
Daar is mis mee dat zo'n object het Single Responsibility Principle schendt. Het is het tegenovergestelde van separation of concerns. Je maakt één object verantwoordelijk voor meerdere concerns: Het vasthouden en manipuleren van data én het persisteren van die data.Wat is er mis met een object dat aan de ene kant een interface heeft om zichzelf te serialisen, en aan de andere kant functionaliteit op de data biedt? Het lijkt dubbelop, maar dat is het niet: het is een volgende abstractie. Wederom separation of concerns, abstractere concepten modelleren en de details hiden.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
https://niels.nu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| class Persoon { private Long id; private String voornaam; private String achternaam; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getVoornaam() { return voornaam; } public void setVoornaam(String voornaam) { this.voornaam = voornaam; } [...] } |
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Je vraagt waarom een instance van een class een object is?
https://niels.nu
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Waarom zou het ontbreken van methods op de klasse een instantie ineens geen object maken?
[ Voor 83% gewijzigd door CodeCaster op 23-01-2014 09:47 ]
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Dat is een taal specifiek iets, het gaat hier vooral om OO termen. In Java worden dat over 't algemeen beans genoemd. Data met getters en setters.Janoz schreef op donderdag 23 januari 2014 @ 09:43:
Eigenlijk is het meer een 'struct' dan een 'object'.
https://niels.nu
Dus data-hiding komt ten koste van coupling van data en methodes. Als dat geen probleem is, gebruik een object, maar ik ben genoeg situaties tegengekomen waar dat wel probleem was.
@Waster: Ik ben erg benieuwd naar zo'n situatie.
[ Voor 9% gewijzigd door Janoz op 23-01-2014 09:54 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Dan krijg je al snel god-objecten. Als een object zichzelf moet persisteren, tekenenen, reageren op updates etc. dan overtreed je al snel het single responsibility principe.Janoz schreef op donderdag 23 januari 2014 @ 09:52:
@Hydra: Klopt, vandaar ook de quotes. Maar ik begrijp het punt wel dat Dricus probeert te maken. Als je echt naar de puurste OO vorm zou kijken zou zo'n object bv ook zelf zijn persisteren moeten implementeren. In de praktijk wordt dat (gelukkig) gewoon door bv een entitymanager of een DAO gedaan.
Het simpelste voorbeeld is een Convert. Is het Convert.ToInt(string) of myString.ToInt(). Verschillende talen en libraries gaan er anders mee om. Dit lijkt simpel, maar als je alle mogelijke transformatie methodes aan het object koppelt dan heeft ieder object oneindig veel methodes. Maar de eerste is gewoon een C-style methode.@Waster: Ik ben erg benieuwd naar zo'n situatie.
[ Voor 28% gewijzigd door Waster op 23-01-2014 10:11 ]
Ik vind absoluut niet dat volgens de "puurste vorm van OO" een object zijn eigen persistentie zou moeten regelen. Ik ken ook geen enkele definitie waarin dat aangedragen wordt.Janoz schreef op donderdag 23 januari 2014 @ 09:52:
@Hydra: Klopt, vandaar ook de quotes. Maar ik begrijp het punt wel dat Dricus probeert te maken. Als je echt naar de puurste OO vorm zou kijken zou zo'n object bv ook zelf zijn persisteren moeten implementeren. In de praktijk wordt dat (gelukkig) gewoon door bv een entitymanager of een DAO gedaan.
Het verbergen van implementatiedetails zorgt juist voor loose coupling, alles aan iedereen beschikbaar maken zorgt voor strong coupling. Je hebt je definities nogal backwards, sorry.Waster schreef op donderdag 23 januari 2014 @ 09:52:
OOP heeft één heel groot nadeel. Data hiding heeft voordeel dat je complexiteit verbergt, maar je koppelt wel je methodes aan je data! Coupling is altijd een zonde, dus dan is dit eigenlijk ook een no no. Als je je leven lang OO programmeert, dan heb je dat niet eens door. Wat als je 100 methodes hebt die op dezelfde data moeten werken en niet allemaal bij elkaar horen? Dan moet je snel teruggrijpen op static methodes en losse structs aan je methodes meegeven.
Klinkt meer als OO verkeerd toepassen, sorry. Een simpele bean heeft alleen maar getters en setters, ik zie niet waar daar ononderhoudbare verbindingen zouden ontstaan. De buitenwereld is sowieso alleen maar geinteresseerd in het gebruik van een object. De onderliggende implementatie zou je niet moeten interesseren. Oftewel; separation of concerns / encapsulation.Dus data-hiding komt ten koste van coupling van data en methodes. Als dat geen probleem is, gebruik een object, maar ik ben genoeg situaties tegengekomen waar dat wel probleem was.
[ Voor 5% gewijzigd door Hydra op 23-01-2014 10:05 ]
https://niels.nu
Uiteraard, en niet alleen dat, je krijgt ook nog een heleboel dubbele code aangezien persisteren echt een cross cutting concern is. Het single responsibility principe is zeker iets wat bij OO toegepast zou moeten worden, maar dat is niet iets wat perse bij (pure, academische) OO hoort. Een god object is duidelijk een anti-pattern, maar is niet strijdig met (pure, academische) OOP-regels.Waster schreef op donderdag 23 januari 2014 @ 10:00:
[...]
Dan krijg je al snel god-objecten. Als een object zichzelf moet persisteren, tekenenen, reageren op updates etc. dan overtreed je al snel het single responsibility principe.
Ik zie echter liever dat je mijn tweede opmerking beantwoord.
[ Voor 4% gewijzigd door Janoz op 23-01-2014 10:16 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Kort door de bocht. Tuurlijk zul je ergens anders in je design loose coupling krijgen, aangezien andere objecten niet bij de data kan. Maar ik bracht specifiek in dat de methode van je object die je schrijft gekoppeld is aan je data in je object. Dus geen object coupling, maar methode coupling! Dat valt niet te ontkennen. Dus wil jij dezelfde methode gebruiken voor andere data, dan moet je je methode kopieren of je krijgt die walgelijke inheritance trees. Hier heeft het procedurele/functionele paradigma geen last van.Hydra schreef op donderdag 23 januari 2014 @ 10:02:
Het verbergen van implementatiedetails zorgt juist voor loose coupling, alles aan iedereen beschikbaar maken zorgt voor strong coupling. Je hebt je definities nogal backwards, sorry.
Ik vind ook niet dat een object zijn eigen pesistentie moet regelen. Ik ben alleen bang dat ik wat moeilijk onder woorden weet te brengen wat ik met 'pure OO' bedoel. Ik bedoel eigenlijk het originele OO idee, zonder alle latere inzichten die geleid hebben tot de designpatterns die we nu kennen.Hydra schreef op donderdag 23 januari 2014 @ 10:02:
Ik vind absoluut niet dat volgens de "puurste vorm van OO" een object zijn eigen persistentie zou moeten regelen. Ik ken ook geen enkele definitie waarin dat aangedragen wordt.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Als jij een methode hebt die op meerdere object-types moet werken dan is gewoon je implementatie fout als je die in een dergelijke bean stop. Sowieso zijn dergelijke beans over het algemeen gewoon data-containers. Wat jij beschrijft is een symptoom van slecht ontwerp, geen symptoom van OO. Als je in elke bean class met String members "toBase64()" methodes gaat bouwen bijvoorbeeld doe je het gewoon heel erg fout.Waster schreef op donderdag 23 januari 2014 @ 10:16:
Kort door de bocht. Tuurlijk zul je ergens anders in je design loose coupling krijgen, aangezien andere objecten niet bij de data kan. Maar ik bracht specifiek in dat de methode van je object die je schrijft gekoppeld is aan je data in je object. Dus geen object coupling, maar methode coupling! Dat valt niet te ontkennen. Dus wil jij dezelfde methode gebruiken voor andere data, dan moet je je methode kopieren of je krijgt die walgelijke inheritance trees. Hier heeft het procedurele/functionele paradigma geen last van.
Dan nog ken ik geen "originele OO" ideeën waarin gespecificeerd wordt dat een object zelf voor z'n persistentie verantwoordelijk is. Sterker nog; in mijn lesmateriaal 'destijds' was storage ook een voorbeeld waarin je overerving gebruikt voor een persistentiemechanisme. Concreet heb je dus een abstract class (huhu) 'ObjectStore' met concrete implementaties ('RelationalObjectStore', 'FileObjectStore') etc. De te storen objecten hebben geen weet van de implementatie, alleen de concrete implementaties van de stores hebben die kennis.Janoz schreef op donderdag 23 januari 2014 @ 10:21:
Ik vind ook niet dat een object zijn eigen pesistentie moet regelen. Ik ben alleen bang dat ik wat moeilijk onder woorden weet te brengen wat ik met 'pure OO' bedoel. Het is eigenlijk het originele OO idee, zonder alle latere inzichten die geleid hebben tot de designpatterns die we nu kennen.
Ik ken geen enkel voorbeeld waarbij een bean-achtig type die verantwoordelijkheid heeft.
[ Voor 33% gewijzigd door Hydra op 23-01-2014 10:33 ]
https://niels.nu
Beschrijft mijn Persoon class nu eigenlijk gedrag? Op het eerste gezicht wel. Hij heeft toch methods? Echter, als je er wat langer over doorfilosofeert kun je tot de conclusie komen dat Persoon helemaal geen gedrag beschrijft. Als je die getters en setters weglaat en de fields public maakt, dan verandert de interface van de class wel, maar het gedrag dat van buitenaf zichtbaar is totaal niet. Sterker nog: Er is van buitenaf geen enkel gedrag te zien!
Die getters en setters geven je in feite de illusie dat je met een abstractie van gedrag te maken hebt, terwijl dit helemaal niet zo is. Persoon is niet meer dan een beschrijving van data. Het is een datatype. En dát is wat volgens mij ontbreekt in het OO paradigma. Het is enorm goed in het beschrijven en structureren van gedrag, maar het biedt je geen duidelijke manier om data te beschrijven.
Volgens mij zou je het Active Record pattern dat o.a. in Ruby on Rails gebruikt wordt als een voorbeeld kunnen beschouwen.Hydra schreef op donderdag 23 januari 2014 @ 10:30:
Ik ken geen enkel voorbeeld waarbij een bean-achtig type die verantwoordelijkheid heeft.
[ Voor 12% gewijzigd door Dricus op 23-01-2014 10:39 ]
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Euh nee? Een object is een vertaling van een functioneel concept naar een concrete implementatie. In bijvoorbeeld Java is een class een blauwdruk van een object. In javascript werkt het anders en gebruik je prototyping, daar bestaan classes niet (echt).Dricus schreef op donderdag 23 januari 2014 @ 10:37:
Je ziet dat je op minstens 2 verschillende manieren tegen het begrip object kunt aankijken: Abstractie van gedrag en instance van een class. De eerste komt denk ik dicht in de buurt van het pure OO denken. De tweede manier is wat pragmatischer en in de praktijk bruikbaarder.
Je sprint echt van de hak op de tak. Er hoort van buitenaf niks anders te zien dan de interface van een object. Of je members nu een public String hatseFlats is of public String getHatseFlats() maakt conceptueel helemaal niks uit. Alleen als het om de implementatie gaat, zorg je ervoor dat deze details met de methode verborgen worden, want achter die "getHatseFlats()" zou wel eens een complexe berekening kunnen zitten.Beschrijft mijn Persoon class nu eigenlijk gedrag? Op het eerste gezicht wel. Hij heeft toch methods? Echter, als je er wat langer over doorfilosofeert kun je tot de conclusie komen dat Persoon helemaal geen gedrag beschrijft. Als je die getters en setters weglaat en de fields public maakt, dan verandert de interface van de class wel, maar het gedrag dat van buitenaf zichtbaar is totaal niet. Sterker nog: Er is van buitenaf geen enkel gedrag te zien!
In C# is dit nog veel duidelijker: C# heeft properties die sprekend lijken op "public" members maar eigenlijk gewoon methods zijn.
Complete onzin. Zie boven: de buitenwereld interesseert het alleen maar wat er in en uit die methodes komt, hoe een object aan die gegevens komt is niet interessant voor de buitenwereld.Die getters en setters geven je in feite de illusie dat je met een abstractie van gedrag te maken hebt, terwijl dit helemaal niet zo is.
Sorry maar wat een kolder. Je hebt wat mij betreft een redelijk bizar denkproces gekoppeld aan een flinke dosis "klok-klepel".Persoon is niet meer dan een beschrijving van data. Het is een datatype. En dát is wat volgens mij ontbreekt in het OO paradigma. Het is enorm goed in het beschrijven en structureren van gedrag, maar het biedt je geen duidelijke manier om data te beschrijven.
Objecten ZIJN data. Alleen waar die data precies vandaan komt, wordt voor jou verborgen. En dat is met opzet; want het maakt je werk als developer makkelijker. Het enige moment wanneer het je interesseert hoe dat object aan die data komt, en wat er mee gedaan wordt, is als je aan de implementatie van dat object zelf moet werken.
Objecten hebben een strik gedefinieerde interface naar hun data, maar dat betekent niet dat ze dan opeens geen data zouden zijn. Ik snap echt niet hoe je uberhaupt op dat idee kunt komen.
https://niels.nu
Ik geef een voorbeeld en het nadeel van OOP als je een object methodes en verantwoordelijkheden geeft die te algemeen zijn voor een specifiek object. En vervolgens zeg je ook gewoon dat het een implementatie fout is, dus dat het een zwakte is van OOP? Volgens mij zijn we het dan eensHydra schreef op donderdag 23 januari 2014 @ 10:30:
Als jij een methode hebt die op meerdere object-types moet werken dan is gewoon je implementatie fout als je die in een dergelijke bean stop. Sowieso zijn dergelijke beans over het algemeen gewoon data-containers. Wat jij beschrijft is een symptoom van slecht ontwerp, geen symptoom van OO. Als je in elke bean class met String members "toBase64()" methodes gaat bouwen bijvoorbeeld doe je het gewoon heel erg fout.
Tenzij je data-containers ook OOP noemt, want dat noem ik geen OOP. Er is geen abstractie, geen enkele methode met logica. In de strikte definitie een object, maar niet hoe OOP bedoeld is.
Een implementatiefout is de fout van een taal? Dat is nieuw. In mijn wereld maken developers die fouten. En kom niet met dat gelul aan dat een taal moet voorkomen dat je fouten maakt, dat is gewoon onrealistisch.Waster schreef op donderdag 23 januari 2014 @ 10:49:
Ik geef een voorbeeld en het nadeel van OOP als je een object methodes en verantwoordelijkheden geeft die te algemeen zijn voor een specifiek object. En vervolgens zeg je ook gewoon dat het een implementatie fout is, dus dat het een zwakte is van OOP? Volgens mij zijn we het dan eens
Wat een onzin? Waarom zou een bean met alleen getters en setters geen OO zijn?Tenzij je data-containers ook OOP noemt, want dat noem ik geen OOP. Er is geen abstractie, geen enkele methode met logica. In de strikte definitie een object, maar niet hoe OOP bedoeld is.
Fuck hee, ik zou zorgen dat je manager deze onzin niet leest
[ Voor 3% gewijzigd door Hydra op 23-01-2014 10:56 ]
https://niels.nu
Jullie denken te veel en te letterlijk in 'functionaliteit'. Denk eens aan 'verantwoordelijkheid'. De verantwoordelijkheid van de Persoon-klasse is het in runtime vasthouden van wat aan één persoon gerelateerde gegevens per instantie.
Nogmaals, dat deze klasse (afgezien van getters en setters) geen methodes heeft, neemt het OO-aspect niet weg.
[ Voor 14% gewijzigd door CodeCaster op 23-01-2014 11:05 ]
https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...
Doe is normaal man. Ik heb nergens gezegd dat dit een fout in de taal is en dat dat moest worden voorkomen. Ik noemde alleen een nadeel van OOP. Wat een discussie zegHydra schreef op donderdag 23 januari 2014 @ 10:55:
[...]
Een implementatiefout is de fout van een taal? Dat is nieuw. In mijn wereld maken developers die fouten. En kom niet met dat gelul aan dat een taal moet voorkomen dat je fouten maakt, dat is gewoon onrealistisch.
Ik zie niet hoe dat in tegenspraak is met wat ik schrijf. We kijken volgens mij allebei naar hetzelfde ding en belichten vervolgens verschillende aspecten daarvan die niet met elkaar in tegenspraak zijn, maar elkaar aanvullen en het beeld completer maken.Hydra schreef op donderdag 23 januari 2014 @ 10:47:
Euh nee? Een object is een vertaling van een functioneel concept naar een concrete implementatie.
[...]
En in dat geval kun je je afvragen of die complexe berekening wel in die class thuishoort. De meningen zijn daar sterk over verdeeld.Je sprint echt van de hak op de tak. Er hoort van buitenaf niks anders te zien dan de interface van een object. Of je members nu een public String hatseFlats is of public String getHatseFlats() maakt conceptueel helemaal niks uit. Alleen als het om de implementatie gaat, zorg je ervoor dat deze details met de methode verborgen worden, want achter die "getHatseFlats()" zou wel eens een complexe berekening kunnen zitten.
In elke applicatie waarin je iets van CRUD doet komt er een moment dat een object geïnteresseerd is in data. Dat zo'n object methodes van een ander object nodig heeft om aan die data te komen doet daar niks aan af.Complete onzin. Zie boven: de buitenwereld interesseert het alleen maar wat er in en uit die methodes komt, hoe een object aan die gegevens komt is niet interessant voor de buitenwereld.
Zullen we het gewoon bij de argumenten houden? Met dit soort opmerkingen verpest je de sfeer van de discussie alleen maar.Sorry maar wat een kolder. Je hebt wat mij betreft een redelijk bizar denkproces gekoppeld aan een flinke dosis "klok-klepel".
IS een DAO data? IS een service data? In deze twee gevallen zou ik eerder zeggen: Objecten ZIJN gedrag. Tuurlijk hebben ze vaak wel state, maar het is hun gedrag dat voor de rest van de applicatie de échte toegevoegde waarde heeft. De stellingen "objecten ZIJN data" en "objecten ZIJN gedrag" zijn beide niet van toepassing op 100% van de objecten die je in het wild tegenkomt.Objecten ZIJN data. Alleen waar die data precies vandaan komt, wordt voor jou verborgen. En dat is met opzet; want het maakt je werk als developer makkelijker. Het enige moment wanneer het je interesseert hoe dat object aan die data komt, en wat er mee gedaan wordt, is als je aan de implementatie van dat object zelf moet werken.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
De sfeer van de discussie wordt verpest door mensen die gelijk willen krijgen, ongeacht hun kennisniveau, die misconcepties over wat OO is afdoen als feit. Ik ben dus ook wel een beetje klaar met jou en Waster; dit is vechten tegen de bierkaai. Je verdraait je verhaal iedere keer zoals je het zelf uitkomt, goed voorbeeld:Dricus schreef op donderdag 23 januari 2014 @ 11:18:
Zullen we het gewoon bij de argumenten houden? Met dit soort opmerkingen verpest je de sfeer van de discussie alleen maar.
Als je wat ik schrijf volledig uit zijn context gaat halen (we hadden het net nog over datacontainers als Persons, in die context schreef ik dat) ben je gewoon geen discussie meer aan het voeren maar aan het trollen.IS een DAO data? IS een service data? In deze twee gevallen zou ik eerder zeggen: Objecten ZIJN gedrag. Tuurlijk hebben ze vaak wel state, maar het is hun gedrag dat voor de rest van de applicatie de échte toegevoegde waarde heeft. De stellingen "objecten ZIJN data" en "objecten ZIJN gedrag" zijn beide niet van toepassing op 100% van de objecten die je in het wild tegenkomt.
https://niels.nu
Hetzelfde wat jij óók doet dus; sterker nog, jij bent degene met krachttermen die helemaal niet op hun plaats zijn. Zullen we daar nu dan allemaal maar mee ophouden?Hydra schreef op donderdag 23 januari 2014 @ 11:31:
[...]
De sfeer van de discussie wordt verpest door mensen die gelijk willen krijgen, ongeacht hun kennisniveau, die misconcepties over wat OO is afdoen als feit.
[ Voor 10% gewijzigd door NMe op 23-01-2014 11:50 ]
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Ik ben er niet op uit om gelijk te krijgen hoor. Ik vind het alleen af en toe wel leuk om de zaken eens op een andere manier te bekijken, that's all...Hydra schreef op donderdag 23 januari 2014 @ 11:31:
De sfeer van de discussie wordt verpest door mensen die gelijk willen krijgen,
En ik doe nog zo mijn best om niet al te stellig te zijn door zinsnedes als "denk ik" en "zou [...] kunnen" te gebruiken. Dus bij deze mijn disclaimer: Als het lijkt alsof ik een mening of mogelijke visie op de zaken als feit probeer te brengen, dan was dat niet mijn bedoeling. Als je dit bij mij constateert, voel je dan vrij om me daarop aan te spreken.ongeacht hun kennisniveau, die misconcepties over wat OO is afdoen als feit.
Dat vind ik lastig aan geschreven tekst. Misschien lees ik niet goed, maar mijn indruk was dat je met je opmerking "objecten ZIJN data" over meer had dan alleen datacontainers.Ik ben dus ook wel een beetje klaar met jou en Waster; dit is vechten tegen de bierkaai. Je verdraait je verhaal iedere keer zoals je het zelf uitkomt, goed voorbeeld:
[...]
Als je wat ik schrijf volledig uit zijn context gaat halen (we hadden het net nog over datacontainers als Persons, in die context schreef ik dat) ben je gewoon geen discussie meer aan het voeren maar aan het trollen.
Je lijkt aan te nemen dat ik bewust de boel loop te verdraaien om mijn gelijk te halen. Wat hier aan de hand is, is dat het bij geschreven tekst niet altijd even duidelijk is wat iemand precies bedoelt. Ik zal proberen in het vervolg om verduidelijking te vragen ipv aannames te doen.
Dit vind ik wel een goed punt. Ook als je geen gedrag op een class definieert d.m.v. methods, kun je inderdaad nog prima verdedigen dat die class wel degelijk een verantwoordelijkheid heeft.CodeCaster schreef op donderdag 23 januari 2014 @ 11:04:
Jullie denken te veel en te letterlijk in 'functionaliteit'. Denk eens aan 'verantwoordelijkheid'. De verantwoordelijkheid van de Persoon-klasse is het in runtime vasthouden van wat aan één persoon gerelateerde gegevens per instantie.
Het neemt het OO aspect niet helemaal weg nee, maar ik vraag me soms wel eens af of het overgieten van datacontainers met een OO sausje een zinvolle exercitie is. Dit komt met name omdat het van daaruit met de huidige ORM's enorm makkelijk is om aan zo'n class meteen ook maar de mappings naar je database toe te voegen (met annotations als @Entity, @Table, @Column, @OneToMany, etc). Dat ziet er allemaal prachtig declaratief uit en is ook enorm handig, maar ben je dan niet bezig om je class met meer dan één verantwoordelijkheid op te zadelen?Nogmaals, dat deze klasse (afgezien van getters en setters) geen methodes heeft, neemt het OO-aspect niet weg.
Het is dan niet meer alleen een container van data, maar definieert (welliswaar declaratief) ook een deel van het gedrag van je DAO's. Of om in verantwoordelijkheden te spreken: Het object is verantwoordelijk voor het vasthouden van data én voor de mapping van interne state naar een tabel en kolommen in de database. Als je daar validatie aan toe gaat voegen (@Constraint) dan komt daar een derde verantwoordelijkheid bij.
Dit is natuurlijk niet 100% accuraat. De mappings zijn geen onderdeel van het object, maar van de metadata die aan een class hangt. Het probleem blijft alleen dat als je naar je source kijkt, je ziet dat bepaalde verantwoordelijkheden (persistency, validatie) verdeeld zijn over meerdere classes.
Precies hierom vind ik het wel interessant om te kijken of er een duidelijke scheidslijn te trekken is tussen objecten en datacontainers, of state en data. Als ik dan met een enigszins filosofische bril naar OOP kijk, dan krijg ik de indruk dat die scheidslijn binnen de grenzen van het OOP paradigma niet zo duidelijk te trekken is, zonder concessies te doen aan de praktische bruikbaarheid van OO talen en frameworks.
De logische tegenvragen zijn natuurlijk: Waarom zou je dat willen? Praktisch gezien is OO toch hardstikke goed bruikbaar, ook voor dit soort gevallen? Mijn antwoord: Tsja, da's ook wel weer zo. Ik denk dat OO nog steeds rising en is er geen sprake van een fall. Je ziet wel dat het steeds vaker vermengd wordt met concepten uit het Functionele paradigma (lambda's in C++, C# en straks eindelijk ook Java) en meer dynamische talen (mixins, duck typing). Daardoor worden OO talen IMO alleen maar fijner om mee te programmeren.
[ Voor 46% gewijzigd door Dricus op 23-01-2014 13:43 ]
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...