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