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 15:58:12 -0600 Organization: As little as possible Lines: 59 Message-ID: <2pfwosq07f.fsf@shell.xmission.com> References: <9dt5s6dalhetgfe99qs92c02hf0dbas44e@4ax.com> <2psjssq4zj.fsf@shell.xmission.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: mx01.eternal-september.org; posting-host="dZdavj/jUDynNQgDq5jkeA"; logging-data="21045"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18Yz4pnaiZwxOQGgophc5Kc" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (gnu/linux) Cancel-Lock: sha1:AVlNbJPWKufa4SDe+cYSvgxadww= sha1:v1ASoLOVQabwjIKWhbmnxKqmix8= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:3605 Lew writes: > On 05/05/2011 04:14 PM, Jim Janney wrote: >> 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. > > 'SortedMap', as so many have said. Apparently you need to practice > study of the API docs much, much more. We all should know the > essential collections types. Get studying! But that would be wrong, because a SortedMap does something entirely different from a LinkedHashMap. Take your own advice before dispensing it to others. -- Jim Janney