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: Daniele Futtorovic Newsgroups: comp.lang.java.programmer Subject: Re: "Program to an interface" - When to break a design pattern Date: Thu, 05 May 2011 22:48:21 +0200 Organization: A noiseless patient Spider Lines: 38 Message-ID: References: <9dt5s6dalhetgfe99qs92c02hf0dbas44e@4ax.com> <2psjssq4zj.fsf@shell.xmission.com> <2poc3gq3p2.fsf@shell.xmission.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Thu, 5 May 2011 20:48:19 +0000 (UTC) Injection-Info: mx03.eternal-september.org; posting-host="3L0fosuCYLsM9cW5CzHNyA"; logging-data="20806"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+xqDFCxWq3OLcmoYwGM5PG" User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 In-Reply-To: <2poc3gq3p2.fsf@shell.xmission.com> Cancel-Lock: sha1:8vcoeZDgbhk5vpvef4saRNv24Ew= Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:3590 On 05/05/2011 22:42, Jim Janney allegedly wrote: > Daniele Futtorovic writes: > >> On 05/05/2011 22:14, Jim Janney allegedly wrote: >>> 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 :-) >> >> Entirely disagreed. The code shown did not contain any justification for >> breaking the pattern in question, and on the opposite, it contained all >> the reasons to think more about encapsulation, which is the true >> underlying rationale for coding to interfaces -- not polymorphism per se. > > The justification is not in the code shown, but in the accompanying > remark "I need the map to retain the insertion order." There's no > interface in the JRE that promises this, and only one class that > provides it, which makes encapsulation, shall we say, difficult. That's not the point! Yes, you need a LinkedHashMap to retain insertion order in a Map. But retaining insertion order is relevant... only when inserting. In the code shown, the insertion happens in getSortedMap() (presumably). So yes, there a LinkedHashMap would be needed. But the code that *calls* getSortedMap() doesn't have to care about whether or not it's a LinkedHashMap. Hence the return type of getSortedMap() does not need to be LinkedHashMap. Qed. -- DF. An escaped convict once said to me: "Alcatraz is the place to be"