Thanks for the feedback On Apr 21, 2012, at 2:00 PM, Mariano Martinez Peck wrote:
> Hi guys. After our meeting at Lille, I did a pass of SmallLint over Fuel > project. I have to say that I enjoyed the tool and that. I love the > manifiesto idea. I love to store metada and to be able to reject rules and > scenarios to avoid having false positives again in the future. In addition, > it looks like I had less false positive than with other tools. However, there > were a couple of rules that I don't understand or may suggest something: > > 1) First, apart form showing the package between parenthesis, I would also > show the protocol (category). Because some rules play with that, so it is > handy if you can directly see them there, otherwise you need to browse the > code. > > 2) RBContainsRule is not clear for me. " 'Checks for the common code > fragment: "(aCollection detect: [:each | ''some condition''] ifNone: [nil]) > ~= nil". contains: can simplify this code to "aCollection contains: [:each | > ''some condition'']". Not only is the contains: variant shorter, it better > signifies what the code is doing.'" > That is not very true. #contains answers true or false, while > detect:ifNone:[] answers whatever, and in your example it is nil. So, the > answer will be different and hence it is not the same. Ok, in your example, > you compare after with == nil... but... I don't really see a use case. For > example, in my case it detected: > > classNamed: className > > ^ (migrations > detect: [:m | m sourceClassName = className ] > ifNone: [ ^ self globalClassNamed: className ]) > targetClass. > > > 3) RBLawOfDemeterRule: maybe you can exclude string concatenation? (#,) > because it detected a lot of messages like this: > signalWith: aGlobalName and: aSelector > ^ self signal: 'Method ', aGlobalName, '>>#', aSelector, ' not found.' > > Also, what about excluding messages like #asXXX. For example, here it > detected "self signature asByteArray". Is that completly breaking the law of > demeter? mmm I don't think so. > > verifySignatureFrom: aDecoder > > | streamSignature | > streamSignature := ByteArray new: self signature size. > aDecoder nextEncodedBytesInto: streamSignature. > (self signature asByteArray = streamSignature) ifFalse: [ > FLBadSignature > signalCurrentSignature: self signature > streamSignature: streamSignature ]. > > > 4) RBSentNotImplementedRule: I didn't understand why it has selected: > > largeIdentityHash > > <primitive: 75> > self primitiveFailed > > both messages are implemented :( > > > 5) RBClassInstVarNotInitializedRule could be smarter and search not only for > #initialize but for #initializeXXX. Lots of times, I initialize my objects > with data, using a particular nitialize method, such as: > initializeWithBehaviors: someBehaviors extensionMethods: someExtensionMethods > so the rule says there is no initialize...but I have that one ;) > > > That's all the feedback so far. It helped me to find some things to improve > so thanks! > > > -- > Mariano > http://marianopeck.wordpress.com >