Briefly, for my thesis I investigated the difficulties which procedural designers had in designing an object-oriented solution. I classified these difficulties into four categories, not including those solutions classified as object-oriented:
This type of solution was characterized by having one single class, or one large class, usually named "main" (or something similar). Rather than abstracting common functionality and attributes, all functionality and attributes were combined into one class.
This solution is the opposite of monolithic solution--instead of having too few classes, this solution type has too many classes. Basically, every attribute (which should properly be defined as a data member of a more general class) is used as the basis for a class.
This solution type broke a real-world relationship between objects to reuse functionality or attributes. Instead of using an abstract class to pull out this functionality, one class was made a subclass of another, even though this was not the case for the real-world objects.
This solution is characterized by treating classes as independent entities. Rather than using an abstract class to pull out common functionality and attributes, these are repeated in different, independent classes.
Comments? Email me at firstname.lastname@example.org