Bad copy & paste, forgot to remove age from the Personable def.

> On May 22, 2012 7:09 AM, "Softaddicts" <lprefonta...@softaddicts.ca> wrote:
> > A better way would be something like:
> >
> > (defprotocol Personable
> >    (person [this])
> >     (age [this] )
> >
> > (defprotocol CensusOperators
> >    (age [this]))
> >
> > (extend-protocol Personable
> >    Person
> >    (person [this] this)
> >    Employee
> >    (person [this] (:person this)))
> >
> > (extend-protocol CensusOperators
> >     Person
> >     (age [this] (date-dif (java.util.Date.) (:birthday this)))))
> >
> > Much more convenient to me. I can take anything and make it a person.
> 
> I really don't understand your example. Personable#age conflicts with
> CensusOperators#age if you define them in the same Namespace (and you'll
> get a warning telling you so) . If they're in separate namespaces , what's
> the point of Personable #age, given you never define an implementation?
> 
> > Even from a Clojure map just by extending it and returning a Person
> instance.
> > You expose the Person abstraction when available instead of hiding it.
> >
> > Computed values like the age ? This is something that could be computed
> > for other entities like an animal.
> >
> > So you can write (age (person xxxx)) or (age (animal xxxx)).
> >
> > This is why I tell people to get out of their usual thinking process. Get
> lazy,
> > playing hide and seek was fun at pre-school age but in your code and data
> > structures ?
> >
> > Luc P.
> >
> >
> > > I think it's misleading to use inheritance to reduce code duplication.
> > > Inheritance is about indicating function typing and creating typed
> > > contracts, both of which are fairly un-idiomatic in Clojure.
> > >
> > > However, there is another way to prevent code duplication: use
> composition
> > > instead.  Instead of having the Employee class mirror the attributes of
> the
> > > Person (which if you really wanted, you could easily do via a
> "defperson"
> > > like macro that would slug on extra fields), why not have an Employee
> carry
> > > a Person as one of its attributes?  This approach is more similar to the
> > > Haskell/functional way of working with record types (I think Haskell's
> > > newtype operator works similarly under the covers).  There is also an
> > > analogue to the decorator pattern in Java.
> > >
> > > In this case, you would specify a Personable protocol, which both Person
> > > and Employee implement; for all the basic operations, Employee would
> just
> > > defer to its internal person.  Example:
> > >
> > > (defrecord Person [name birthday])
> > >
> > > (defrecord Employee [title person])
> > >
> > > (defprotocol Personable
> > >   (name [this])
> > >   (age [this))
> > >
> > > (extend-protocol Personable
> > >   Person
> > >   (name [this] (:name this))
> > >   (age [this] (date-dif (java.util.Date.) (:birthday this)) ;;date diff
> > > defined elsewhere
> > >   Employee
> > >   (name [this] (name (:person this))
> > >   (age [this] (age (:person this)))
> > >
> > > Arguably, if we were deferring to the current Java best practices and
> > > encapsulation, one should be creating interfaces of getters and setters
> > > rather than directly accessing instance variables anyway, making the
> extra
> > > protocol definition no more work than doing it correctly in modern Java.
> > >
> > > Best,
> > > Mark
> > >
> > > On Sunday, May 20, 2012 10:22:55 AM UTC-7, Warren Lynn wrote:
> > > >
> > > > So from what I read  the philosophy of Clojure discourages inheritance
> > > > on concrete data types. However, maybe I am too entrenched in my OO
> > > > thinking, how do I define a new record type that includes all the data
> > > > members of another record type? I am thinking about the classic
> > > > Employee/Person example.
> > > >
> > > > If I can define a record of Employee with Person's data members
> > > > included, even that is not true inheritance (as no protocols of
> > > > "Person" will be automatically extended to "Employee"), I need that
> > > > for function re-use (so a function working on Person will
> > > > automatically work on Employee because Employee is guaranteed to have
> > > > all the data members in Person).
> > > >
> > > > Also, again, maybe I am too OO minded, is there a way inherit another
> > > > record type's protocol implementation? That seems to give the best
> > > > combination of both worlds (OO and functional), so you can either have
> > > > you own very customized combination of data type/protocols, or use the
> > > > very common OO pattern. Just like we have both the single-typed
> > > > dispatching (which is more OO like and covers a large portion of use
> > > > cases), and more advanced multimethods.
> > > >
> > > > Thanks.
> > >
> > > --
> > > You received this message because you are subscribed to the Google
> > > Groups "Clojure" group.
> > > To post to this group, send email to clojure@googlegroups.com
> > > Note that posts from new members are moderated - please be patient with
> your first post.
> > > To unsubscribe from this group, send email to
> > > clojure+unsubscr...@googlegroups.com
> > > For more options, visit this group at
> > > http://groups.google.com/group/clojure?hl=en
> > --
> > Softaddicts<lprefonta...@softaddicts.ca> sent by ibisMail from my ipad!
> >
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Clojure" group.
> > To post to this group, send email to clojure@googlegroups.com
> > Note that posts from new members are moderated - please be patient with
> your first post.
> > To unsubscribe from this group, send email to
> > clojure+unsubscr...@googlegroups.com
> > For more options, visit this group at
> > http://groups.google.com/group/clojure?hl=en
> 
> -- 
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your 
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
--
Softaddicts<lprefonta...@softaddicts.ca> sent by ibisMail from my ipad!

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to