Ik zit met het volgende "probleem". Eigenlijk is het meer een design vraagstuk dan een probleem.
In mijn domein heb ik te maken met URI's die naar resources wijzen. Het zoeken in een relatief grote lijst naar een Uri was te traag. De meest voor de hand liggende methode om dit te optimaliseren was gebruik maken van een hash_map.
Eerst een versimpelde versie van de Uri
Nu zit ik met het volgende design issue. Mijn Uri 'weet' wat het uniek maakt en weet dus wat er gehashed moet worden. Maar de Uri weet niks van hashen, welk algoritme te gebruiken voor een hash en het berekenen van de hash hoort mijns inziens niet in een Uri object thuis.
Oplossingen:
1) Doe niet moeilijk en geef Uri een Hash method doe daar het werk en klaar.
2) Creëer een "Hasher" class. Een Uri heeft een Hasher, Uri::Hash called wat methods op de Hasher om de hash te berekenen en geeft het resultaat terug.
3) Maak een HashableUri (die een Hasher heeft). De constructor heeft een Uri als parameter en de HashableUri heeft de Hash method.
Nadelen:
1) Lelijk, het hashen is niet geencapsuleerd, en een Hash method op een uri vind ik eigenlijk ook niet zo mooi...
2) Nog steeds een Hash method op een Uri...
3) De noodzaak om een Hashable.... te maken voor iedere class die ik wil kunnen hashen.... Hashable moet mogelijk friend van de te hashen class zijn.
Welke oplossingen zie ik nog over het hoofd? Het moet vast netter kunnen...
In mijn domein heb ik te maken met URI's die naar resources wijzen. Het zoeken in een relatief grote lijst naar een Uri was te traag. De meest voor de hand liggende methode om dit te optimaliseren was gebruik maken van een hash_map.
Eerst een versimpelde versie van de Uri
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| class Uri { public: //constructors / destructor //Getters/Setters bool operator==(const Uri &rhs) { return ((m_host == rhs.m_host) && (m_port == rhs.m_port) && (m_specifier == rhs.m_specifier)); } private: boost::asio::ip::address m_host; unsigned int m_port; std::string m_specifier; }; |
Nu zit ik met het volgende design issue. Mijn Uri 'weet' wat het uniek maakt en weet dus wat er gehashed moet worden. Maar de Uri weet niks van hashen, welk algoritme te gebruiken voor een hash en het berekenen van de hash hoort mijns inziens niet in een Uri object thuis.
Oplossingen:
1) Doe niet moeilijk en geef Uri een Hash method doe daar het werk en klaar.
2) Creëer een "Hasher" class. Een Uri heeft een Hasher, Uri::Hash called wat methods op de Hasher om de hash te berekenen en geeft het resultaat terug.
3) Maak een HashableUri (die een Hasher heeft). De constructor heeft een Uri als parameter en de HashableUri heeft de Hash method.
Nadelen:
1) Lelijk, het hashen is niet geencapsuleerd, en een Hash method op een uri vind ik eigenlijk ook niet zo mooi...
2) Nog steeds een Hash method op een Uri...
3) De noodzaak om een Hashable.... te maken voor iedere class die ik wil kunnen hashen.... Hashable moet mogelijk friend van de te hashen class zijn.
Welke oplossingen zie ik nog over het hoofd? Het moet vast netter kunnen...
offtopic:
Btw als iemand een betere titel weet....
Btw als iemand een betere titel weet....
Lorem
Whenever we feel the need to comment something, we write a method instead. - Martin Fowler
People who think they know everything really annoy those of us who know we don't - Bjarne Stroustrup