Quick Search
Browse
Pages
Blog
Labels
Attachments
Mail
Advanced
What’s New
Space Directory
Feed Builder
Keyboard Shortcuts
Confluence Gadgets
Log In
Sign Up
Dashboard
Sonar
Copy Page
You are not logged in. Any changes you make will be marked as
anonymous
. You may want to
Log In
if you already have an account. You can also
Sign Up
for a new account.
This page is being edited by
.
Paragraph
Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Preformatted
Quote
Bold
Italic
Underline
More colours
Strikethrough
Subscript
Superscript
Monospace
Clear Formatting
Bullet list
Numbered list
Outdent
Indent
Align left
Align center
Align right
Link
Table
Insert
Insert Content
Image
Link
Attachment
Symbol
Emoticon
Wiki Markup
Horizontal rule
tinymce.confluence.insert_menu.macro_desc
Info
JIRA Issue
Status
Gallery
Tasklist
Table of Contents
Other Macros
Page Layout
No Layout
Two column (simple)
Two column (simple, left sidebar)
Two column (simple, right sidebar)
Three column (simple)
Two column
Two column (left sidebar)
Two column (right sidebar)
Three column
Three column (left and right sidebars)
Undo
Redo
Find/Replace
Keyboard Shortcuts Help
<table class="wysiwyg-macro" data-macro-name="info" data-macro-parameters="icon=false|title=Table of Contents" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2luZm86aWNvbj1mYWxzZXx0aXRsZT1UYWJsZSBvZiBDb250ZW50c30&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="RICH_TEXT"><tr><td class="wysiwyg-macro-body"><p><img class="editor-inline-macro" src="/plugins/servlet/confluence/placeholder/macro?definition=e3RvYzptYXhMZXZlbD0yfQ&locale=en_GB&version=2" data-macro-name="toc" data-macro-parameters="maxLevel=2"></p></td></tr></table><h1>What is LCOM4?</h1><p>Cohesion is the degree to which the methods of a single class are tied together. When two methods in a class do not use a common attribute or a common method, it means that they share nothing and should probably not belong to the same class to respect the <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Single Responsibility Principle</a>. In other words you can split your class into several new classes to gain modularity at class level.</p><p>Sonar computes the LCOM4 (Lack of Cohesion of Methods) metric based on Hitz & Montazeri. Here is a good introduction: <a href="http://www.aivosto.com/project/help/pm-oo-cohesion.html#LCOM4">http://www.aivosto.com/project/help/pm-oo-cohesion.html#LCOM4</a>.</p><p>The best value for this metric is 1.</p><h1>How to Hunt for Bad LCOM4?</h1><p>Add the <strong>LCOM4</strong> widget (was <strong>Chidamber & Kemerer</strong> widget for Sonar versions prior to 3.3) on your <a class="confluence-link" href="/display/SONAR/Dashboards" data-linked-resource-id="163872785" data-linked-resource-type="page" data-linked-resource-default-alias="Dashboards" data-base-url="http://docs.codehaus.org">dashboard</a>:</p><p><img class="confluence-embedded-image" confluence-query-params="effects=drop-shadow" src="/download/attachments/231079997/lcom4_widget.png?version=1&modificationDate=1369217865844&effects=drop-shadow" data-image-src="/download/attachments/231079997/lcom4_widget.png?version=1&modificationDate=1369217865844&effects=drop-shadow" data-linked-resource-id="231375053" data-linked-resource-type="attachment" data-linked-resource-default-alias="lcom4_widget.png" data-base-url="http://docs.codehaus.org" data-linked-resource-container-id="231079997" title="null > lcom4_widget.png"></p><p>Drill down:</p><p><img class="confluence-embedded-image" width="900" src="/download/attachments/231079997/lcom4-drilldown.png?version=1&modificationDate=1369217865860" data-image-src="/download/attachments/231079997/lcom4-drilldown.png?version=1&modificationDate=1369217865860" data-linked-resource-id="231375054" data-linked-resource-type="attachment" data-linked-resource-default-alias="lcom4-drilldown.png" data-base-url="http://docs.codehaus.org" data-linked-resource-container-id="231079997" title="null > lcom4-drilldown.png"></p><h1>Example</h1><h2>Bad LCOM4</h2><p>Project with one single class: <em>Client.</em></p><p> </p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java|linenumbers=true|title=Client" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6dGl0bGU9Q2xpZW50fGxpbmVudW1iZXJzPXRydWV8bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>package example; public class Client { public String firstname; public String lastname; public String street; public String city; public String zipCode; public String getFullName() { return firstname + " " + lastname; } public String getFullAddress() { return street + " " + city + " " + zipCode; } }</pre></td></tr></table><p> </p><p>The project has an average LCOM4 value of 2:</p><p style="margin-left: 30.0px;"><img class="confluence-embedded-image" src="/download/attachments/231079997/lcom4-bad.png?version=1&modificationDate=1369217865864" data-image-src="/download/attachments/231079997/lcom4-bad.png?version=1&modificationDate=1369217865864" data-linked-resource-id="231375059" data-linked-resource-type="attachment" data-linked-resource-default-alias="lcom4-bad.png" data-base-url="http://docs.codehaus.org" data-linked-resource-container-id="231079997" title="null > lcom4-bad.png"></p><p>The <em>Client </em>class has an LCOM4 value of 2:</p><p><img class="confluence-embedded-image" src="/download/attachments/231079997/lcom4-bad-client.png?version=1&modificationDate=1369217865863" data-image-src="/download/attachments/231079997/lcom4-bad-client.png?version=1&modificationDate=1369217865863" data-linked-resource-id="231375058" data-linked-resource-type="attachment" data-linked-resource-default-alias="lcom4-bad-client.png" data-base-url="http://docs.codehaus.org" data-linked-resource-container-id="231079997" title="null > lcom4-bad-client.png"></p><p>It shows that there should be two different objects: <em>Client</em> and <em>Address.</em></p><h2>Good LCOM4 after Refactoring</h2><p>After creating a new <em>Address</em> class and creating an <em>Address</em> object in <em>Client:</em></p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java|linenumbers=true|title=Address" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6dGl0bGU9QWRkcmVzc3xsaW5lbnVtYmVycz10cnVlfGxhbmd1YWdlPWphdmF9&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>package example; public class Address { public String street; public String city; public String zipCode; public String getFullAddress() { return street + " " + city + " " + zipCode; } </pre></td></tr></table><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java|linenumbers=true|title=Client" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6dGl0bGU9Q2xpZW50fGxpbmVudW1iZXJzPXRydWV8bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>package example; public class Client { public String firstname; public String lastname; public Address address; public String getFullName() { return firstname + " " + lastname; } public String getFullAddress() { return address.getFullAddress(); } }</pre></td></tr></table><p>The LCOM4 of the project is down to the best value:</p><p style="margin-left: 30.0px;"><img class="confluence-embedded-image" src="/download/attachments/231079997/lcom4-good.png?version=1&modificationDate=1369217865862" data-image-src="/download/attachments/231079997/lcom4-good.png?version=1&modificationDate=1369217865862" data-linked-resource-id="231375057" data-linked-resource-type="attachment" data-linked-resource-default-alias="lcom4-good.png" data-base-url="http://docs.codehaus.org" data-linked-resource-container-id="231079997" title="null > lcom4-good.png"></p><p>Thanks to the fact that <em>Client</em> and <em>Address</em> have an LCOM4 value of 1:</p><p style="margin-left: 30.0px;"><img class="confluence-embedded-image" src="/download/attachments/231079997/lcom4-good-address.png?version=1&modificationDate=1369217865862" data-image-src="/download/attachments/231079997/lcom4-good-address.png?version=1&modificationDate=1369217865862" data-linked-resource-id="231375056" data-linked-resource-type="attachment" data-linked-resource-default-alias="lcom4-good-address.png" data-base-url="http://docs.codehaus.org" data-linked-resource-container-id="231079997" title="null > lcom4-good-address.png"></p><p style="margin-left: 30.0px;"><img class="confluence-embedded-image" src="/download/attachments/231079997/lcom4-good-client.png?version=1&modificationDate=1369217865861" data-image-src="/download/attachments/231079997/lcom4-good-client.png?version=1&modificationDate=1369217865861" data-linked-resource-id="231375055" data-linked-resource-type="attachment" data-linked-resource-default-alias="lcom4-good-client.png" data-base-url="http://docs.codehaus.org" data-linked-resource-container-id="231079997" title="null > lcom4-good-client.png"></p><h1>Related Topics</h1><p>See the following blog post: <a href="http://www.sonarsource.org/clean-up-design-at-class-level-with-sonar/">Clean Up Design at Class Level with Sonar</a>.</p><p> </p>
Please type the word appearing in the picture.
Attachments
Labels
Location
Watch this page
< Edit
Preview >
Loading…
Save
Cancel
Next hint
search
attachments
weblink
advanced