CSC/ECE 517 Fall 2009/wiki3 3 cp: Difference between revisions
Line 23: | Line 23: | ||
This is also called coupling in the package, however there are other design principles that advise the loose of coupling between classes, the basis of those principles are the need of change without affecting others, however as explained in granularity paper by | This is also called coupling in the package, however there are other design principles that advise the loose of coupling between classes, the basis of those principles are the need of change without affecting others, however as explained in granularity paper by | ||
[http://www.objectmentor.com/resources/articles/granularity.pdf Granularity ] by Robert C. Martin, | [http://www.objectmentor.com/resources/articles/granularity.pdf Granularity ] by Robert C. Martin, DEPENDENCIES CANNOT BE AVOIDED. | ||
Therefore CCP identifies the classes that are totally dependent from each other, on this matter the Open-Closed Principle or OCP | Therefore CCP identifies the classes that are totally dependent from each other, on this matter the Open-Closed Principle or OCP advises full closure which is difficult to achieve. | ||
The previous statement leads to the overlaping of principles which shall not be confused as a violation of principles, however the desition to overlap principles in the design must be very carfuly studied in the early stages. | |||
The CCP principle recommends to identify the common changes in a package, only after that the package can be released with the functionality that a change affects all its classes, the benefit of this is "maintainability", which is easier for the user in the way that a change or update surely affects all classes in the package | |||
For a design to be maintained a degree of volativility will be required, this is aesily achived when the CCP principle is applied in the sense that all classes in the package can change simustanialy, any package expected to be volatile should not depend on a package that is difficult to change. | |||
Another advantage of CCP is stability of packages, to have packages with common changes makes the package itself more stable which in the end improves stability | |||
==Regarding Granularity== | ==Regarding Granularity== |
Revision as of 04:02, 19 November 2009
Common Closure Principle
In simple words the Common Closure Principle refers to classes that change topether, belong together, this is a very simple definition taken from the book Java Design: Objects, UML and Process written by Kirk Knoernschild.
A more explained definition of Common Closure Principle is given by Robert Martin, which states that:
THE CLASSES IN A PACKAGE SHOULD BE CLOSED TOGETHER AGAINTS THE SAME KINDS OF CHANGES. A CHANGE THAT AFFECTS A PACKAGE AFFECTS ALL THE CLASSES WITHIN THAT PACKAGE.
See Granularity PDF Article written by Robert Martin for more details
In other words, what affects one affects all, a broader and detailed explanations are given in this wikiwork.
Introduction and Objective
There are several web pages that explain in few words what is Common Closure Principle, but they fall short by just giving definitions and very few examples.
Therefore the objective of the wiki work is to dedicate a deeper investigation on this topic with examples.
A deep definition of Common Closure Principle CCP
Common Closure Principle or CCP is a design principle whose objective is to achieve maintainability, whereas usability is not important. This principle says what kind of classes should grouped or packaged together from a common change that affects all its components.
This is also called coupling in the package, however there are other design principles that advise the loose of coupling between classes, the basis of those principles are the need of change without affecting others, however as explained in granularity paper by Granularity by Robert C. Martin, DEPENDENCIES CANNOT BE AVOIDED.
Therefore CCP identifies the classes that are totally dependent from each other, on this matter the Open-Closed Principle or OCP advises full closure which is difficult to achieve.
The previous statement leads to the overlaping of principles which shall not be confused as a violation of principles, however the desition to overlap principles in the design must be very carfuly studied in the early stages.
The CCP principle recommends to identify the common changes in a package, only after that the package can be released with the functionality that a change affects all its classes, the benefit of this is "maintainability", which is easier for the user in the way that a change or update surely affects all classes in the package
For a design to be maintained a degree of volativility will be required, this is aesily achived when the CCP principle is applied in the sense that all classes in the package can change simustanialy, any package expected to be volatile should not depend on a package that is difficult to change.
Another advantage of CCP is stability of packages, to have packages with common changes makes the package itself more stable which in the end improves stability
Regarding Granularity
More important than reusability, is maintainability.
If the code in an application must change, where would you like those changes to occur: all in one package, or distributed through many packages? It seems clear that we would rather see the changes focused into a single package rather than have to dig through a whole bunch of packages and change them all. That way we need only release the one changed package. Other packages that don’t depend upon the changed package do not need to be revalidated or rereleased.
The CCP is an attempt to gather together in one place all the classes that are likely to change for the same reasons. If two classes are so tightly bound, either physically or conceptually, such that they almost always change together; then they belong in the same package. This minimizes the workload related to releasing, revalidating, and redistributing the software.
This principles is closely associated with the Open Closed Principle (OCP). For it is “closure” in the OCP sense of the word that this principle is dealing with. The OCP states that classes should be closed for modification but open for extension. As we learned in the article that described the OCP, 100% closure is not attainable. Closure must be strategic. We design our systems such that the are closed to the most likely kinds of changes that we foresee.
The CCP amplifies this by grouping together classes which cannot be closed against certain types of changes into the same packages. Thus, when a change in requirements comes along; that change has a good chance of being restricted to a minimal number of packages.
What are the advantages and disadvantages?
Goal: limit the dispersion of changes among released packages u changes must affect the smallest number of released packages
Classes within a package must be cohesive
Given a particular kind of change, either all classes or no class in a component needs to be modified.
Group classes with similar closure together, package closed for anticipated changes.
Confines changes to a few packages.
Reduces package release frequency.
Reduces work for the programmer and makes easier to maintain it.
Going from OCP to CCP, in this case the classes should be open for extension, but closed for modification, this is an ideal scenario, instead classes will be designed for likely kinds of changes
Cohesion of closure in a package should be closed to the same kinds of changes and they will be confined within few packages
Reduces frequency of release of packages
Reading Recommendations
Reference Books
Object-Oriented Design Heuristics by Arthur J. Riel
Agile Principles, Patterns, and Practices in C# by Robert C. Martin; Martin Micah
UML for Java™ Programmers by Robert C. Martin
Java Design: Objects, UML, and Process by Kirk Knoernschild
External Links and Articles
Bob Martin's Robert C. Martin web page
Design Principles and Design Patterns by Robert C. Martin
Granularity by Robert C. Martin
Appendix
Open/Closed Principle OCP: Entities like classes or modules need to be open to extend them, at the same time they need to be closed for modification.
Liskov Substitution Principle LSP: Any base class function must not be confused when a derived class is substituted for the base class. it is also known as "Design by Contract" principle in Robert Martin
Dependency Inversion Principle DIP: The details must be based on abstractions and not in the other way aroud, abstractions based on details.
Interface Segregation Principle ISP: Some interfaces can be grouped in member functions, in this way the clients use one group of member functions, and other clients use the other groups according to their porpouse. the clients use specific interfaces instead of the general interface.
Reuse/Release Equivalency Principle REP: Reuse and Release are almost the same in the sense that only Released components through a tracking system are Reused components.
Common Closure Principle CCP: If the changes are of the same kind then they shloud be closed together, in other words, classes that change together, belong together and form groups
Common Reuse Principle CRP: It refers to the clases that are reused together, if they are not then they should not be grouped. The effect of applying Common Reuse is that if you reuse one you reuse all of them.
Acyclic Dependencies Principle ADP: The structure for released components must never form a dependency cycle.
Stable Dependencies Principle SDP: this principle recommends that the dependee must be more stable than the depender, they usually follow the direction of stability.
Most of the definitions were inspired on the web page What Makes A Good Object-Oriented Design? written by Tim Ottinger