Instance Model Programming in C
slkpg.byethost7.com
slkpg.byethost7.com
I really like OO programming (i.e. I'm particularly not one of the functional-fundamentalist OO-haters here on HN), but as I've grown more experienced, I've started to use inheritance less and less, and composition more and more. This is trivially supported in C structs, and you don't need any fancy approach for it, plus you can do with way less void pointer casting, which means less runtime errors.
Inheritance is very useful for a small set of relatively complex problems, such as language parsing or UI frameworks or particle simulations. For many other problems, including most applications (as opposed to libraries), however, my experience is that you can do fine without. This holds especially these days, when many of said complex problems are solved in excellent freely available open source projects, in nearly any language.
And yes, for all the pointy-hairs around, I know there are exceptions to the rule. I am speaking generally.
In some sense, deep inheritance hierarchies were a thing of the 80's, when inheritance was new (at least, in the mainstream), just like the <blink> tag was a thing of the '90s (or was that the 00's?). Now, deep hierarchies are a code smell.
OO only started to get into the enterprise in the 90's.
[0]: http://www.cs.rit.edu/~ats/books/ooc.pdf
[1]: http://www.cs.rit.edu/~ats/books/ooc-02.01.04.tar.gz ( source code)
[1] http://www.amazon.com/Inside-Object-Model-Stanley-Lippman/dp...
They help understand all design compromises that were done to keep compatibility with C, which is was part of what brought C++ into the mainstream, but also the main cause of many of its warts.
[1] http://www.amazon.com/The-Annotated-C-Reference-Manual/dp/02...
[2] http://www.amazon.com/The-Design-Evolution-Bjarne-Stroustrup...
Annotated C++ Reference Manual as well as D&E is severely dated. Quite a while back there was some talk of stroustrup co-authoring a revision of the reference-manual with andrew-koenig, but it never came to fruition...
Very few people know it, but GNOME's GTK interface is fully object oriented, and BTW when you click a GTK button you are clicking on an instance of the class GtkButton that inherits from GtkBin which inherits from GtkWidget. it's a beautiful thing!
Also because GObject is based on a lot of conventions it makes really easy to generate bindings to other programming languages automatically, so basically you can write you library in C with OOP approach using GObject, and for free you get your library easily bound to python, ruby, js or any other language.
GObject is independent of GTK.
Also here is the link for the introspection tool that generates bindings to other languages: https://wiki.gnome.org/action/show/Projects/GObjectIntrospec...
Below shows how i use string and string list "classes" in C.String list "class" inherits string "class" seamlessly.
https://github.com/mhogomchungu/zuluCrypt/tree/master/zuluCr...
respective easier to read header files are below:
https://raw.github.com/mhogomchungu/zuluCrypt/master/zuluCry...
https://raw.github.com/mhogomchungu/zuluCrypt/master/zuluCry...
i don't understand what's new here. anyone?
I guess that depends on what your definition of "most" is. A large portion of C code either depends on hardware interfaces or is intended to be optimized. In both cases, the layout of your memory (data) is extremely important to an implementation.
One of the biggest criticisms of OOP is that it tends to obscure data layout, which isn't always an implementation detail. Interestingly, the patterns described here are subject to the same criticisms.
> The design and implementation of algorithms constitutes the vast bulk and difficulty in developing software.
That's just a crazy statement to me. In my experience, the bulk of developing software is anything but the design and implementation of algorithms. And I've worked on some pretty algorithm-heavy projects!
I don't even know where to start rebuking the rest of this article's discussion of data and I suspect that the author and I simply have dramatically different definitions of the word.
Regarding your comment:
> One of the biggest criticisms of OOP is that it tends to obscure data layout, which isn't always an implementation detail.
I'd argue that OOP obscures data representations more broadly than just data layout. Encapsulation is great, but it's simply the wrong default: Representations and the scope of their exposure should be carefully considered. Further, immutability greatly reduces the value of encapsulation.