Soms lijkt Ruby teveel op natuurlijke taal...

Geplaatst door Michiel de Mare za, 15 sep 2007 00:24:00 GMT

Dit stukje code heb ik net weggehaald uit een van mijn classes.
if my_last_update < 8.hours.ago
Waarom? Omdat het wanneer je het voorleest een mooie Engelse zin vormt die helaas precies het tegenovergestelde betekent van de Ruby code. Dat probleem heb je in andere talen weer niet…

Geplaatst in ,  | 7 reacties

Reacties

  1. RemVee zei ongeveer 7 uur later:
    Je maakt me wel nieuwsgierig naar wat het dan geworden is;
    if my_last_update.between?(8.hours.ago, Time.now)
    
    misschien?
  2. Matthijs Langenberg zei ongeveer 10 uur later:

    Je had de ‘<=>’ of ‘<’ operator natuurlijk ook opnieuw kunnen definiëren.

  3. p3t0r zei ongeveer 10 uur later:

    @Matthijs alhoewel ik operator overloading in sommige gevallen een elegante oplossing vind lijkt dit me nou typisch een geval waar het de code juist minder transparant maakt; niet iedereen leest code alsof het engels is!

  4. Michiel zei ongeveer 12 uur later:

    Ik heb het omgedraaid.

    if 8.hours.ago > my_last_update

    Zo word je niet meer in de war gebracht door het Engels (maar leest het ook niet meer als Engels).

    Als alternatief dit misschien?

    if since(my_last_update) > 8.hours

  5. Michiel zei ongeveer 12 uur later:

    Oh, voor alle duidelijkheid, de code:

    if my_last_update < 8.hours.ago

    zou je moeten lezen als: Als mijn laatste update plaatsvond vóór het tijdstip dat 8 uur geleden werd bereikt… Niet erg intuïtief, non?

  6. RemVee zei ongeveer 12 uur later:
    Ik vind:
    if 8.hours.ago > my_last_update
    
    wel een erg mooie oplossing eigenlijk.
  7. Manfred Stienstra zei 9 dagen later:

    Eigenlijk doet het precies wat er staat, je laat jezelf laat verwarren door het feit dat er ‘ago’ of ‘from_now’ staat.

    Er is eigenlijk geen oplossing voor behalve goede tests schrijven en misschien een helper method om je over dingen na te helpen denken.

    class Time
      alias_method :happened_before, :<
      alias_method :happened_after, :>=
    end
    update if my_last_update.happened_before 8.hours.ago

(Laat url/e-mail achter »)

   Voorvertoning