On Mon, Aug 16, 2010 at 3:37 PM, Nicolas Oury <nicolas.o...@gmail.com> wrote: > On Mon, Aug 16, 2010 at 10:51 AM, Martin DeMello > <martindeme...@gmail.com> wrote: >> Sometimes there's simply no way around it. For instance, I recently >> had some python code that (stripped to its simplest form) had two >> classes, Document and Attachment, where Attachment was a specialised >> subclass of Document, but Document had a list of Attachments as one of >> its members. There was no way around packing the Document and >> Attachment classes into one big file, simply because I couldn't do >> circular module dependencies (python files are modules), but any >> refactoring of the code to remove the circular dependency left it >> *more* complicated than before. > > In Clojure, a protocol Attachable, could have been made explaining > what are the things you need for an attachment.
How would that have helped? The problem lay in the fact that there could be many subclasses of Document, but only one specific subclass, Attachment, could go into the attachments[] field. So if we had to split the code into two files, we'd have class Attachment(Document) # <-- attachment.py needs to import from document.py ... and class Document def create_attachment self.attachments += Attachment.new() # <-- document.py needs to import from attachment.py I did think for a while that it was a code smell, but after some attempts at refactoring decided it was a "genuine" circular reference in that this was the conceptually simplest and clearest way to write it. martin -- 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