I am a novice programmer, currently self-learning, would really like to understand Object Oriented Programming well. Can anyone suggest some books that are good at explaning OOP for beginners?
Thanks for the help in advance.
Unfortunately, the C++/Java conception of OOP has had a much better sales team since the 90's or so, so you can get sucked into that universe and never find your way out again. So learn OOP from multiple perspectives.
Things like "Cohesion", "Layering", "Polymorphism", "Abstraction", etc.
They are all great concepts with a lot of important principles, but I drives me nuts how often I've heard them used excessively.
This is key. Even if you end up never using the less traditional OOP models, learning them will let you write better software in the conventional languages. I can say with certainty that my basis in Smalltalk and (albeit limited) knowledge of Lisp makes me a far better Java programmer.
Don't take this as advice against learning what you want to learn, but I'd caution against the idea that "object-oriented programming" and "good programming" are the same thing (or even that they are correlated). OO in its various incarnations comes with a tremendous amount of baggage. It took me years to figure out I didn't need it, and that insight made me a much better programmer.
http://video.google.com/videoplay?docid=-2058469682761344178...
It is an older video of Dan Ingalls of Smalltalk fame explaining objects. I clearly remember a large light bulb going off in my head as he walked through his analogy of a hospital described as an object.
This certainly isn't comprehensive, but if you are stuck on the concept its helpful to hear someone talk it out.
C2 is another resource worth checking out. C2 is the original "wiki". While its not always coherent and will structured, there are some real gold nuggets here: http://c2.com/cgi/wiki?ObjectOrientedProgramming
http://www.amazon.com/dp/0596007124
Do not jump in with the GoF Design Pattern book. :)
Head First C# [1st choice because the program exercises are far more interesting] or Head First Java [which is pretty dull]
Learn Python the Hard Way would be my choice for learning old school style. http://learnpythonthehardway.org/index
This is a fantastic book on OOP design principals and has lots of language-agnostic examples.
* Chapter 3 of http://mitpress.mit.edu/sicp/ -- also chapters 1 and 2.
* _Abstraction and Specification in Program Development_, on design by contract. There's a newer book by the same authors, _Program Development in Java_, but Norman Ramsey says it's not as good. (I've only read the older one.) By Liskov & Guttag. Focuses on abstract datatypes rather than OOP classic. Bertrand Meyer's _Object-Oriented Software Construction_ covers much of the same material, but not as well to my taste in the bits I dipped into.
* Also, _Smalltalk-80: The Language and Its Implementation_ at http://wiki.squeak.org/squeak/64 -- this might be more basic than the above two. The ideas were old to me by the time I got to it, so I don't know how well it'd work for a novice.
* I've seen _A Little Smalltalk_ recommended as an intro to OO and it looks plausible: http://www.littlesmalltalk.org/index.php?page=the-book -- I haven't read it myself.
* The Art of the Metaobject Protocol by Gregor Kiczales
Don't let the second one fool you. Although it is a Lisp book, it presents OOP design principles applicable to any language. As the Amazon review says: "The Art of the Meta-Object Protocol is useful for the advanced CLOS user as well as for anyone interested in object-oriented programming and language design."
Lots of OO classes use it and Smalltalk is a great language to learn OO with (but even if you don't use it, the general information will be a big help).
I understand that this is a monumental end goal given my current situation, but can anyone point me in the direction of the best tutorial books that money can buy?
Good karma for anyone that responds :)
It seems that your first step is to to find good C++ resources: http://stackoverflow.com/questions/155762/best-c-resource
Hope this helps.