Sounds like a good candidate for the Clojure documentation project. On Mon, Dec 10, 2012 at 5:33 PM, Mikera <mike.r.anderson...@gmail.com>wrote:
> Some thoughts from various Java libraries I have wrapped: > > - Normal functions are generally best for wrapping > - It can often make sense to have a protocol that dispatched on the type > of the Java object and/or clojure params for polymorphism and extension. > Your public functions should often call the protocol functions (after > applying any defaults / validation / argument re-ordering etc.) > - It can make sense to turn mutable Java APIs into immutable Clojure ones > in some cases. Depends on whether the Java API allows this and how much you > care about performance. > - Try to type hint with interfaces or abstract base classes only. It gets > messy if you start making special cases for specific concrete types, and is > probably a sign of incoherent design if you feel you need to do this. Best > to figure out the small set of Java abstractions that you want your API to > work with / expose and stick to functions that maipulate these. > - Ensure you have zero reflection warnings. Apart from the performance > cost, they are usually a sign of a logic error. > - I usually find the need for a few constructor functions to handle > different use cases. Not sure that having a 1-arg constructor from a map is > the best low level option - this will depend on the Java API. Often a 0-3 > arg constructor, a clone constructor or one that takes a List<Object> seem > to be the most common. If there are a lot of options, I'd tend to make > these keyword params. > - Keyword args are your friend - they often translate to setXXX or addXXX > calls in a Java API and enable you to wrap quite a lot of complexity as > extra parameters to one function. I think these are better than map > parameters on average, YMMV. > > > On Monday, 10 December 2012 13:21:09 UTC+8, Michael Grubb wrote: >> >> I've been searching for some best practices when it comes to wrapping >> existing Java libraries to make them more "clojurized." >> Unfortunately I've not found much. >> While I know enough to make something that works for me, I'd like to >> write it in such a manner that it can be used (and read) by others >> and not make them cringe in doing so. >> >> My first attempt was to simply write function wrappers around the java >> interop calls. >> This worked fine and was maintainable. Then I discovered 'lein check' >> and saw a whole lot of warnings about reflection. >> >> This led me to my second attempts. This time I wrote multimethods to >> dispatch on type of arguments and in each defmethod argument list >> I gave type hints for each argument. This indeed resolved the reflection >> warnings, but I fear that the resulting code is rather messy and not >> too pleasant to read either. This made me wonder if all the type >> checking I'm doing in the multimethod dispatch function isn't just as bad as >> the reflection that would take place. >> >> For my purposes and this particular library I'm not really concerned with >> performance, yet someone else may be. Can anyone offer me some >> advice on how best to approach a project like this? >> >> Kind regards, >> Michael >> > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > -- Grant Rettke | ACM, AMA, COG, IEEE gret...@acm.org | http://www.wisdomandwonder.com/ Wisdom begins in wonder. ((λ (x) (x x)) (λ (x) (x x))) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en