The most important thing of OOP is “Making objects that developer don’t need to look inside of it.”. Reliable objects are foundation of OOP. Then let’s think about this more.
* Object should respond at all cases.
That is, crashing inside object should not be happened! object should be in valid state at any case. If software is crashed inside object, developer should analyze internal code of object, and this is what we want to avoid.
* Reducing possibility of misuse interface should be considered when interface is design.
That is, usage of interfaces should be easy and intuitive. If not, developer need to investigate for object’s internal parts to know correct usage. And, usually, interdependent interfaces leads to misuse. For example, “Interface B should be used after interface A is called”, “Interface A should not be called after interface B is called” and so on. So, if possible, reduce dependency among interfaces of objects.
* Interface should be well-commented.
In the same context with above, developer don’t need to look into the object that is well-commented. In my opinion, comments of interface should include at least following things.
+ behavior of interface.
+ prerequisite to use the interface.
+ explanation about each parameters.
+ description about return value.
And, adding usage example is recommended.
* For object to starts supporting minimal set of interface is better.
Adding interface is easy. But deleting interface is difficult because it may affect to number of other objects that already use the interface. And, stabilizing object having small number of interface, is easier. Starting from minimal set can also help developer escape from temptation of over-engineering
Next important point is relations among objects.
Software created by OOP consists of lots of objects and relations. To understand software’s behavior, knowing relations and inter-operations among objects is significant.
* Software documentation.
Design concept, policy, block diagram, used patterns and so on is needed to be documented to help reader to understand overall shape of software.
There is also disadvantage of OOP.
* Performance drop.
In every object, there are lots of routines for checking and handling unexpected cases. And in general, software in OOP consists of lots of objects. So, inevitably, number of duplicated check and handling are unavoidable – all objects may check same thing. And sometimes this drops performance very much.