Friday, 9 May 14
Welcome to your New Project Friday, 9 May 14
Friday, 9 May 14
Friday, 9 May 14
Things are starting to smell Friday, 9 May 14
Code Smells Symptoms in the source code that indicate there may be trouble ahead: Bugs Reduced development speed Readability/maintainability problems Heuristics, not hard and fast rules Friday, 9 May 14
Example: Long parameter Lists ¡ ( defn ¡ make-‑cheese ¡ ¡ ¡[name ¡ ¡ ¡region ¡ ¡ ¡country ¡ ¡ ¡aoc? ¡ ¡ ¡pdo? ¡ ¡ ¡doc? ¡ ¡ ¡milk-‑origin ¡ ¡ ¡milk-‑origin-‑subspecies ¡ ¡ ¡pastuerized? ¡ ¡ ¡aging-‑time ¡ ¡ ¡mould-‑type]) Friday, 9 May 14
( make-‑cheese Example: Long ¡"Bleu ¡de ¡Gex" ¡ ¡"Jura" ¡ parameter ¡"France" ¡true ¡ Lists ¡false ¡ ¡false ¡ ¡ ¡:cows ¡ ( defn ¡ make-‑cheese ¡ ¡"Montbéliard" ¡ ¡ ¡[name ¡false ¡ ¡( weeks ¡3) ¡ ¡ ¡ ¡region ¡"Penicillium ¡glaucum") ¡ ¡ ¡country ¡ ¡ ¡ ¡aoc? ( make-‑cheese ¡ ¡"Stilton" ¡ ¡ ¡ ¡pdo? ¡["Derbyshire" ¡"Leicestershire" ¡ ¡ ¡ ¡doc? "Nottinghamshire"] ¡ ¡ ¡ ¡milk-‑origin ¡"United ¡Kingdom" ¡ ¡false ¡ ¡ ¡ ¡milk-‑origin-‑subspecies ¡true ¡ ¡ ¡ ¡pastuerized? ¡false ¡ ¡ ¡ ¡aging-‑time ¡:cows ¡ ¡"local" ¡ ¡ ¡ ¡mould-‑type]) ¡true ¡ ¡( weeks ¡9) ¡ ¡"Penicillium ¡roqueforti") Friday, 9 May 14
What smells? Hard to read Hard to change Error prone (easy to switch around literals) Friday, 9 May 14
What Next steps smells? Obvious refactoring: extract parameter objects, alternative Hard to read functions make-‑uk-‑ Hard to change cheese Error prone (easy to But... indicates switch around literals) underlying issues with how we have chosen to model our data - can we address that too? Friday, 9 May 14
“Standard” Code Smells Martin Fowler + Kent Beck in “Refactoring...”: http:// www.amazon.co.uk/Refactoring- Improving-Design-Existing-Technology/ dp/0201485672 Define a standard set of smells focussed on OO and statically typed languages (Java) Friday, 9 May 14
Taxonomy Parallel Inheritance Hierarchies Shotgun Surgery Message Inappropriate Chains Intimacy CHANGE Divergent PREVENTERS Change Middle Man Primitive Feature COUPLERS Large Obsession Envy Class Long Parameter List Long BLOATERS Method Refused Duplicate Bequest Code Temporary Data class Alternative Classes DataClumps Field Dead Code with Different Interfaces DISPENSIBLES Lazy class OO Switch Speculativ ABUSERS Statements e Generality Mäntylä, M. V. and Lassenius, C. "Subjective Evaluation of Software Evolvability Using Code Smells: An Empirical Study" . Journal of Empirical Software Engineering, vol. 11, no. 3, 2006, pp. 395-431. Friday, 9 May 14
What do code smells look like in Clojure? (Or: What do they smell like?) Friday, 9 May 14
... and why do we care? Friday, 9 May 14
My CV 2000s 2010s Pascal C# C C++ JavaScript Ruby Java Clojure Friday, 9 May 14
My CV 2000s 2010s Pascal C# C C++ JavaScript IMPERATIVE Ruby Java EXPRESSION Clojure ORIENTED Friday, 9 May 14
My CV 2000s 2010s Pascal C# C C++ JavaScript (Mainly) OO Ruby Java Clojure FUNCTIONAL Friday, 9 May 14
Friday, 9 May 14
Building on prior work Parallel Inheritance Hierarchies Shotgun Surgery Message Inappropriate Chains Intimacy CHANGE Divergent PREVENTERS Change Middle Man Primitive Feature COUPLERS Large Obsession Envy Class Long Parameter List Long BLOATERS Method Refused Duplicate Bequest Code Temporary Data class Alternative Classes DataClumps Field Dead Code with Different Interfaces DISPENSIBLES Lazy class OO Switch Speculativ ABUSERS Statements e Generality Friday, 9 May 14
OO-Specific Stuff Parallel Inheritance Hierarchies Shotgun Surgery Message Inappropriate Chains Intimacy CHANGE Divergent PREVENTERS Change Middle Man Primitive Feature COUPLERS Large Obsession Envy Class Long Parameter List Long BLOATERS Method Refused Duplicate Bequest Code Temporary Data class Alternative Classes DataClumps Field Dead Code with Different Interfaces DISPENSIBLES Lazy class OO Switch Speculative ABUSERS Statements Generality Friday, 9 May 14
A few edits... Shotgun Surgery Dead Code Duplicate Speculative Code Generality CHANGE Divergent PREVENTERS Change DISPENSIBLES Lazy Class function Large Class Primitive Obsession namespace Long Parameter Message Inappropriate List Chains Intimacy BLOATERS Middle Man DataClumps Feature COUPLERS Envy Long method function Friday, 9 May 14
A few edits... Shotgun Surgery Dead Code Primitive Obsession Duplicate Speculative Code Generality CHANGE Divergent PREVENTERS “Primitive Obsession is using primitive data types to represent domain Change ideas. For example, we use a String to represent a message, an Integer to DISPENSIBLES Lazy function represent an amount of money, or a Struct/Dictionary/Hash to represent a specific object. ” http://c2.com/cgi/wiki?PrimitiveObsession Primitive Obsession Large namespace Long ... are collections in Clojure that primitive? Parameter Message Inappropriate List Chains Intimacy BLOATERS Middle Man DataClumps Feature COUPLERS Envy Long function Mäntylä, M. V. and Lassenius, C. "Subjective Evaluation of Software Evolvability Using Code Smells: An Empirical Study" . Journal of Empirical Software Engineering, vol. 11, no. 3, 2006, pp. 395-431. Friday, 9 May 14
Clojure-specific Smells ??? ??? ??? DYS-FUNCTIONAL ??? CODE Friday, 9 May 14
AKA: Data structure coupling Over-sharing structure / content of maps/records leading to implicit Magic Keys coupling (clavis magica) Friday, 9 May 14
Example { ¡:name ¡"Stilton" ¡ ¡:milk ¡{:milk-‑type ¡:cows ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡:origin-‑subspecies ¡"local" ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡:is-‑pasteurized? ¡true} ¡ ¡:mould-‑type ¡"Penicillium ¡roqueforti" ¡ ¡:region ¡ ¡ ¡["Derbyshire" ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡"Leicestershire" ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡"Nottinghamshire"] ¡ ¡:country ¡"United ¡Kingdom" ¡ ¡:aging-‑time ¡nil} Friday, 9 May 14
Example ( defn ¡ calculate-‑olfactory-‑offence ¡ ¡[{:keys ¡[milk ¡mould-‑type ¡aging-‑time ¡washing-‑solution]}] ¡ ¡( let ¡ [pasteurization-‑factor ¡( if ¡ (:is-‑pasteurized? ¡milk) ¡0.5 ¡1)] ¡ ¡ ¡ ¡(* ¡aging-‑time ¡ ¡ ¡ ¡ ¡ ¡ ¡( + ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡( milk-‑type-‑>smell ¡(:milk-‑type ¡milk)) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡pasteurization-‑factor ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡( mould-‑>smell ¡mould-‑type) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡( washing-‑solution-‑>smell ¡washing-‑solution-‑>smell))))) ¡ ( defn ¡ lactose-‑levels ¡[{:keys ¡[milk ¡quantity]}] ¡ ¡( if ¡ (:is-‑pasteurized? ¡milk) ¡ ¡ ¡ ¡( calculate-‑pasteurized-‑lactose-‑levels ¡quantity ¡(:milk-‑type ¡milk)) ¡ ¡ ¡ ¡( calculate-‑unpasteurized-‑lactose-‑levels ¡quantity ¡(:milk-‑type ¡milk)))) Friday, 9 May 14
Example ( defn ¡ calculate-‑olfactory-‑offence ¡ ¡[{:keys ¡[ milk ¡mould-‑type ¡aging-‑time ¡washing-‑solution]}] ¡ ¡( let ¡ [pasteurization-‑factor ¡( if ¡ (:is-‑pasteurized? ¡ milk ) ¡0.5 ¡1)] ¡ ¡ ¡ ¡(* ¡aging-‑time ¡ ¡ ¡ ¡ ¡ ¡ ¡( + ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡( milk-‑type-‑>smell ¡(:milk-‑type ¡ milk )) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡pasteurization-‑factor ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡( mould-‑>smell ¡mould-‑type) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡( washing-‑solution-‑>smell ¡washing-‑solution-‑>smell))))) ¡ ( defn ¡ lactose-‑levels ¡[{:keys ¡[ milk ¡quantity]}] ¡ ¡( if ¡ (:is-‑pastuerized? ¡ milk ) ¡ ¡ ¡ ¡( calculate-‑pastuerized-‑lactose-‑levels ¡quantity ¡(:milk-‑type ¡ milk )) ¡ ¡ ¡ ¡( calculate-‑unpasteurized-‑lactose-‑levels ¡quantity ¡(:milk-‑type ¡ milk )))) ¡ Friday, 9 May 14
What smells? Hard to figure out the cost of change of key names, data types etc. Unexpected errors if data is in the wrong shape in production ... too many fns know the intimate details about the structure. Easy mess to get into - tradeoff of modelling data as maps Friday, 9 May 14
Recommend
More recommend