Anti-OOP... stupid?
foobar
foo at bar.com
Wed Feb 15 06:30:19 PST 2012
On Tuesday, 14 February 2012 at 22:45:28 UTC, H. S. Teoh wrote:
> On Tue, Feb 14, 2012 at 11:00:43PM +0100, Zero wrote:
>> Hello!
>>
>> I've recently started to work with D, and I'll start a "bigger"
>> project soon, using it. For a few days I've been thinking
>> about the
>> approach I'll take here, and since I don't /have/ to use full
>> OOP in
>> D, I was wondering... how crazy is it to not use full OP
>> nowadays?
>
> I do that all the time. I guess that makes me crazy. :)
>
>
> [...]
>> What I want to know from you people... is that stupid? To even
>> think
>> about doing something like this? Basically mixing procedural
>> and OOP?
>
> D allows you to program in functional style, OOP, procedural
> style, or
> any combination of them. There is a reason D was designed this
> way. :)
>
>
>> I know about the dangers, and disadvantages, but if those
>> don't scare
>> one away, would you consider it bad, if someone did this, on a
>> larger
>> project?
> [...]
>
> OOP has its own share of dangers and disadvantages. Which,
> sadly, most
> people don't talk about very much because they don't have the
> guts to go
> against the current cool trendy bandwagon that everyone's
> jumping on.
>
> Templates, for one thing, don't fit very well into the OO
> paradigm (ever
> tried a virtual template function?), even though you *can* use
> it to
> enhance an OO-based design. And D's templates are one of the
> best things
> about D, ever.
>
> Of course, many aspects of OO does help with large projects, so
> it's
> usually a good idea to take advantage of that. But that doesn't
> mean you
> *have* to use OO, or that it's "bad" to mix in procedural stuff
> when it
> suits you.
>
> I mean, if you take OO to the extreme, that would require
> excluding all
> those evil procedural constructs like if statements and for
> loops, and
> write everything in terms of invoking object methods... like
> this
> monstrosity:
>
> class MyClass {
> void myMethod() {
> IntVariable i;
> ForLoopFactory.create(
> new IntSetter(i.address(), new Number(0)),
> new BooleanCondition(
> new LessThanComparator(i.address(),
> 100)),
> new IntAdder(&i, 1),
> new IfStatement(
> new EqualComparator(i.address(),
> new Number(42)),
> new FunctionCaller(writeln.address(),
> new String("Found it!")),
> )
> ).execute();
> }
> }
>
> which is, of course, completely ridiculous.
>
> The bottom line is, use whatever tools work best for what you
> need to
> do. If OO works well, use it. If procedural code works well,
> that use
> it. If both works well in different cases, then use a mix of
> both
> depending on the circumstances.
>
> Trying to shoehorn everything into an object is stupid.
>
>
> T
I agree with the general sentiment to have a large toolbox and
using the right tool for the job be it functional, OOP, etc..
having said that, I have to strongly disagree with both claims
above.
1. D templates are an enhanced version of C++ templates which are
a poor design. The problem stems IMO not from issues with OOP but
rather with the horrible idea of C++-like templates. Other
languages have *much* better solutions which integrate better.
2. The above horrible example completely misrepresents OOP. The
"correct" way to truly do control flow in OOP is a-la smalltalk:
class My class {
void myMethod() {
...
100.times({ ... }); // for-loop
(myVar > 42).ifTrue({ ... }); // if statement
(myVar < 100).if({.. code if true ...}, {... code if false
...}); // if statement with else clause
...
}
}
etc.. incidentally, Smalltalk uses selectors (Objective-C is
basically fugly smalltalk..) : (expression) ifTrue: [ ^42 ]
ifFalse: [ ^24 ] the above returns 42 if true and 24 otherwise.
More information about the Digitalmars-d-learn
mailing list