+1 I've seen many of the same problems, unfortunately strict rules and automation can't always tell good designs from bad.
Caleb On 07/09/2012 11:36 AM, Sergiu Dumitriu wrote: > Hi devs, > > Short version: > > I'd like to increase the allowed maximum value for the Class Fan-Out > Complexity checkstyle rule from 20 to 25, since a bare component already uses > 1 to 4 imports, and the 20 rule was set before we had components. > > > Long version: > > The Class Fan-Out Complexity metric measures how many other classes are used > by a class. Keeping this to a small value is a good goal, since it favors > loose-coupling, small and independent classes, and makes it harder to put > more than one responsibility in a single class. > > However, there are several problems: > > One is that this counts utility classes and interfaces, such as > java.util.List, and a fairly complex class uses more than one such utility > class; they usually come in pairs (the interface and the implementation). And > more and more classes are using apache-commons utilities like StringUtils or > IOUtils, which are just shortcut helper methods that could be implemented in > a few lines of code, so we're trading one import for reduced code complexity, > which is a good thing, even though apparently it's > increasing the Fan-Out measure. > > Another is that a bare Initializable component implementation will import: > - its component role interface > - Initializable and InitializationException > - Logger > > And since good libraries also follow the "many small classes" paradigm, > barely using some of our dependencies will add a lot of imports. For example, > the LucenePlugin has 25 org.apache.lucene.* imports just for initializing the > server and sending search requests. > > While the current maximum, 20, is enough for the majority of our classes and > interfaces, I've found myself often enough trying to refactor a class to get > down from 23 or even 21 imports, and usually I find myself doing ugly tricks, > keeping the actual code complexity the same or even worse. Best case is that > I extract an extra class that just contains the non-public utility methods > that were initially in the component implementation, but that class is > meaningless out of the context of its parent > class, so that is also a bad decision, IMHO. > > So, I propose to increase the Fan-Out limit to 25, while keeping the > requirement that classes should be kept as small as possible. _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

