
Hi all, Thank you very much Joaquín , I have learn a lot with your library and the review. Thanks also for all the pertinent answers. Thanks for extending the review period. Ion Gaztañaga wrote:
The formal review of Flyweight library, proposed by Joaquín M. López Muñoz, begins today (sorry for the late announcement): * What is your evaluation of the design?
The library has a simple to use interface based on a understandable domain-specific language having a good configurability and extensibility degree, even if the naming of some policies could be improved. This easy to use interface hides a more complex design. The relations between the different policies are not evident, and even if the library provides a elegant way to extend it, it's no evident to define such extensions without reading the code. Maybe the documentation should include a deeper description of the collaboration of the core implementation and the different policies. I like the way Boost.Parameter is used. In particular the use of is_locking, is_tracking, ... specialization in order to declare extensions. I like the idea to encapsulate in flyweight<T> the acquisition and the release of the shared resources, and as consequence masking the factory initialization. I like also the separation between the specifiers and the implementation classes. * performance test with intermodule_holder The tests performed on example5 should be extended with a intermodule_holder specifier. * intermodule_holder could use static_holder_class As the intermodule_holder is a kind of workaround for platforms where DLL can duplicate static libraries, we can have a better performance on the others for free. On platforms on which static variables are unique inter DLL the intermodule_holder specifier type can be a static_holder_class. This could be controlled using conditional compilation. struct intermodule_holder:holder_marker { template<typename C> struct apply { #ifdef BOOST_NO_DLL_UNIQUE_STATIC_VARIABLE typedef intermodule_holder_class<C> type; #else typedef static_holder_class<C> type; #endif }; }; This variable BOOST_NO_DLL_UNIQUE_STATIC_VARIABLE or a better name should be included in the boost/config.h file. I hope that the boost community could help to find on which platforms BOOST_NO_DLL_UNIQUE_STATIC_VARIABLE must be defined. * holder specifier renaming The holder's main responsibility is to instantiate a unique instance for its internal resources depending on the scope of the flyweight class. So the variation here is the scope. I haven't a better suggestion, but in my opinion holder do not reflects its responsibilities. * concrete holder specifiers renaming I'd RENAME static_holder by module_holder, and intermodule_holder by process_holder. module_holder reflects much more the scope accessibility intent for the users, static_holder talks more about the implementation. So at the end there will be two holders: . module_holder (renaming of static_holder) and . process_holder I don't think that simple_holder is better than static_holder. Does simple_holder stands for simple implemented holder? * factory specifier renaming Maybe repository could be more adapted to the associated responsibilities, store the shared values. * equality semantic It would be great if the library reach to manage with the pathological cases without reducing the performances of the usual cases. If in order to solve the problem you propose the user overrides the operator== with non-& semantics this must be included in the documentation. * adding a exclusive core specifier. In order "to provide maximum customizability so as to meet everybody's needs from basic users to programmers with very specific requirements" I think that the core specifier is needed. // default configuration typedef flyweight<T> fw_t1; // change core implementation typedef flyweight<T, core<shared_ptr_core> > fw_t2; // or even with the deduced parameters, change core implementation typedef flyweight<T, shared_ptr_core > fw_t2; // change some aspect of the default core as now typedef flyweight<T, no_tracking > fw_t3; This complicates only the flyweight class which needs to take care of the exclusion of the parameters. And of course this will need a description of what is expected from a core. As the interface do not change, this could be for future work.
* What is your evaluation of the implementation?
Quite good . Only some details * Minor correction The documentation states that the ..._specifier must be a ..._marker, but this is not needed for the ..._class On the code static_holder_class inherits from holder_marker, and hashed_factory_class inherits from factory_marker. Is this an error without importance, or there is something behind? * refcounted_value is a class that could be public. Why it is declared in the namespace detail. * could you explain why detail::recursive_lightweight_mutex is needed and boost::detail::lightweight_mutex is not used directly? struct simple_locking:locking_marker { typedef detail::recursive_lightweight_mutex mutex_type; typedef mutex_type::scoped_lock lock_type; }; A more general Boost question. Can boost libraries use the details namespace (i.e. private implementation) of the other boost libraries? What is needed to promote this shared private implementations to a public boost library? Should someonepurpose the library?
* What is your evaluation of the documentation?
Good! It was really a pleasure to read the tutorial. Some more elaborated examples should be included in order to show the user how to manage with more complicated examples, for example inter-process flyweights. These examples should be a probe of the extensibility mechanisms and a check the orthogonality of the policies. * intermodule_holder specifier A reference to a document explaining the problem with platforms not ensuring the unicity of static variables when DLL are used will be welcome. * Reference section The reference section was much more hard to follow. I think that the interactions between the different classes are very hard to describe using the current style. Un implementation section will help to understand how all this works, describing the interactions between the core and the policies. * Performance section I expect a performace section to be included. And how the future work will improbe this performances. * Rational Adding of the map versus set problem explanation.
* What is your evaluation of the potential usefulness of the library? Adapted to the described context. The current Flyweight design do not support very well persistent Flyweights, but this is another history.
* Did you try to use the library? With what compiler? No.
* How much effort did you put into your evaluation? In-depth reading of the docs and implementation.
* Are you knowledgeable about the problem domain? Yes, I have already used the Flyweight pattern in the context of mi work applications. Once I used Flyweight on a database context in order to reduce the space used by values that were duplicated too many times.
And finally, every review should answer this question:
* Do you think the library should be accepted as a Boost library? I think that the library proposed by Joaquin should be accepted.
I think that this Flyweight library is useful as it is for some kind off applications. No mayor changes are needed to the interface. Most of the renaming suggestions can be done adding new specifiers and using the extension mechanism. Good luck Joaquín --------------------------- Vicente Juan Botet Escriba