scalar vs array and program control

Thomas 'PointedEars' Lahn PointedEars at web.de
Sat Jul 25 12:53:33 EDT 2015


Laura Creighton wrote:

> […] "Thomas 'PointedEars' Lahn" [writes]:
>> Laura Creighton wrote:
>>> […]  You really cannot make your code 'more functional' and 'more
>>> object-oriented' at the same time -- more in one style implies less
>>> in the other.
>> How did you get that idea?
> 
> Because pure object oriented techniques are best when you have
> a fixed set of operations on things, and as your code evolves
> you primarily add new things.  Things written in a functional style
> work best when you have a fixed set of things, and your code evolves
> you add new operations for the existing things.

Your logic is flawed.  “*Pure* object oriented” is your raising the bar.  
First of all, object-oriented programming and functional programming are 
programming *paradigms*, not merely techniques.  Second, they are _not_ 
mutually exclusive paradigms.  Third, Python supports both because in 
Python, functions are first-class objects.  (In fact, if I am not mistaken, 
everything except None is an object in Python.)

For example, let us make this original Python code more object-oriented and 
more functional at the same time:

#------------------------------------------------------------------------
def foo (a, b):
    return a + b

print(foo(42, 23))
#------------------------------------------------------------------------

First, more functional: 

#------------------------------------------------------------------------
def foo (f, a, b):
    return f(a, b)

print(foo(lambda a, b: return a + b, 42, 23))
#------------------------------------------------------------------------

Instead of hard-coding the “+” operation, (a reference to) a function 
(object) can be passed that is passed the remaining arguments, and the 
return value of the function is returned instead (you could overload the 
operator, and the “foo” call here could be inlined, of course; this is just 
an example).

Second, more object-oriented:

#------------------------------------------------------------------------
class A:
    def __init__ (self, v=0):
        self._value = v

    def foo (self, f, b):
        return f(f, self._value, b)

print(A(42).foo(lambda a, b: return a + b, 23)) 
#------------------------------------------------------------------------

The first operand now is an object, an instance of a class, and the former 
“foo” function has become a method of that class that the object inherits.  
The method could be further inherited from a superclass, or overwritten by a 
subclass, for polymorphism.  The callback could also be a public method 
provided by a class.

There are probably better examples.  In any case it should be possible for 
you to see that you are mistaken: One *can* make code more functional and 
more object-oriented at the same time, and more in one "style" does _not_ 
imply less in the other.

-- 
PointedEars

Twitter: @PointedEars2
Please do not cc me. / Bitte keine Kopien per E-Mail.



More information about the Python-list mailing list