Bij heb aanroepen van een bepaalde methode bij mij kunnen 2 dingen gebeuren:
1) het gaat goed, stuur een object van het ene type terug.
2) het gaat fout, stuur een message terug
De vraag is hoe ik dit het beste kan oplossen. Er zijn een aantal mogelijkheden:
1) zorg ervoor de beide types een gemeenschappelijk supertype hebben. Dit is helaas niet altijd mogelijk omdat een van de types niet te extenden is, bv een String. Verder is het ook niet altijd wenselijk omdat het 2 types zijn die eigelijk niets met elkaar te maken hebben, maar alleen toevallig hier beide als return type kunnen optreden.
2) wrap de beide types in een nieuwe class. Hierbij kan je terplekke een nieuwe class hierarchie maken, bv MessageOrFoo. Dit lijkt dan veel op de union type van c. Het probleem is dat je dan veel overhead hebt (dus ook qua onderhoud) omdat je van dit soort zinloze prutsclasses krijgt.
3) maak het return type Object. Hierdoor kan je van alles terug sturen. Het probleem is dat je dan niet kan zien wat je allemaal terug krijgt. Dus ga je in de toekomst uitbreiden met nog een type bij het returned, dan kan je compile time niet meer checken of alles goed afgehandelt gaat worden.
4) bv een null terugsturen als er iets misgaat en daarna via een extra methode de oorzaak achterhalen, bv. getError. Het probleem is dat dit erg veel problemen op gaat leveren in een multithreaded omgeving.
Ik weet dat dit allemaal supermooi opgeslot kan worden met een echt union/option type. Het probleem is dat de meeste oo talen dit dus niet ondersteunen.,
Voor welke oplossing kiezen jullie dus?
1) het gaat goed, stuur een object van het ene type terug.
2) het gaat fout, stuur een message terug
De vraag is hoe ik dit het beste kan oplossen. Er zijn een aantal mogelijkheden:
1) zorg ervoor de beide types een gemeenschappelijk supertype hebben. Dit is helaas niet altijd mogelijk omdat een van de types niet te extenden is, bv een String. Verder is het ook niet altijd wenselijk omdat het 2 types zijn die eigelijk niets met elkaar te maken hebben, maar alleen toevallig hier beide als return type kunnen optreden.
2) wrap de beide types in een nieuwe class. Hierbij kan je terplekke een nieuwe class hierarchie maken, bv MessageOrFoo. Dit lijkt dan veel op de union type van c. Het probleem is dat je dan veel overhead hebt (dus ook qua onderhoud) omdat je van dit soort zinloze prutsclasses krijgt.
3) maak het return type Object. Hierdoor kan je van alles terug sturen. Het probleem is dat je dan niet kan zien wat je allemaal terug krijgt. Dus ga je in de toekomst uitbreiden met nog een type bij het returned, dan kan je compile time niet meer checken of alles goed afgehandelt gaat worden.
4) bv een null terugsturen als er iets misgaat en daarna via een extra methode de oorzaak achterhalen, bv. getError. Het probleem is dat dit erg veel problemen op gaat leveren in een multithreaded omgeving.
Ik weet dat dit allemaal supermooi opgeslot kan worden met een echt union/option type. Het probleem is dat de meeste oo talen dit dus niet ondersteunen.,
Voor welke oplossing kiezen jullie dus?