{"id":23,"date":"2018-10-05T06:55:00","date_gmt":"2018-10-05T06:55:00","guid":{"rendered":""},"modified":"2019-03-12T20:10:04","modified_gmt":"2019-03-12T20:10:04","slug":"define-interfaces-in-a-duck-typed-language-like-ruby","status":"publish","type":"post","link":"https:\/\/ntlx.org\/de\/2018\/10\/define-interfaces-in-a-duck-typed-language-like-ruby.html","title":{"rendered":"Define interfaces in a duck typed language like ruby"},"content":{"rendered":"<p>In Java, it is very intuitive how interfaces are defined and used. You just create an interface in a similar way you would create a class and derive the classes, implementing the interface.<\/p>\n<pre lang=\"java\" style=\"background-color: white; border-radius: 2px; border: 1px solid rgb(229, 229, 229); box-sizing: border-box; color: #2e2e2e; font-family: Menlo, &quot;DejaVu Sans Mono&quot;, &quot;Liberation Mono&quot;, Consolas, &quot;Ubuntu Mono&quot;, &quot;Courier New&quot;, &quot;andale mono&quot;, &quot;lucida console&quot;, monospace; font-size: 13px; line-height: 1.6em; margin-bottom: 16px; overflow-wrap: break-word; overflow: auto; padding: 8px; text-shadow: none; word-break: break-all;\" v-pre=\"true\"><code style=\"background-color: inherit; border-radius: 4px; box-sizing: border-box; color: inherit; font-family: Menlo, &quot;DejaVu Sans Mono&quot;, &quot;Liberation Mono&quot;, Consolas, &quot;Ubuntu Mono&quot;, &quot;Courier New&quot;, &quot;andale mono&quot;, &quot;lucida console&quot;, monospace; font-size: inherit; margin-top: 0px; overflow-wrap: normal; padding: unset; word-break: normal;\"><span lang=\"java\" style=\"box-sizing: border-box; margin-top: 0px;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">interface<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">Drivable<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">public<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">void<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">drive<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">(<\/span><span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">int<\/span> <span style=\"box-sizing: border-box; color: #333333;\">meters<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">);<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">public<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">void<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">stop<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">();<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">class<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">Car<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">implements<\/span> <span style=\"box-sizing: border-box; color: #333333;\">Drivable<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">public<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">void<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">drive<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">(<\/span><span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">int<\/span> <span style=\"box-sizing: border-box; color: #333333;\">meters<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">)<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\">\/\/start the engine<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\">\/\/go for it<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">public<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">void<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">stop<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">()<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\">\/\/stop the engine<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">class<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">Bagger<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">implements<\/span> <span style=\"box-sizing: border-box; color: #333333;\">Drivable<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">public<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">void<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">drive<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">(<\/span><span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">int<\/span> <span style=\"box-sizing: border-box; color: #333333;\">meters<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">)<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\">\/\/start engine<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\">\/\/start left track<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\">\/\/start right track<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">public<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">void<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">stop<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">()<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\">\/\/stop left track<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\">\/\/stop right track<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">class<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">AutomatedDriver<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">public<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">void<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">forward<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">(<\/span><span style=\"box-sizing: border-box; color: #333333;\">Drivable<\/span> <span style=\"box-sizing: border-box; color: #333333;\">vehicle<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">,<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">int<\/span> <span style=\"box-sizing: border-box; color: #333333;\">meters<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">)<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">{<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">vehicle<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">.<\/span><span style=\"box-sizing: border-box; color: teal;\">drive<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">();<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">vehicle<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">.<\/span><span style=\"box-sizing: border-box; color: teal;\">stop<\/span><span style=\"box-sizing: border-box; font-weight: 600;\">();<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><br \/><span lang=\"java\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">}<\/span><\/span><\/code><\/pre>\n<div dir=\"auto\" style=\"box-sizing: border-box; margin-bottom: 16px;\">\n<p>This results in a exlplicit class structure as depicted in the following class diagram.<\/p>\n<div style=\"clear: both; text-align: center;\"><\/div>\n<div style=\"clear: both; text-align: center;\"><\/div>\n<div style=\"clear: both; text-align: center;\"><a href=\"http:\/\/localhost:8001\/wp-content\/uploads\/2018\/10\/drivable_class_diagram.png\" style=\"margin-left: 1em; margin-right: 1em;\"><img decoding=\"async\" border=\"0\" data-original-height=\"201\" data-original-width=\"301\" src=\"http:\/\/localhost:8001\/wp-content\/uploads\/2018\/10\/drivable_class_diagram.png\" \/><\/a><\/div>\n<p>However, in languages like ruby, interfaces are defined implicitly, which means that two classes implement the same interface as soon as they respond to the same interface. Take a look at our example as implemented in ruby:<\/p>\n<pre lang=\"ruby\" style=\"background-color: white; border-radius: 2px; border: 1px solid rgb(229, 229, 229); box-sizing: border-box; color: #2e2e2e; font-family: Menlo, &quot;DejaVu Sans Mono&quot;, &quot;Liberation Mono&quot;, Consolas, &quot;Ubuntu Mono&quot;, &quot;Courier New&quot;, &quot;andale mono&quot;, &quot;lucida console&quot;, monospace; font-size: 13px; line-height: 1.6em; margin-bottom: 16px; overflow-wrap: break-word; overflow: auto; padding: 8px; text-shadow: none; word-break: break-all;\" v-pre=\"true\"><code style=\"background-color: inherit; border-radius: 4px; box-sizing: border-box; color: inherit; font-family: Menlo, &quot;DejaVu Sans Mono&quot;, &quot;Liberation Mono&quot;, Consolas, &quot;Ubuntu Mono&quot;, &quot;Courier New&quot;, &quot;andale mono&quot;, &quot;lucida console&quot;, monospace; font-size: inherit; margin-top: 0px; overflow-wrap: normal; padding: unset; word-break: normal;\"><span lang=\"ruby\" style=\"box-sizing: border-box; margin-top: 0px;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">class<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">Car<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">public<\/span> <span style=\"box-sizing: border-box; color: #333333;\">void<\/span> <span style=\"box-sizing: border-box; color: #333333;\">drive<\/span><span style=\"box-sizing: border-box;\">(<\/span><span style=\"box-sizing: border-box; color: #333333;\">meters<\/span><span style=\"box-sizing: border-box;\">)<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\"># start the engine<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\"># go for it<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">def<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">stop<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\"># stop the engine<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">class<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">Bagger<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">def<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">drive<\/span><span style=\"box-sizing: border-box;\">(<\/span><span style=\"box-sizing: border-box; color: #333333;\">meters<\/span><span style=\"box-sizing: border-box;\">)<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\"># start engine<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\"># start left track<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\"># start right track<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">def<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">stop<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\"># stop left track<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #999988; font-style: italic; margin-top: 0px;\"># stop right track<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">class<\/span> <span style=\"box-sizing: border-box; color: #445588; font-weight: 600;\">AutomatedDriver<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">def<\/span> <span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">forward<\/span><span style=\"box-sizing: border-box;\">(<\/span><span style=\"box-sizing: border-box; color: #333333;\">vehicle<\/span><span style=\"box-sizing: border-box;\">,<\/span> <span style=\"box-sizing: border-box; color: #333333;\">meters<\/span><span style=\"box-sizing: border-box;\">)<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">vehicle<\/span><span style=\"box-sizing: border-box;\">.<\/span><span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">drive<\/span><span style=\"box-sizing: border-box;\">();<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">        <span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">vehicle<\/span><span style=\"box-sizing: border-box;\">.<\/span><span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">stop<\/span><span style=\"box-sizing: border-box;\">();<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><\/code><\/pre>\n<p>The classes Car and Bagger still both implement the Drivable interface. But as in ruby you use the so-called ducktyping, they both implement it implicitly by just responding to the same API, consisting of drive and stop. However, even in duck-typed languages, you might want to define and document your interfaces in a central point to make sure once you change it, all implementing classes do as well. You can do this by implementing unit tests to ensure the interface is fulfilled.<\/p>\n<p>Following is an example of a rspec test to ensure our Drivable interface is implemented correctly.<\/p>\n<div><\/p>\n<pre lang=\"ruby\" style=\"background-color: white; border-radius: 2px; border: 1px solid rgb(229, 229, 229); box-sizing: border-box; color: #2e2e2e; font-family: Menlo, &quot;DejaVu Sans Mono&quot;, &quot;Liberation Mono&quot;, Consolas, &quot;Ubuntu Mono&quot;, &quot;Courier New&quot;, &quot;andale mono&quot;, &quot;lucida console&quot;, monospace; font-size: 13px; line-height: 1.6em; margin-bottom: 16px; overflow-wrap: break-word; overflow: auto; padding: 8px; text-shadow: none; word-break: break-all;\" v-pre=\"true\"><code style=\"background-color: inherit; border-radius: 4px; box-sizing: border-box; color: inherit; font-family: Menlo, &quot;DejaVu Sans Mono&quot;, &quot;Liberation Mono&quot;, Consolas, &quot;Ubuntu Mono&quot;, &quot;Courier New&quot;, &quot;andale mono&quot;, &quot;lucida console&quot;, monospace; font-size: inherit; margin-top: 0px; overflow-wrap: normal; padding: unset; word-break: normal;\"><span lang=\"ruby\" style=\"box-sizing: border-box; margin-top: 0px;\"><span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">shared_examples<\/span> <span style=\"box-sizing: border-box; color: #dd1144;\">\"a Drivable\"<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">do<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">it<\/span> <span style=\"box-sizing: border-box;\">{<\/span>  <span style=\"box-sizing: border-box; color: #333333;\">expect<\/span><span style=\"box-sizing: border-box;\">(<\/span><span style=\"box-sizing: border-box; color: #333333;\">subject<\/span><span style=\"box-sizing: border-box;\">).<\/span><span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">to<\/span> <span style=\"box-sizing: border-box; color: #333333;\">respond_to<\/span><span style=\"box-sizing: border-box;\">(<\/span><span style=\"box-sizing: border-box; color: #990073;\">:drive<\/span><span style=\"box-sizing: border-box;\">).<\/span><span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">with<\/span><span style=\"box-sizing: border-box;\">(<\/span><span style=\"box-sizing: border-box; color: #009999;\">1<\/span><span style=\"box-sizing: border-box;\">).<\/span><span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">argument<\/span> <span style=\"box-sizing: border-box;\">}<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">it<\/span> <span style=\"box-sizing: border-box;\">{<\/span>  <span style=\"box-sizing: border-box; color: #333333;\">expect<\/span><span style=\"box-sizing: border-box;\">(<\/span><span style=\"box-sizing: border-box; color: #333333;\">subject<\/span><span style=\"box-sizing: border-box;\">).<\/span><span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">to<\/span> <span style=\"box-sizing: border-box; color: #333333;\">respond_to<\/span><span style=\"box-sizing: border-box;\">(<\/span><span style=\"box-sizing: border-box; color: #990073;\">:stop<\/span><span style=\"box-sizing: border-box;\">).<\/span><span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">with<\/span><span style=\"box-sizing: border-box;\">.<\/span><span style=\"box-sizing: border-box; color: #990000; font-weight: 600;\">no_args<\/span> <span style=\"box-sizing: border-box;\">}<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">describe<\/span> <span style=\"box-sizing: border-box; color: teal;\">Car<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">do<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">it_behaves_like<\/span> <span style=\"box-sizing: border-box; color: #dd1144;\">\"a Drivable\"<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">describe<\/span> <span style=\"box-sizing: border-box; color: teal;\">Bagger<\/span> <span style=\"box-sizing: border-box; font-weight: 600;\">do<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\">    <span style=\"box-sizing: border-box; color: #333333; margin-top: 0px;\">it_behaves_like<\/span> <span style=\"box-sizing: border-box; color: #dd1144;\">\"a Drivable\"<\/span><\/span><br \/><span lang=\"ruby\" style=\"box-sizing: border-box;\"><span style=\"box-sizing: border-box; font-weight: 600; margin-top: 0px;\">end<\/span><\/span><\/code><\/pre>\n<p>If the developer now changes something in the interface Drivable, he does so in the rspec test ensuring the interface. This test will fail for all classes that are expected to implement it but not yet do.<\/p>\n<p>Even if it is not as intuitiv as it is in java, where your code just doesn&#8217;t compile if you fail to implement the interface, it is possible to define an interface and ensure it is implemented correctly in duck typed languages.<\/p>\n<p>You might argue that you lose a bit of the flexibility of duck typing if you implement this for all your interfaces, and you are right! But in many cases, for example if the one defining the interface and the ones implementing it are different people, this is a very useful tool.<\/p>\n<p>For example, imagine you are the author of a ruby library. A shared_example is a good and straight forward way to tell the users of your ruby gem what you expect their classes to behave like. Also, this will make them confident that if they upgrade to a newever version of your library, they will notice changes in the API by executing their test suite.<\/p><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"In Java, it is very intuitive how interfaces are defined and used. You just create an interface in a similar way you would create a class and derive the classes, implementing the interface. interface Drivable { public void drive(int meters); public void stop();}class Car implements Drivable { public void drive(int meters) { \/\/start the engine&#8230; <a class=\"view-article\" href=\"https:\/\/ntlx.org\/de\/2018\/10\/define-interfaces-in-a-duck-typed-language-like-ruby.html\">Artikel ansehen<\/a>","protected":false},"author":1,"featured_media":43,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[7,6,5],"_links":{"self":[{"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/posts\/23"}],"collection":[{"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":1,"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":44,"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/posts\/23\/revisions\/44"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/media\/43"}],"wp:attachment":[{"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ntlx.org\/de\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}