Saturday, July 11, 2015

Cohesion and Coupling - Design Principles



http://blog.sanaulla.info/2008/06/26/cohesion-and-coupling-two-oo-design-principles/
good OO design should be loosely coupled and highly cohesive.

The aim of the design should be to make the application:
easier to develop
easier to maintain
easier to add new features
less Fragile.

Coupling is the degree to which one class knows about another class.
Cohesion is used to indicate the degree to which a class has a single, well-focused purpose. Coupling is all about how classes interact with each other, on the other hand cohesion focuses on how single class is designed. Higher the cohesiveness of the class, better is the OO design.

Highly cohesive classes are much easier to maintain and less frequently changed.
Such classes are more usable than others as they are designed with a well-focused purpose.

10    if(source contains "http://")
11    {
12      //its a web document, create a HttpReader
13      myReader = new HttpReader(source);
14    }
15    else
16    {
17      myReader = new FileReader(source);
18    }

Apart from that your client class knows that HttpReader is used for this and FileReader for that, so you are giving away the type related information about the instance you are using and thereby the client code gets tightly coupled with this type information. 
06  public static getReader(String source)
07  {
08    if( source contains http)
09    {
10      return new HttpReader(source);
11    }
12    else if(someother condition)
13    {
14      return new SomeReader(source);
15    }
16    else
17    {
18      return new FileReader(source);
19    }
20  }

31    Reader myReader = ReaderFacotry.getReader(source);
One thing to keep in mind is that encapsulation is not only data hiding but also hiding the type related information from the user.

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts