[racket] Code Reuse, Object Oriented vs Functional

From: Sean Kanaley (skanaley at gmail.com)
Date: Thu Jun 20 15:42:53 EDT 2013

The definition and essence of "object" is not always agreed upon 
(encapsulation, polymorphism, state, ...), but since you're wondering 
about objects versus functions (purely functional), the "versus" implies 
a difference about an object that makes it impure, or the comparison 
isn't so helpful.  If an object was simply an enhanced pure function it 
would just be better.  So the key is that it is /impure/.

In terms of your first question, multiple dispatch is therefore a 
different kind of concern (polymorphism) than the opposing difference 
between object and function (purity).  One can achieve polymorphism 
either through doing something different based on argument types 
(multiple dispatch) or doing something different based on the actual 
type of thing being operated on (sub-object type of generic object 
method--single dispatch).

If you're doing collision detection, multiple dispatch is useful. You 
can write something like "(cartesian-prod collide? objects)" which 
presumably passes every object paired with every other object to 
collide?, which depending on the object types, handles the collision 
appropriately (e.g. friendly fire is disabled by not detecting player 
missiles hitting friendly infantry).

If instead you want to accelerate a vehicle, you can use the vehicle 
itself with its polymorphic accelerate method "(send vehicle accel)" to 
accelerate either a motorcycle or truck without caring what the actual 
subtype is.  The thing is, multiple dispatch generalizes this (multiple 
dispatch generalizes single dispatch clearly...).  The vehicle 
acceleration is also handled by a multimethod that could be called 
"(accel vehicle)".  It's like collision detection in that it accelerates 
based on the argument type--there just happens to be exactly one argument.

So there's really nothing special about objects and polymorphism *gasp* 
as they are just a gimped way of dispatching compared to multimethods!  
This brings us back to state.  An object (really a closure) is useful 
because it contains state (so does a plain "structure" type, so arguably 
I'm implying the encapsulation is useful as well).  If one is attempting 
to maximize the use of an object/closure, it seems they would have to 
take advantage of this state.  So one would use an object not so much 
for "extensibility" (which is inferior to the kind granted by multiple 
dispatch) but for mutable state.

I must therefore conclude objects are for things like simulations and 
other real-time, especially interactive applications where things change 
over time.  There is also functional-reactive programming, which aims to 
bring "pure state" through functions that take time as an implicit 
parameter, and this has advantages and disadvantages (space/time leaks, 
sometimes getting infinite loops from difficulty reasoning about whether 
an update affects something "immediately" or in the next full "update 
cycle" (e.g. Yampa has both various switches and various comparable 
delayed switches to implement either)).  But ultimately, if one is 
choosing an object-oriented approach, they should be doing it for the 
mutable state (or at least encapsulation).

If you just want polymorphism, multiple dispatch is flat out more powerful.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20130620/24bd941b/attachment.html>

Posted on the users mailing list.