As a second example from Fitnesse, we shall chose not a Java interface at at, but an implementation class. For each class of course offers an "interface" of public methods that other classes use; might it be possible to carve up not just large interfaces but large classes, based again on their use? Here are the 20 public methods of Fitnesse's PageData() class:
getContent: 24.7% setContent: 23.3% getProperties: 21.9% getAttribute: 16.4% hasAttribute: 15.1% getWikiPage: 12.3% getHtml: 11.0% setAttribute: 11.0% getVariable: 8.2% removeAttribute: 5.5% setWikiPage: 4.1% setAttribute: 4.1% getHeaderPageHtml: 4.1% setProperties: 4.1% addVersions: 4.1% getFooterPageHtml: 2.7% getVersions: 1.4% getClasspaths: 1.4% setLiterals: 1.4% getXrefPages: 1.4%
This interface is only 7% efficient, and the first suggestion raises the interface to 10% efficient if the following methods are extracted into their own interface:
hasAttribute getWikiPage getContent getVariable setContent
As a small but quite overview-related interface, this may not seem such a bad idea. The next extraction takes us to 13%:
getHeaderPageHtml getFooterPageHtml getHtml
This seems a lovely interface. The next interface takes us to 17% efficiency:
addVersions getAttribute getProperties setProperties
We could imagine that "properties" and "attributes" might fit together, but perhaps that addVersions() seems out-of-place. Moving on, the next interface extraction leaves our original PageData() at 23%:
getVersions getClasspaths
And finally, the following extraction brings us to 33% (the two setAttribute() methods indicate different argument signatures):
setAttribute setAttribute removeAttribute