Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!aioe.org!eternal-september.org!feeder.eternal-september.org!.POSTED!not-for-mail From: Jim Janney Newsgroups: comp.lang.java.programmer Subject: Re: "Program to an interface" - When to break a design pattern Date: Thu, 05 May 2011 14:14:56 -0600 Organization: As little as possible Lines: 62 Message-ID: <2psjssq4zj.fsf@shell.xmission.com> References: <9dt5s6dalhetgfe99qs92c02hf0dbas44e@4ax.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: mx02.eternal-september.org; posting-host="dZdavj/jUDynNQgDq5jkeA"; logging-data="17159"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19TdEHfqX+NViyH3hRjUpP1" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) Cancel-Lock: sha1:D6kFpc3YTZi+vPyyGu7S5JoXkR8= sha1:jSA0Ci91Qq/b0YlhU2k4qsGoAzQ= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:3585 Zapanaz writes: > I've seen this design pattern before > > http://witte-consulting.com/documents/design-principles/ > > and, in general, I see the point of it. > > But say we've got something like this > > LinkedHashMap sortedMap = this.getSortedMap(); > > So you have the method > > public LinkedHashMap getSortedMap() { > //do stuff > } > > (not necessarily public) > > Now the design principle says, the method signature should instead be > > public Map getSortedMap() { > //do stuff > } > > The problem is, where I'm creating sortedMap above, I need the map to > retain the insertion order. If what's returned actually is a Map, > rather than a LinkedHashMap, then the results the user actually sees > are going to be in the wrong order. Making things worse, in this case, > nothing would actually break, only the end user would notice anything > was actually wrong. > > So in this case, it seems to me, that using LinkedHashMap in the > method signature makes sense. The fact that the return retains the > insertion order is an integral part of what the method does. > > If nothing else, it's going to save Fred Developer down the line from > looking at the code around this > > Map sortedMap = this.getSortedMap(); > > and thinking "wait, how do I know getSortedMap() is going to return a > result with the right ordering?", and having to waste time digging > into that method. > > *** > > Opinions? Angry mob with torches and pitchforks? The Spanish > Inquisition? The point of programming to the interface is to make it easier to substitute a different implementation, which implies that any reasonable implementation can be used. If this is not true, if the code that uses the object relies on behavior only found in one implementation, then there is no benefit to using the interface, and you make it more inviting for someone to break things later on. So in this case, no, programming to the interface would be the wrong thing to do. The point of design principles is to make you think before you break them :-) -- Jim Janney