Voor een opdracht op de TUD hier (jaaa, huiswerk!
) ben ik bezig met een Servlet.
Het is een vrij simpele webapplicatie (geen zoekfunctionaliteit, geen toeganscontrole) die een bibliotheek voorstelt met als voornaamste doel een aantal OO-paradigma toe te passen. De opdracht is dan ook iets als: "maak een applicatie/voorbeeld die een (aantal) OO-paradigma toepast".
Nou vind ik in principe dat de boel "af genoeg" is voor de opdracht, maar ben toch nog niet helemaal tevreden over een paar punten.
Ik heb gekozen om dmv Visitors de bibliotheek-objecten uit de database te vissen, in de database bij te werken en op te slaan of te verwijderen (de LibraryVisitors).
Daarnaast zijn er een stel Action-objecten die dmv een Factory geinstantieerd worden aan de hand van de action= request-parameter. Voor het verder afhandelen van deze Actions heb ik een andere Visitortree in het leven geroepen (de ActionVisitors). Er zijn drie belangrijke LibraryVisitors en twee belangrijke Visitors die zowel een ActionVisitor als een LibraryVisitor zijn.
Te weten, resp:
DestroyLibraryVisitor (voor het verwijderen van objecten uit de 'database', er is nog een DatabaseDestroyLibraryVisitor, maar dat boeit verder niet zo).
StoreLibraryVisitor (voor zowel de inserts als de updates in de database).
ReadLibraryVisitor (voor het inlezen van de objecten)
en
ActionHandleVisitor (de initiele object-creatie a.d.h.v. de gekozen Action en verdere afhandeling van de action, zoals het verwijderen van het object (als in, de verwijder-visitor aanmaken en zijn werk laten doen op dat object))
OutputVisitor (verantwoordelijk voor het tonen van de output, er is dan nog een HTML en een VRML versie van, maar die erven grote delen van de basis, voor zover iets uberhaupt al in VRML te doen is)
Daarnaast is er eenl LibraryObject met een stel specificaties (Library, BookShelf, Book, etc), voor de meeste operaties daarop is er weer een Action object (met BaseAction als generalisatie) ala EditBookShelfAction, DeleteBookAction en ShowSubjectAction.
Een ding waar ik tegen aan liep was iets dat ik ook wel al wist, als je zoiets hebt:
Bij dit voorbeeldje zal altijd de laatste methode gebruikt worden, is hier een generieke oplossing voor bedacht waarbij er wel een default-methode op te geven * is zonder dat er aanpassingen in de Visitable-Objecten nodig zijn?
Uiteraard kan je wel alle losse Visit methoden aanmaken en diegenen die niks hoeven te doen allemaal dezelfde methode aan laten roepen, maar echt super is dat niet...
Verder vond ik het erg vervelend om een generalisatie te vinden voor het creeren van Objecten uit de DB, aangezien een Person-object afgebeeld in de DB er zo uit ziet: person = personid, personname, description, ... en een Book-object zo: book = bookid, bookname, description, subjectid, ownerid, bookshelfid heb je al een stel verschillen waar ik niet zomaar een oplossing voor ken.
Een Book heeft namelijk als variabelen resp. een int, string, string, Subject-object, Person-object en BookShelf-object...
Toch is het grootste deel van de code voor het invullen van de velden van de objecten vrijwel hetzelfde. * Is hier een of andere generalisatie aan te brengen die niet een hele serie taken open laat voor de specialisaties?
En iets vergelijkbaars geldt voor de formulieren die gegenereerd kunnen worden, hoewel er wel het een en ander in losse methoden te stouwen is, heb ik niet het idee dat er significant gegeneraliseerd kan worden.
Een Subject-object heeft alleen een Name en een Description die te editten zijn, terwijl het Book-object een keuze-lijst voor Subjects, Owners (Persons), Authors (geen Persons) en BookShelfs nodig heeft...
* Is dit nog enigszins efficient te generaliseren zonder dat er een hoop werk over blijft bij de specialistische methoden?
Een kleine motivatie voor de vragen is ook wel op zijn plaats, van de 5602 regels code in totaal (inc commentaar en witregels) is er 3776 te vinden in de Visitors en daarvan het grootste deel in de 5 belangrijkste:
En het is daar uit ook wel duidelijk dat het de boel flink beter beheersbaar (mocht er een nieuw data-type nodig zijn, ik heb bijvoorbeeld nog geen zoekfunctionaliteit ingebouwd) wordt als er een groot deel weg te generaliseren is...
Er is vast een hoop nog onduidelijk, maar ik kan zo gauw niet meer bedenken wat ik aan generieke uitleg moet tikken zonder gelijk maar de hele code te posten, dus vraag er op los
Het is een vrij simpele webapplicatie (geen zoekfunctionaliteit, geen toeganscontrole) die een bibliotheek voorstelt met als voornaamste doel een aantal OO-paradigma toe te passen. De opdracht is dan ook iets als: "maak een applicatie/voorbeeld die een (aantal) OO-paradigma toepast".
Nou vind ik in principe dat de boel "af genoeg" is voor de opdracht, maar ben toch nog niet helemaal tevreden over een paar punten.
Ik heb gekozen om dmv Visitors de bibliotheek-objecten uit de database te vissen, in de database bij te werken en op te slaan of te verwijderen (de LibraryVisitors).
Daarnaast zijn er een stel Action-objecten die dmv een Factory geinstantieerd worden aan de hand van de action= request-parameter. Voor het verder afhandelen van deze Actions heb ik een andere Visitortree in het leven geroepen (de ActionVisitors). Er zijn drie belangrijke LibraryVisitors en twee belangrijke Visitors die zowel een ActionVisitor als een LibraryVisitor zijn.
Te weten, resp:
DestroyLibraryVisitor (voor het verwijderen van objecten uit de 'database', er is nog een DatabaseDestroyLibraryVisitor, maar dat boeit verder niet zo).
StoreLibraryVisitor (voor zowel de inserts als de updates in de database).
ReadLibraryVisitor (voor het inlezen van de objecten)
en
ActionHandleVisitor (de initiele object-creatie a.d.h.v. de gekozen Action en verdere afhandeling van de action, zoals het verwijderen van het object (als in, de verwijder-visitor aanmaken en zijn werk laten doen op dat object))
OutputVisitor (verantwoordelijk voor het tonen van de output, er is dan nog een HTML en een VRML versie van, maar die erven grote delen van de basis, voor zover iets uberhaupt al in VRML te doen is)
Daarnaast is er eenl LibraryObject met een stel specificaties (Library, BookShelf, Book, etc), voor de meeste operaties daarop is er weer een Action object (met BaseAction als generalisatie) ala EditBookShelfAction, DeleteBookAction en ShowSubjectAction.
Een ding waar ik tegen aan liep was iets dat ik ook wel al wist, als je zoiets hebt:
Java:
1
2
3
4
5
6
| // Pak de BookShelf variant void Visit(BookShelf b); // Pak de Book variant void Visit(Book b); // Pak overigen variant void Visit(LibraryObject); |
Bij dit voorbeeldje zal altijd de laatste methode gebruikt worden, is hier een generieke oplossing voor bedacht waarbij er wel een default-methode op te geven * is zonder dat er aanpassingen in de Visitable-Objecten nodig zijn?
Uiteraard kan je wel alle losse Visit methoden aanmaken en diegenen die niks hoeven te doen allemaal dezelfde methode aan laten roepen, maar echt super is dat niet...
Verder vond ik het erg vervelend om een generalisatie te vinden voor het creeren van Objecten uit de DB, aangezien een Person-object afgebeeld in de DB er zo uit ziet: person = personid, personname, description, ... en een Book-object zo: book = bookid, bookname, description, subjectid, ownerid, bookshelfid heb je al een stel verschillen waar ik niet zomaar een oplossing voor ken.
Een Book heeft namelijk als variabelen resp. een int, string, string, Subject-object, Person-object en BookShelf-object...
Toch is het grootste deel van de code voor het invullen van de velden van de objecten vrijwel hetzelfde. * Is hier een of andere generalisatie aan te brengen die niet een hele serie taken open laat voor de specialisaties?
En iets vergelijkbaars geldt voor de formulieren die gegenereerd kunnen worden, hoewel er wel het een en ander in losse methoden te stouwen is, heb ik niet het idee dat er significant gegeneraliseerd kan worden.
Een Subject-object heeft alleen een Name en een Description die te editten zijn, terwijl het Book-object een keuze-lijst voor Subjects, Owners (Persons), Authors (geen Persons) en BookShelfs nodig heeft...
* Is dit nog enigszins efficient te generaliseren zonder dat er een hoop werk over blijft bij de specialistische methoden?
Een kleine motivatie voor de vragen is ook wel op zijn plaats, van de 5602 regels code in totaal (inc commentaar en witregels) is er 3776 te vinden in de Visitors en daarvan het grootste deel in de 5 belangrijkste:
code:
1
2
3
4
5
6
7
8
9
| 641 action/ActionHandleVisitor.java
129 action/BaseActionVisitor.java
212 action/HTMLOutputVisitor.java
973 action/OutputVisitor.java
595 action/VRMLOutputVisitor.java
109 library/DatabaseDestroyLibraryVisitor.java
594 library/DatabaseReadLibraryVisitor.java
239 library/DatabaseStoreLibraryVisitor.java
3492 total |
En het is daar uit ook wel duidelijk dat het de boel flink beter beheersbaar (mocht er een nieuw data-type nodig zijn, ik heb bijvoorbeeld nog geen zoekfunctionaliteit ingebouwd) wordt als er een groot deel weg te generaliseren is...
Er is vast een hoop nog onduidelijk, maar ik kan zo gauw niet meer bedenken wat ik aan generieke uitleg moet tikken zonder gelijk maar de hele code te posten, dus vraag er op los