From: Farrukh N. <fa...@we...> - 2009-03-24 14:36:14
|
Edwin Commandeur wrote: > Hi all, > > In reaction to a recent issue that OptionsBase (the base class for > specific Options objects) doesn't expose it's setAttribute methods, > while this can be useful at times I have thought of 3 options for options: > > A.) Let all XxxOptions objects extend Options directly. PRO: * direct > access to setAttribute methods; CONS: * Options is actually a way to > construct an arbitrary javascript object, while XxxOptions are not > arbitrary javascript objects (they are technically in OpenLayers, but > not conceptually), but a javascript object with specific properties > (or attributes). * the code suggestions in the IDE get cluttered by > all the setAttributeXxx methods > > B.) Let XxxOptions have a 'mergeOptions(Options options)' method that > is able to take an Options object on which arbitrary properties can be > set, and merge them (copy all the properties) with the XxxOptions > object. PRO: * XxxOptions can have the power of the Options object > without having to expose all the Options methods itself. * no code > suggesting clutter; CONS: * XxxOptions would need to still extend > OptionsBase, so there will remain 2 classes which overlapping and thus > one should be redundant. * It is inconvenient for users to have to > create two Options objects to set options that were not foreseen by > the GWT-OL API > Code Example Option B: > MapOptions mapOptions = new MapOptions(); > mapOptions.setTileSize(new Size(300,300)); > Options options = new Options(); > options.setAttribute("zIndex", 1000); //fictional > mapOptions.mergeOptions(options); > > C.) Let XxxOptions wrap Options and provide a getOptions method > through which arbitrary properties can be set. PRO: see B) CONS: needs > one step more to set an attribute than A) => although this is also an > advantage since you want user to have to set as less 'arbitrary' > properties as possible and not make it to easy for them to do this. > Code Example Option C: > MapOptions mapOptions = new MapOptions(); > mapOptions.setTileSize(new Size(300,300)); > mapOptions.getOptions().setAttribute("zIndex", 1000); > > Currently I would favor option C.) as it acknowledges that > conceptually an XxxOptions object is not a subclass of Options. This > is because Options is actually more a generic way to create a > Javascript Object with different properties in java (so you don't have > to do this using JSNI). For me both B and C are confusing with more than one typeof Option class while A is clear. I am personally not bothered by IDE suggetsion clutter issue. IMHO We should not let IDE cosniderations impact the naturalness of the API. So, with my limited experience at this API I feel A is best. Please do not consider this a VOTE as I do not feel as qualified as other team mates to carry the same weight of opinion. > > While we are on this I would suggest that we rename Options and the > setAttribute methods, as JavaScript Objects do not have attributes, > but properties. One possibility I am thinking of is that the > setProperty methods should be methods of JSObject. That way a > MapOptions object can be just a JSObjectWrapper from which you can > request the JSObject through getJSObject and which allows setting > properties dynamically. Possibly there is some security reason why GWT > doesn't allow setting properties on JavaScriptObject, although I > cannot think of one, because all properties of a javascript object can > be modified runtime if you have access to the objects on the page: > http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/core/client/JavaScriptObject.html > > Throughout the code base there are more place where DOM terminology: > Elements that have Attributes, is used where Javascript terminology is > more correct: Objects that have properties. > See also: > http://jennifermadden.com/javascript/objectsPropertiesMethods.html Again with my limited experience, above suggestion sounds reasonable. Thanks. -- Regards, Farrukh Web: http://www.wellfleetsoftware.com |