Bravenboer: lees eens een boek over OO!

Hum, ik heb inderdaad nog een boek van Cardelli in de kast staan wat ik nog steeds niet helemaal gelezen heb. Bedankt voor de tip

.
Het woord 'library' is de denkfout. Je moet niet gaan zeggen: "Ik wil een mathlibrary maken, en dan ben ik niet datafocussed bezig maar functionfocussed, DUS is OO niet altijd datafocussed", maar je moet dan zeggen: "Voor een mathlibrary is OO niet de juiste ontwikkelmethode, dus kies je niet OO als ontwikkelmethode".
Mwah, allereerst had ik het niet over een math-library en zelfs geeneens over de vraag of een library functioneel of data-georienteerd is. Dit stuk ging over het toepassen van een modelleringsproces. Modelleringsprocessen zijn heel leuk, maar niet voor alle projecten. Library-design
kan een van die projecten zijn naar mijn mening. Ook experimentele projecten (en nee: ik doel niet op knoeiprojecten) zijn per definitie ongeschikt voor ontwikkeling via een gedetaileerd en strak modelleringsproces. Wellicht is dit echter niet zo'n goed argument omdat jij vooral praat vanuit een pure productie gedachte (als ik mij niet vergis). Ik doe dat over het algemeen niet en daar kunnen wat verschillende meningen uitkomen, die eigenlijk helemaal niet conflicterend zijn: we praten vanuit een andere situatie en met het oog op andere toepassingen.
Wat zal jij trouwens een hekel hebben aan eXtreme Programming en de hele scene daar om heen

.
Knoeiprojecties hebben geen design. Daar had ik het dan ook niet over

Ach, wat jij knoeien noemt moet je uiteraard zelf weten

.
Het IS het enige beeld wat correct is imho: OO is datageorienteerd software development. De basis is je data, daarOMHEEN bouw je je code.
Mwah, dat vind ik een wat beperkte kijk op OO. OO is uiteraard ontstaan uit exact deze gedachte, wat echter niet betekend dat je niet op een fraaie manier voor kleine delen van je applicatie een andere draai aan OO kunt geven. Ik zal dadelijk wat voorbeelden geven.
Zodra je op een punt komt dat je functioneel bezig bent en niet OO, dan moet je geen OO kiezen als ontwikkelmethode maar moet je een methode gebaseerd op procedurele talen kiezen.

. Voor veel van de punten waar ik het over heb zou ik dan dus zeker
niet een procedurele aanpak kiezen, maar goed: zo dadelijk wat voorbeelden.
Zodra je gaat focussen op "als ik een class maak met dat setje functies dan kan ik daar mooi classes van afleiden die die class extenden", dan moet je een library maken met die functies in C en verder ophouden met dat in OO te gaan doen, want je gebruikt de methode dan verkeerd.
Daar ben ik het niet mee eens (verwonderlijk he?

). Je kunt OO op een zeer fraaie manier ook gebruiken om te varieren in functionaliteit. Ik denk liever in termen van rollen van klassen. Een klasse vervult in een design een bepaalde rol.
Een simpel voorbeeldje waarin jouw stukje dus typisch
wel van toepassing is in de OO: stel dat je in een klasse een bepaalde functionaliteit moet implementeren. Een algoritme wat een probleem oplost. Je kunt dit keihard in je klasse gaan zetten, maar als je het vermoeden hebt dat er meerdere oplossingen voor dit probleem zijn kan je beter een interface definieren die deze
rol vervult. Je kunt deze interface nu op verschillende manieren implementeren. De client (de klasse waar het algoritme in zou moeten komen) kan nu werken op een
abstractie van het algoritme zonder een concrete implementatie te kunnen. Het algoritme kan dus varieren onafhankelijk van deze klasse.
Dit voorbeeldje vind ik uit eigen ervaring een zeer succesvolle design-techniek en er komt toch echt niets data-georienteerds in voor. Toch kan het door de polymorphisme van OO zeer fraai geimplementeerd worden.
Dit voorbeeld is trouwens het Strategy pattern wat beschreven staat in het boek "Design Patterns, Elements of Reusable Object-Oriented Software", Erich Gamma etc.
Geef me 1 voorbeeld waarmee je duidelijk maakt dat je classtree gebaseerd is op louter functionaliteit ipv data, plus dat OO de juiste weg was om dit zo te bouwen.
Ik heb net een klein voorbeeldje gegeven: het Strategy pattern, wat ik in de praktijk zeer veel gebruik (vaak onbewust: ik moest zelfs de naam opzoeken). Hiermee scheidt je een algoritme dus een in aparte rol. Je kunt algoritmen op verschillende manier implementeren en je gebruikt polymorphisme om met het algoritme te werken.
Een ander voorbeeld, wat je zeer succesvol kunt combineren met het Strategy pattern is de Template Method waarbij je delen van een algoritme van een operatie over laat aan sub-classes. In combinatie met het delegatie voordeel van het Strategy pattern kan dan een zeer fraaie klasse structuur opleveren zonder ook maar 1 data element.
Het Visitor pattern is een ander interessant pattern wat zeer veel gebruikt wordt in programma-transformatie toepassingen. Hiermee scheidt je de operatie van een data-structuur op een functionele manier. Het grote nadeel van het definieren van een operatie over een grote klasse-structuur is dat je operatie verspreidt staat over alle klassen. Met het Visitor pattern kan je dit voorkomen en bovendien biedt het daarnaast nog vele andere interessante mogelijkheden. Je zou kunnen zeggen dat het Visitor pattern een work-around is en dus niet OO-style, maar daar zou ik het niet mee eens zijn: met het Visitor pattern profiteer je nog steeds volop van polymorhisme, inheritance, overloading en allerlei andere interessante aspecten van OO.
In feite kan ik alle behavioral patterns wel op gaan noemen.
Overigens kan ik je ook veel praktijk voorbeelden geven die deze patterns toepassen. Renderers in Swing zijn bijvoorbeeld een typische toepassing van het Strategy pattern. Hetzelfde geldt voor een Comparator bij het sorteren van een lijst. Heeft een Comparator data? Nee! Heeft een Comparator een duidelijk rol? Ja! Met behulp van een Comparator kan je een sorterings-algoritme generiek en op verschillende manieren gebruik voor eenzelfde data-type. Succesvol design vind ik dat. Een ander succesvol systeem: SAX. Heb je wel eens ContentHandlers aan elkaar gebreid zonder dat er data in die ContentHandlers zit? Heerlijk!

.
Je moet NOOIT vergeten dat OO _een_ manier is om software te maken, niet _de_ manier.
Alweer zo'n goede tip

. Nu we toch bezig zijn met tips uitdelen: bezoek je even de laatste twee links van mijn signature?

. Gelukkig heb ik meer dan genoeg ervaring in niet-OO en zelfs niet-imperatieve talen, zodat ik kan inzien dat je inderdaad volkomen gelijk hebt.
Als je niet datafocussed bezig bent, moet je niet OO gebruiken.
Tja, ik hoop dus dat ik in dit vrij lange verhaal aangetoond heb dat dat niet hoeft te zijn, of je in ieder geval aan het denken heb gezet en wellicht zelfs nieuwsgierig gemaakt naar de boeken die ik noemde

.
Een van de redenen ook waarom Operating systems steevast niet in een OO taal gebouwd worden maar in een procedurele taal: men modelleert het systeem rondom functionaliteit, niet rondom data.
Ach, tja: je hebt mij ook niet horen beweren dat jij nu maar alles wat functionaliteit is moet gaan implementeren in een OO-taal. Ik heb alleen aangegeven dat je wel degelijk op een fraaie manier functionaliteit kunt implementeren waarbij je abstraheert van de data georienteerde aanpak. Overigens zijn de voorbeelden die jij noemt ook wel zeer typisch. Math libraries zijn bekende problemen, een operating system heeft ook vele problemen waardoor een OO-aanpak voor grote delen van dit systeem ongeschikt is.