On Mon, Jul 9, 2012 at 8:59 PM, Vincent Massol <[email protected]> wrote: > > On Jul 9, 2012, at 5:36 PM, 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. > > I'd like to see first an example of a class that goes beyond the recommended > value of 20 and then decide if the problem is in the class design or in this > parameter threshold. > > Re LucenePlugin; I hope you're not considering it as an example of good > design… :) > > The fact that we're using components has nothing to do with this. Whether you > use components or not is exactly the same. Quite the opposite actually since > components favor decoupling and thus reduces class fan out. > > BTW if you find your code using too many components injected it's a very bad > sign. You have a design issue. Just write some unit tests using > AbstractMockingComponentTestCase and you'll understand you have a problem > because you'll start needing to mock way too many things. > > When you find yourself doing ugly tricks to reduce the class fan out it's > because you're not thinking at the level of design. The problem has more to > do with the fact that you're usually working on fixing something and suddenly > you execute the build and you don't feel like redesigning the code just > because of a class fan out issue and thus we usually end up adding technical > debt by removing it from the checkstyle check. IMO this is the part that we > need to fix but not the threshold. > > For me this checkstyle check is probably one of the best we have. Most of the > others are syntactic sugar and are not important whereas this one is really > about design. Of course since it's about design it's also harder to fix but > that doesn't remove its value. Having a good design has always been hard. And > not having a good design generates technical debt. > > Let's see the code first before doing something arbitrary. > > I'm -1 ATM because I'd rather not rush blindly. Personally I've never had any > real issue with this class fan out except for old code I didn't write and > for which I brought some quick bugfix and I didn't want to spend the time to > refactor it. That doesn't make the rule bad.
I agree with Vincent. I've hit the limit myself a few times but I'm sure it was due to bad code design. I'm -0. Thanks, Marius > > Thanks > -Vincent > _______________________________________________ > devs mailing list > [email protected] > http://lists.xwiki.org/mailman/listinfo/devs _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

