A Perspective on D from game industry
c0de517e via Digitalmars-d
digitalmars-d at puremagic.com
Tue Jun 17 17:13:49 PDT 2014
> You don't need metaprogramming to have this problem.
True, in fact it was an example of a more general idea.
> There was also the complaint from some developers that C is
> "superior" to C++ because in C++, a method call in a complex
> class
> hierarchy can theoretically end up "anywhere", whereas in C,
> you at
> least know exactly which function will get called, since there
> is no
> overloading.
That's an extreme opinion, tools are tools, it's not that we
always have to operate in the strictest ways possible, but yes
I'd say you have to be conscious of the consequences.
Nowadays my rule of thumb is to ask myself -do I need this- when
thinking of grabbing a given language feature for a given
implementation. Do I need a class? What would it give me? If it
ends up with considerable savings then go ahead.
> Now you discover a bug somewhere in this function. How would
> you go
> about finding where it is? Well, since this is C, which
> allegedly
> doesn't have any polymorphism, that should be trivial, right?
> Just trace
> through all of the function calls and narrow it down. Except...
> all of
> those ops.xxx() calls are function pointers. So OK, we need to
> find out
> where they point to.
Yeah... That decision was quite bad (especially today!), as you
point out they didn't avoid polymorphism really, just
re-implemented it in a language that doesn't support it natively
in its type system, and that is often trouble.
That's why I actually am wary of certain forms of
metaprogramming, I don't think it's often a good idea to try to
extend a language beyond what its syntax natively supports, not
only because it surprises people, but also because it will
surprise tools and so on...
> [...] you only
> need to remember add and delete, and the abstraction takes care
> of
> itself by resolving to the correct overload based on the
> argument types.
That is not really OO though or well not what I mean with OO/OOD.
The OO that I would avoid is the "thinking in objects" mindset.
Associating functions with types is the simplest form of
polymorphism and it's totally fine, you don't even need classes
for that! But even if you face a problem where you do actually
need interfaces over objects, go ahead, I'm not saying it's never
useful. But it shouldn't be the "default" state of mind and
certainly how to split computation in objects shouldn't be the
way we think about solving problems, that's the bad of OO
mentality that degenerated into horrors like "patterns".
Computation is algorithms that change bits of data.
> Metaprogramming goes one step further and lets you reduce
> boilerplate --
True, I just wanted to show the tradeoff that are entailed in
that. Then it can still be useful, but a lot of times is just
abused, and many, many times we would be better served by a
better type system than having to hack features via
metaprogramming.
I would be much more open to generics if we had in C++ bounded
parametric types (concepts... or C# style generics) rather than
templates. And I would use C++11 lambdas, even if I wouldn't have
touched with a mile-long pole the Boost::lambda stuff, and so
on...
>
> At the end of the day, *all* tools must be used with care. Even
> in C, a
> language with neither OO nor metaprogramming support, you can
> code
> yourself into a nasty mess by using built-in language
> constructs like
> function pointers, like I showed above. Just because you *can*
> cause
> serious injury to yourself with a hammer, doesn't mean that
> hammers
> are inherently evil.
Right, but we live in a world where it seems to me lots of people
are hammer happy :)
More information about the Digitalmars-d
mailing list