<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 15 July 2015 at 16:34, Duncan Stuart <span dir="ltr"><<a href="mailto:dgmstuart@gmail.com" target="_blank">dgmstuart@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Thanks everyone - that was really interesting. Here's the approach I've decided on:</div><div><br></div><div>class NoExpectedDate</div><div>  include Comparable</div><div>  def to_s(format)</div><div>    "Unknown"</div><div>  end</div><div>  def <=>(other)</div><span class=""><div>    1 # Treat it as after every other date</div><div>  end</div></span><div>  def coerce(other)</div><div>    [other, Float::INFINITY]</div><div>  end</div><div>end</div><div><br></div><div>I like it because it has just enough behaviour to quack like a Date where required. </div></div></blockquote><div><br></div><div>I think this solution lacks one really important thing, a comment. Now I know that comments seem to be somewhat out of fashion nowadays, but here you have a bit of non-obvious code that makes something work. The fact that this code is in a seperate class, and not in Events is a good thing. However if someone does have to get to this code in the future you need to explain what is going on, and why its important, as this is very hard to infer from just the implementation.<br><br></div><div>Another thing you could think about is the name of this class. The NoExpected part of the name is actually all about Events. You've let that domain pollute this class. I think NullDate would be a better name. After all there is no reason why NullDates could not be used in other situations. This name will also help event in revealing just enough of the implementation (i.e. that you are using null object) so that you don't have to dig down<br><br></div><div>class Event<br></div><div>  def expected_date<br></div><div>     @expected_date ||= NullDate.new<br></div><div>  <br></div><div>vs<br><br></div><div>  def expected_date<br></div><div>    @expected_date ||= NoExpectedDate.new<br><br></div><div>With NoExpectedDate I feel I have to go an look at this to work out what is going on. With NullDate, I am being told that we are using the NullObject pattern.<br><br></div><div>All best<br><br></div><div>Andrew<br></div><div><br><br></div></div><br>-- <br><div class="gmail_signature"><div>------------------------</div>Andrew Premdas<div><a href="http://blog.andrew.premdas.org" target="_blank">blog.andrew.premdas.org</a></div></div>
</div></div>