OO

In my opinion the Object Oriented Paradigm is just a matter of common sense when we are designing a system. The main characteristics of a Object Oriented Design are:
 * Inheritance: Allows a class to have the same behavior as another class and extend that behavior to provide special action for specific needs. It's used for reusability.
 * Polymorphism: We can represent a single object that behaves different forms.
 * Encapsulation: Wrap up data member and method together into a single unit, hiding the internal details of an object. It's the inner layout.
 * Abstraction: Represent always the essential feature without representing the background details, ignoring irrelevant features, properties or functions and emphasizing the relevant ones. It's the outter layout.

As [Al-Farooque] [explains] to his wife ;-):

The most important concepts are the S.O.L.I.D. principles:


 * S = Single Responsibility Principle
 * O = Opened Closed Principle
 * L = Liscov Substitution Principle
 * I = Interface Segregation Principle
 * D = Dependency Inversion Principle

I think it's interesting that we also consider another concepts such as:


 * [Coupling]: Dependencies between classes.
 * [Cohesion]: Keeping objects focused, manageable and understandable.
 * Composition over Inheritance: favoring composition over inheritance.
 * Principle of least knowledge: the less your class knows, the better.
 * The Common Closure principle: related classes should be packaged together.
 * The Stable Abstractions principle: the more stable a class is, the more it must consist of abstract classes.
 * [KISS]: Keep it simple, stupid.
 * [GRASP]: General Responsibility Assignment Software Patterns.
 * [DRY]: Don't repeat yourself [].
 * [Occam's razor]: Among competing hypotheses, the one that makes the fewest assumptions should be selected.
 * [SSOT]: Structuring information models and associated schemata such that every data element is stored exactly once. We must mention here without going too deep these concepts:
 * Enterprise Service Bus (ESB): Allows any number of systems in an organisation to receive updates of data that has changed in another system.
 * Master Data Management (MDM): Acts as a hub for multiple systems, many of which could allow updates to different aspects of information on a given entity.
 * Data Warehouse (DW): Support reporting and analysis of data that has been combined from multiple sources.

We could develop this matter more writing about refactoring, where we should take into account concepts like:
 * [of three]: Extract a new procedure on repeteated code.
 * [Design Patterns]: Patterns we can apply to solve common problems. We should [use them properly without abusing them].