Wednesday, August 16, 2006

Encapsulation

Encapsulation and information hiding are often used interchangeably. But they are actually different. Information hiding is a design principle, whereas encapsulation is a language facility.
Encapsulation is the process of bundling code and the data it acts on together in one entity. David Parnas describes information hiding as "hiding of critical design decisions", so that the client code does not have to understand the intricacies of the design, and is also oblivious to any changes in design. Encapsulation can happen without information hiding, but will not be effective.
Encapsulation facilitates, but does not guarantee information hiding. Following some simple guidelines will help us create better classes

  • Encapsulation rule 1: Place data and the operations that perform on that data in the same class

  • Encapsulation rule 2: Use responsibility-driven design to determine the grouping of data and operations into classes



  • Information hiding rule 1: Don't expose data items

  • Information hiding rule 2: Don't expose the difference between stored data and derived data

  • Information hiding rule 3: Don't expose a class's internal structure

  • Information hiding rule 4: Don't expose implementation details of a class





  • Read this Javaworld article to better understand these concepts.




    Reflections

    1. Why do we need encapsulation?
    2. Can an OO language exist without encapsulation?




    Note: This post was originally posted on my blog at http://www.adaptivelearningonline.net
    Here are the comments from the old blog post


    COMMENT:
    AUTHOR: Amol Chaudhari

    Hi Parag,
    The article on javaworld - "Encapsulation is not information Hiding" is very insightful. Thanks a lot for providing us such a good link.
    Prior to reading this article, i never thought of consequences my bad Class design could make. Besides pointing out the subtle differences between encapsulation and information hiding, Paul Rogers has given hints regarding the class organization also, like placing the class variables at the bottom and getters/setters at top makes you focus on the responsibilities of the class rather than the internal data structure. He also hints on the possible choice of method names, like using getPosition() rather using getPositionArray().



    COMMENT:
    AUTHOR: Parag

    Hi Amol,

    Thanks for the feedback. I am glad you liked the article. Encapsulation is an often misunderstood concept. I especially liked the example of how making an array member private but exposing the fact that the collection is actually an array breaks the concept of information hiding.

    Design decisions do have very real implications. Bad design always accumalates what we call design debt, which has to be paid off at some point of time.



    COMMENT:
    AUTHOR: Rashmi

    Although we often see the terms 'Encaptulation' and 'Data Hiding' in all OOP articles but often fail to provide a difference between them in terms of a defination.This article was a great help.
    Sir it would be very useful if you could explain the rules for information hiding through a code in java



    COMMENT:
    AUTHOR: Parag

    Rashmi,
    Thanks for your suggestion. I will update the post soon with a code example.

    1 comment:

    iNeo said...

    Hi Parag,
    The post is really helpful for understanding one of the core OOP concept.

    I think there should be some visual element to this post which people could remember this distinction always.

    In my blog ,I had tried to do the same in explaination of Abstraction and Encapsulation.

    http://lalitkale.wordpress.com/2008/02/10/difference-between-abstraction-and-encapsulation/

    I would appreciate,If you could comment on my understading about these two concepts.