<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Object Mentor Blog: The Liskov Substitution Principle for "Duck-Typed" Languages</title>
    <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>The Liskov Substitution Principle for &amp;quot;Duck-Typed&amp;quot; Languages</title>
      <description>&lt;p&gt;&lt;span class="caps"&gt;OCP&lt;/span&gt; and &lt;span class="caps"&gt;LSP&lt;/span&gt; together tell us how to organize similar &lt;em&gt;vs.&lt;/em&gt; variant behaviors. I blogged the other day about &lt;a href="http://blog.objectmentor.com/articles/2008/09/04/the-open-closed-principle-for-languages-with-open-classes"&gt;&lt;span class="caps"&gt;OCP&lt;/span&gt; in the context of languages with open classes&lt;/a&gt;
 (&lt;em&gt;i.e.,&lt;/em&gt; dynamically-typed languages). Let&amp;#8217;s look at the &lt;a href="http://www.objectmentor.com/resources/articles/lsp.pdf"&gt;Liskov Substitution Principle&lt;/a&gt; (LSP).&lt;/p&gt;


	&lt;p&gt;The Liskov Substitution Principle was coined by Barbara Liskov in &lt;a href="http://portal.acm.org/citation.cfm?id=62141"&gt;Data Abstraction and Hierarchy&lt;/a&gt; (1987).&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2, then S is a subtype of T.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;I&amp;#8217;ve always liked the elegant simplicity, yet power, of &lt;span class="caps"&gt;LSP&lt;/span&gt;. In less formal terms, it says that if a client (program) expects objects of one type to behave in a certain way, then it&amp;#8217;s only okay to substitute objects of another type if the same expectations are satisfied.&lt;/p&gt;


	&lt;p&gt;This is our best definition of inheritance. The well-known &lt;strong&gt;is-a&lt;/strong&gt; relationship between types is not precise enough. Rather, the relationship has to be &lt;strong&gt;behaves-as-a&lt;/strong&gt;, which unfortunately is more of a mouthful. Note that &lt;strong&gt;is-a&lt;/strong&gt; focuses on the &lt;em&gt;structural&lt;/em&gt; relationship, while &lt;strong&gt;behaves-as-a&lt;/strong&gt; focuses on the &lt;em&gt;behavioral&lt;/em&gt; relationship. A very useful, pre-TDD design technique called &lt;a href="http://en.wikipedia.org/wiki/Design_by_contract"&gt;Design by Contract&lt;/a&gt; emerges out of &lt;span class="caps"&gt;LSP&lt;/span&gt;, but that&amp;#8217;s another topic.&lt;/p&gt;


	&lt;p&gt;Note that there is a slight assumption that I made in the previous paragraph. I said that &lt;span class="caps"&gt;LSP&lt;/span&gt; defines &lt;em&gt;inheritance&lt;/em&gt;. Why inheritance specifically and not &lt;em&gt;substitutability&lt;/em&gt;, in general? Well, inheritance has been the main vehicle for substitutability for most OO languages, especially the statically-typed ones.&lt;/p&gt;


	&lt;p&gt;For example, a Java application might use a simple tracing abstraction like this.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
public interface Tracing {
    void trace(String message);
}
    &lt;/code&gt;
&lt;/pre&gt;  

	&lt;p&gt;Clients might use this to trace methods calls to a log. Only classes that implement the &lt;code&gt;Tracer&lt;/code&gt; interface can be given to these clients. For example,&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
public class TracerClient {
    private Tracer tracer;

    public TracerClient(Tracer tracer) {
        this.tracer = tracer;
    }

    public void doWork() {
        tracer.trace("in doWork():");
        // ...
    }
}
    &lt;/code&gt;
&lt;/pre&gt;  

	&lt;p&gt;However, &lt;a href="http://en.wikipedia.org/wiki/Duck_typing"&gt;Duck Typing&lt;/a&gt; is another form of substitutability that is commonly seen in dynamically-typed languages, like Ruby and Python.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;If it walks like a duck and quacks like a duck, it must be a duck.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Informally, duck typing says that a client can use any object you give it as long as the object implements the methods the client wants to invoke on it. Put another way, the object must respond to the messages the client wants to send to it.&lt;/p&gt;


	&lt;p&gt;The object appears to be a &amp;#8220;duck&amp;#8221; as far as the client is concerned.&lt;/p&gt;


	&lt;p&gt;In or example, clients only care about the &lt;code&gt;trace(message)&lt;/code&gt; method being supported. So, we might do the following in Ruby.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
class TracerClient 
  def initialize tracer 
    @tracer = tracer
  end

  def do_work
    @tracer.trace "in do_work:" 
    # ... 
  end
end

class MyTracer
  def trace message
    p message
  end
end

client = TracerClient.new(MyTracer.new)
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;No &amp;#8220;interface&amp;#8221; is necessary. I just need to pass an object to &lt;code&gt;TracerClient.initialize&lt;/code&gt; that responds to the &lt;code&gt;trace&lt;/code&gt; message. Here, I defined a class for the purpose. You could also add the &lt;code&gt;trace&lt;/code&gt; method to another type or object.&lt;/p&gt;


	&lt;p&gt;So, &lt;span class="caps"&gt;LSP&lt;/span&gt; is still essential, in the generic sense of valid substitutability, but it doesn&amp;#8217;t have to be inheritance based.&lt;/p&gt;


	&lt;p&gt;Is Duck Typing good or bad? It largely comes down to your view about dynamically-typed &lt;em&gt;vs.&lt;/em&gt; statically-typed languages. I don&amp;#8217;t want to get into that debate here! However, I&amp;#8217;ll make a few remarks.&lt;/p&gt;


	&lt;p&gt;On the negative side, without a &lt;code&gt;Tracer&lt;/code&gt; abstraction, you have to rely on appropriate naming of objects to convey what they do (but you should be doing that anyway). Also, it&amp;#8217;s harder to find all the &amp;#8220;tracing-behaving&amp;#8221; objects in the system.&lt;/p&gt;


	&lt;p&gt;On the other hand, the client really doesn&amp;#8217;t care about a &amp;#8220;Tracer&amp;#8221; type, only a single method. So, we&amp;#8217;ve decoupled &amp;#8220;client&amp;#8221; and &amp;#8220;server&amp;#8221; just a bit more. This decoupling is more evident when using closures to express behavior, &lt;em&gt;e.g.,&lt;/em&gt; for &lt;code&gt;Enumerable&lt;/code&gt; methods. In our case, we could write the following.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
class TracerClient2 
  def initialize &amp;#38;tracer 
    @tracer = tracer
  end

  def do_work 
    @tracer.call "in do_work:" 
    # ... 
  end
end

client = TracerClient2.new {|message| p "block tracer: #{message}"}
    &lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;For comparison, consider how we might approach substitutability in &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;. As a statically-typed language, Scala doesn&amp;#8217;t support duck typing &lt;em&gt;per se&lt;/em&gt;, but it does support a very similar mechanism called &lt;a href="http://neilbartlett.name/blog/2007/09/13/statically-checked-duck-typing-in-scala/"&gt;structural types&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Essentially, structural types let us declare that a method parameter must support one or more methods, without having to say it supports a full interface. Loosely speaking, it&amp;#8217;s like using an anonymous interface.&lt;/p&gt;


	&lt;p&gt;In our Java example, when we declare a tracer object in our client, we would be able to declare that is supports &lt;code&gt;trace&lt;/code&gt;, without having to specify that it implements a full interface.&lt;/p&gt;


	&lt;p&gt;To be explicit, recall our Java constructor for &lt;code&gt;TestClient&lt;/code&gt;.&lt;/p&gt;


&lt;pre&gt;
    &lt;code&gt;
public class TracerClient {
    public TracerClient(Tracer tracer) { ... }
    // ...
    }
}
    &lt;/code&gt;
&lt;/pre&gt;  

In Scala, a complete example would be the following.
&lt;pre&gt;
    &lt;code&gt;
class ScalaTracerClient(val tracer: { def trace(message:String) }) {
    def doWork() = { tracer.trace("doWork") }
}

class ScalaTracer() {
    def trace(message: String) = { println("Scala: "+message) }
}

object TestScalaTracerClient {
    def main() {
        val client = new ScalaTracerClient(new ScalaTracer())
        client.doWork();
    }
}
TestScalaTracerClient.main()
    &lt;/code&gt;
&lt;/pre&gt;  

	&lt;p&gt;Recall from &lt;a href="http://blog.objectmentor.com/articles/2008/08/03/the-seductions-of-scala-part-i"&gt;my previous blogs on Scala&lt;/a&gt;, the argument list to the class name is the constructor arguments. The constructor takes a &lt;code&gt;tracer&lt;/code&gt; argument whose &amp;#8220;type&amp;#8221; (after the &amp;#8217;:&amp;#8217;) is &lt;code&gt;{ def trace(message:String) }&lt;/code&gt;. That is, all we require of &lt;code&gt;tracer&lt;/code&gt; is that it support the &lt;code&gt;trace&lt;/code&gt; method.&lt;/p&gt;


	&lt;p&gt;So, we get duck type-like behavior, but statically type checked. We&amp;#8217;ll get a compile error, rather than a run-time error, if someone passes an object to the client that doesn&amp;#8217;t respond to &lt;code&gt;tracer&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;To conclude, &lt;span class="caps"&gt;LSP&lt;/span&gt; can be reworded &lt;em&gt;very&lt;/em&gt; slightly.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2, then S is &lt;strong&gt;substitutable for&lt;/strong&gt; T.&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;I replaced &lt;strong&gt;a subtype of&lt;/strong&gt; with &lt;strong&gt;substitutable for&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;An important point is that the idea of a &amp;#8220;contract&amp;#8221; between the types and their clients is still important, even in a  language with duck-typing or structural typing. However, languages with these features give us more ways to extend our system, while still supporting &lt;span class="caps"&gt;LSP&lt;/span&gt;.&lt;/p&gt;</description>
      <pubDate>Sat, 06 Sep 2008 23:48:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:48d425c0-b536-44de-bf6a-b83755c064b9</guid>
      <author>Dean Wampler</author>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages</link>
      <category>Dean's Deprecations</category>
      <category>Dynamic Languages</category>
      <category>Design Principles</category>
      <category>Ruby</category>
      <category>ducktyping</category>
      <category>Scala</category>
      <category>Java</category>
      <category>design</category>
      <category>LSP</category>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Staubsaugerroboter</title>
      <description>&lt;p&gt;Nice, thanks for this post :)&lt;/p&gt;</description>
      <pubDate>Tue, 20 Dec 2011 06:37:36 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:5ab8cd67-5e11-418f-9303-f8d08cff63ca</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-189877</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by FM TRANSMITTER</title>
      <description>&lt;p&gt;Regulations to legalise the use of certain types of &lt;a href="http://www.fmheroes.org/" rel="nofollow"&gt;FM TRANSMITTER&lt;/a&gt; came into force on 8 December 2006. From the end of 2006 the iTrip and other &lt;a href="http://www.fmheroes.org/" rel="nofollow"&gt;FM TRANSMITTER&lt;/a&gt;, such as the popular Belkin Tunecast can be used without licence in the United Kingdom. To be legal, it must carry a CE mark which indicates their approval for sale in the European Union.&lt;/p&gt;</description>
      <pubDate>Mon, 28 Nov 2011 20:30:43 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:e002a3bc-7874-4c4f-ab29-9ce02a9b4707</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-179379</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by tv guide</title>
      <description>&lt;p&gt;tjank you for sharing! good work as always!&lt;/p&gt;</description>
      <pubDate>Sat, 26 Nov 2011 10:07:50 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:a02adf9c-9d99-476d-8abe-31b651fcdf67</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-178756</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Ahmed Zaman Khan</title>
      <description>&lt;p&gt;Good Notes thanks&amp;#8230;.&lt;/p&gt;</description>
      <pubDate>Thu, 24 Nov 2011 02:54:13 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:57fb986f-62ca-4d28-9440-2f9a497188a6</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-177431</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Inchirieri Auto Otopeni</title>
      <description>&lt;p&gt;The big players Cooperstown brand, which was employed through 1983 to Michael went bonkers (and during that point this 49ers had been very good!)&lt;/p&gt;</description>
      <pubDate>Tue, 15 Nov 2011 02:53:47 -0600</pubDate>
      <guid isPermaLink="false">urn:uuid:3c4889da-0f5a-40e1-a1c6-0f4e10991055</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-173004</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by christian louboutin</title>
      <description>&lt;p&gt;The professional design make you foot more comfortable. Even more tantalizing,this pattern make your legs look as long as you can,it will make you looked more attractive.Moveover,it has reasonable price.If you are a popular woman,do not miss it.&lt;/p&gt;


	&lt;p&gt;Technical details of Christian Louboutin Velours Scrunch Suede Boots Coffee:&lt;/p&gt;


	&lt;pre&gt;&lt;code&gt;Color: Coffee
Material: Suede
4(100mm) heel
Signature red sole x&lt;/code&gt;&lt;/pre&gt;


	&lt;p&gt;Fashion, delicate, luxurious Christian louboutins shoes on sale, one of its series is Christian Louboutin Tall Boots, is urbanism collocation. This Christian louboutins shoes design makes people new and refreshing. Red soles shoes is personality, your charm will be wonderful performance.&lt;/p&gt;</description>
      <pubDate>Thu, 03 Nov 2011 09:39:07 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:33d520e7-350e-4d7f-8a9f-51548d02d5d0</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-167633</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by flac converter</title>
      <description>&lt;p&gt;Thank you for sharing, I&#8217;ll definitely dig deeper into it.&lt;/p&gt;</description>
      <pubDate>Thu, 27 Oct 2011 02:49:06 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:a4ef05b0-80c6-4c47-8f0d-a2a7891881c3</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-164476</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Melinda Helbock</title>
      <description>&lt;p&gt;These languages are so complicated, they take a long time to really master. Thanks for the helpful post.&lt;/p&gt;</description>
      <pubDate>Fri, 21 Oct 2011 14:49:37 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c4bb454c-7940-4d34-8bab-1c91191b1982</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-160859</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by ysbearing</title>
      <description>&lt;p&gt;Slewing ring is also called slewing bearing, some people called: rotary support, swing support. English Name: slewing bearing or slewing ring bearing or turn table bearing, slewing ring in the real industrial applications is very wide.&lt;/p&gt;</description>
      <pubDate>Wed, 19 Oct 2011 03:28:55 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:28812c08-e8fb-4d33-9b27-4be9da6f4a14</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-159514</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Ashley Bowling</title>
      <description>&lt;p&gt;&amp;#8216;Today it will be stormy for the sky is red and overcast.&amp;#8217; You know how to interpret the appearance of the sky, but you cannot interpret the signs of the times.&amp;#8221;&lt;/p&gt;</description>
      <pubDate>Sun, 16 Oct 2011 05:20:31 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1d86d0d0-5aa0-4168-ab82-3e0e417aae55</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-157342</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by canada goose coat</title>
      <description>&lt;p&gt;When it comes to feather dress, what appears in your mind? Which kind brand of down jacket do you like prefer? Though there are many down jackets for you to choose from, on the word, which one you really enjoy? I want to say that &lt;a href="http://www.shopcanadagoosejackets.com/cag012-p-12.html" rel="nofollow"&gt;canada goose coats&lt;/a&gt; is really your best choice. I believe you can&amp;#8217;t agree with me any more. When you take the quality into consideration, you will find that it is superior to any other kind of coat. Besides, &lt;a href="http://www.shopcanadagoosejackets.com/" rel="nofollow"&gt;discount canada goose jackets&lt;/a&gt; is a world well-known brand, which has gained high reputation in the world, which has accepted by our customers and some organization. Because of its high quality, some of our loyal customers have promoted it to the people around them. In their opinion, it is good to informing others to know it. Recently, &lt;a href="http://www.shopcanadagoosejackets.com/canada-goose-trillium-parka-c-5.html" rel="nofollow"&gt;Canada Goose Trillium Parka&lt;/a&gt; is on hot sale. What I have to inform you is that all the products there are made by hand, so they are elaborative and elegant enough. It is really beautiful once you dress in. So, if you are a lovely girl or woman, go to the store to buy one for you. You will appreciate it that you have such a coat.In addition, they also have any other products like &lt;a href="http://www.shopcanadagoosejackets.com/canada-goose-gloves-c-6.html" rel="nofollow"&gt;canada goose Gloves&lt;/a&gt; and &lt;a href="http://www.shopcanadagoosejackets.com/canada-goose-snow-mantra-parka-9501m-black-p-9.html" rel="nofollow"&gt;canada goose jacket supplier&lt;/a&gt;.Hope your will like its!&lt;/p&gt;</description>
      <pubDate>Thu, 13 Oct 2011 01:38:58 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:73f872b3-d39d-4c7b-b122-4eb49b5936d4</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-155745</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by cheap tisa snapbacks</title>
      <description>&lt;p&gt;A fresh MiLB custom made from Cranium &lt;a &gt;cheap designer handbag&lt;/a rel="nofollow"&gt;. It is a new Kinston Indians street bike, that are from your Carolina Minor Team. The particular Indians 59fifty cap options their particular key head custom logo within black, crimson, white-colored and dull threading using a black color top due to its backside fall. Also outlined throughout magenta are definitely the hats payment, control key and also MiLB custom logo within the returning. The particular personalized has a grey underbill for just a bit of class. If you need to be a part of your indigneous group in that case press upon craniumfitteds.&lt;a &gt;gucci outlet store&lt;/a rel="nofollow"&gt; org for the Kinston Indians New trend A terrific way to.59fifty karate limits says ???That is good for the many Niner admirers available! . Their particular latest formation can be a custom while in the 49ers colorings however offers the The big players Cooperstown brand, which was employed through 1983 to Michael went bonkers (and during that point this 49ers had been very good!) The loath features a reddish overhead and white colored ???SF logo. For the expenses along with control key Hence Fresh new prefered precious metal gold. Your &lt;a &gt;cheap tisa&lt;/a rel="nofollow"&gt; a flag and Mlb caps batterman usually are threaded way up around material platinum additionally. Victory, gain loath pertaining to and also Frisco supporter but it pays off honor to some period of time that had been over the .700 tag for any 49ers. Obtain it at sofreshclothing.com.&lt;/p&gt;</description>
      <pubDate>Fri, 07 Oct 2011 04:49:44 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8361da70-8f5d-43e6-a4e8-91bcbd398334</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-152332</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Larm</title>
      <description>&lt;p&gt;To get the most of out of technology we all need a sense of our technological identity, a sense of who we are and what we need to do to see to it that technology will help us get there.&lt;/p&gt;</description>
      <pubDate>Sun, 25 Sep 2011 07:25:37 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:1e276f8e-3e79-4ab2-b7f0-ea36dd8b1f27</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-145159</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by cheap baseball hats</title>
      <description>&lt;p&gt;I am sure to all the commenters here!
&lt;a href="http://www.capshoponline.com/" rel="nofollow"&gt;http://www.capshoponline.com/&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 17 Sep 2011 03:55:48 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:52f3c476-2862-44a5-b306-bea90d24cb57</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-141683</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by dvd ripper</title>
      <description>&lt;p&gt;good post, i think so.Thank you!&lt;/p&gt;</description>
      <pubDate>Sun, 11 Sep 2011 07:17:16 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7ed59d33-cb7b-404e-b3fd-9fc2babce1d1</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-139211</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by  Burberry Outlet</title>
      <description>&lt;p&gt;This post bring a big surprise for me.I like those shell house.And i hope it is become the truth one day and i can live in it.&lt;/p&gt;


	&lt;p&gt;Thank you so much.&lt;/p&gt;</description>
      <pubDate>Wed, 07 Sep 2011 02:10:53 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:9b9083d2-a8db-47ab-9532-b91e4a7191df</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-137896</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Henry</title>
      <description>&lt;p&gt;There is a pressing need to identify and develop good practice, striving towards common standards, principles, and methodologies. &lt;a href="http://www.hemlarm-villalarm.se" rel="nofollow"&gt;Larm&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 03 Sep 2011 00:00:17 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f93c1355-62ff-4ea3-97fb-3c7d6afea4a9</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-136404</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Crystal Jewellery</title>
      <description>&lt;p&gt;Great post! Nice and informative, I really enjoyed reading it and will certainly share this post with my friends .  Read everything you ever wanted to know about  &lt;a href="http://www.jewelleryxy.com/gold-carat.html" rel="nofollow"&gt;gold carat and what it means&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 18 Aug 2011 12:27:38 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:aedc7a98-774a-4670-be2e-920e326d4c1f</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-129484</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Henry Jack</title>
      <description>&lt;p&gt;There is but one step from the sublime to the ridiculous.
&lt;a href="http://www.newsnapbackcaps.com/mlb-hats-new-york-yankees-hats-c-1742_1868.html" rel="nofollow"&gt;new york yankees hats and caps&lt;/a&gt;    
&lt;a href="http://www.newsnapbackcaps.com/" rel="nofollow"&gt;fitted caps cheap&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 08 Aug 2011 19:33:15 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:4dc54bbe-2f36-4b9c-b398-dd37178f20d9</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-125867</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Bowtrol</title>
      <description>&lt;p&gt;hmm ,i&amp;#8217;m not sure if this is what i&amp;#8217;m looking for but anyway this is interresting and could be useful some day,thanks for taking time to write such cool stuff&lt;/p&gt;</description>
      <pubDate>Mon, 08 Aug 2011 16:59:41 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e537ee26-9996-43f5-ba15-558d00578568</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-125827</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by cartier bangle</title>
      <description>&lt;p&gt;&lt;a href="http://www.alijewelry.com/burberry-earring-c-10.html" rel="nofollow"&gt;http://www.alijewelry.com/burberry-earring-c-10.html&lt;/a&gt;"&gt; Burberry Earring ,&lt;br&gt;&lt;a href="http://www.alijewelry.com/burberry-bangle-c-11.html" rel="nofollow"&gt;http://www.alijewelry.com/burberry-bangle-c-11.html&lt;/a&gt;"&gt; Burberry Bangle ,&lt;br&gt;&lt;a href="http://www.alijewelry.com/bvlgari-earring-c-12.html" rel="nofollow"&gt;http://www.alijewelry.com/bvlgari-earring-c-12.html&lt;/a&gt;"&gt; Bvlgari Earring ,&lt;/p&gt;</description>
      <pubDate>Thu, 04 Aug 2011 22:41:48 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:025b007c-1fe2-4109-bf0c-9829904547bf</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-124564</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by ray ban outlet</title>
      <description>&lt;p&gt;The good news is that our &lt;a href="http://www.cheapraybansunglasses.biz" rel="nofollow"&gt;&lt;strong&gt;ray ban outlet&lt;/strong&gt;&lt;/a&gt; store offer 50% discount on our 
&lt;a href="http://www.cheapraybansunglasses.biz" rel="nofollow"&gt;&lt;strong&gt;ray ban online&lt;/strong&gt;&lt;/a&gt; goods,and will give you the lowest price and the high quality 
&lt;a href="http://www.cheapraybansunglasses.biz" rel="nofollow"&gt;&lt;strong&gt;fake ray ban sunglasses&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Tue, 02 Aug 2011 03:48:34 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:0b900b60-e9bc-4e59-b142-fe35d2cc96dd</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-123011</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by Tom</title>
      <description>&lt;p&gt;This is a way to get everyone engaged so that the community can come together and solve problems as they emerge. &lt;a href="http://www.tariam.co.uk/products/tooway/" rel="nofollow"&gt;Tooway&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 30 Jul 2011 21:05:49 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:54b56d8b-4051-40af-8a55-54abbe738bb6</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-122311</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by mp3 converter</title>
      <description>&lt;p&gt;Good Information Very nice post.&lt;/p&gt;</description>
      <pubDate>Sat, 30 Jul 2011 02:53:12 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:4ee90295-0df0-4d69-9a74-2d106614fd0f</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-122201</link>
    </item>
    <item>
      <title>"The Liskov Substitution Principle for "Duck-Typed" Languages" by justbeats</title>
      <description>&lt;p&gt;black solo headphones| white solo beats| real powerbeats| red sox limited edtion studio beats| kobe beats studio| discount pro beats| beats jamz| jamz beats headphones| beats by dre| Miles Davis beats headphones| beats studio| studio beats| dr beats stuido| studio headphones| Beats Studio Ferrari| dr beats Ferrari| Beats Studio Red Sox| Red Sox headphones| dr dre pro| discount solo beats| newest solo beats| justbeats headphones| justbeats limited edition| beats solo| solo beats| dr beats solo| monster Beats Jamz| JustBeats Signature Edition| newest justbeats studio| black ibeats| Ferrari Dr.Dre Headphones| Ferrari limited edtion Studio| dr beats pro| white pro beats| pro headphones| Pink Limited Edition Studio Beats| stuido by dr| dr dre stuido| e-gold studio| pro headphones| purple solo hd| red solo hd headphones| red solo hd| red solo hd beats| black solo hd| red diamond studio beats| red diamond limited edtion studio beats| beats by dre Turbine Pro Copper| Turbine Pro Copper dr dre beats| tour beats headphones| ibeats headphones by dr dre| chrome ibeats| power beats by drepowerbeats headphones| white powerbeats| dr beats turbine Pro| beats Miles Davis| dr dre ibeats| pro beats| beats pro| pro headset| jamz beats by dr. dre| justbeats| beats studio pink| kobe beats headphones| kobe bryant limited edtion studio| Lamborghini Studio Headphones| monster beats pro| Red Sox studio| red sox limited edtion stuido| lebron james stduio| monster beats| beats headphones| ibeats headphones| ibeats| dr dre beats turbine| dr dre headphones| purple JustBeats studio| beats pro earphones| dre beats solo hd| white solo hd| Turbine Pro| Turbine Pro headphones| Red Limited Edition Studio Beats| white studio beats| white studio headphones| Blue Limited Edition Studio Beats| monster beats turbine| turbine headphones| Kobe Bryant stduio| lebron james beats| lebron james beats limited edtion| james headphones| dr dre beats lamborghini| Lamborghini stuido| Lamborghini limited edtion beats| Beats Studio Kobe Bryant| Kobe Bryant beats| discount solo hd| white solo hd beats| dr dre studio| justbeats headphones| justbeats solo hd| power beats| powerbeats by dr| powerbeats headphones| beats solo hd| Kobe Bryant beats| dr beats Kobe Bryant| beats stuio diamond| diamond beats headphones| dr beats diamond| diamond studio beats| cheap solo beats| black beats solo| monster beats lamborghini| blue studio headphones| pink stuido beats| black beats studio| limited edition studio beats| red stuido beats headphones| powerbeats earphones| red powerbeats| real solo hd| real solo beats| real justbeats| dr dre solo hd| Lamborghini Studio beats| Lamborghini limited edtion beats| Beats Studio Ferrari| Ferrari moster beats studio| red James Studio beats| ferrari limited edtion studio beats| beats studio LeBron James| LeBron James limited edtion beats studio| white diamond studio headphones| dr beats solo hd| solo headphones| E-GOLD Limited Edition studio beats| JustBeats Studio| solo hd| solo hd beats| solo hd headphones| monster jamz headphones| turbine dr dre Beats| red sox beats studio| turbine beats headphones| red sox stduio beats| red studio beats| powerbeats in ear| black powerbeats| dr dre beats| blue stduio beats| diamond limited edtion beats studio| white dimond studio beats| red diamond studio|&lt;/p&gt;</description>
      <pubDate>Thu, 07 Jul 2011 21:07:36 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:812c749b-1d9e-4635-85c6-5fd7fd644009</guid>
      <link>http://blog.objectmentor.com/articles/2008/09/06/the-liskov-substitution-principle-for-duck-typed-languages#comment-115887</link>
    </item>
  </channel>
</rss>

