Designing and Maintaining Software (DAMS) - GitHub
Recommend Documents
Habitable Software. Leaner. Less Complex. Loosely Coupled. More Cohesive. Avoids Duplication. Clearer. More Extensible ?
When we are testing the way that a unit behaves when a condition is met, use a stub to setup the condition. Solution: us
Size != Complexity. âImagine a small (50 line) program comprising. 25 consecutive "IF THEN" constructs. Such a program
Page 1. Getting Lean. Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Lean software⦠Has no extra parts
Getting Cohesion. Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Single Responsibility. Principle. A cla
Automatically detect similar fragments of code. class StuffedCrust def title. "Stuffed Crust " +. @toppings.title +. " P
Open-source. Influenced by Perl, Smalltalk, Eiffel, Ada and Lisp. Dynamic. Purely object-oriented. Some elements of func
ASTs are tree data structures that can be analysed for meaning (following JLJ in SYAC 2014/15) ... More Cohesive. Avoids
Ruby Testing Frameworks. 3 popular options are: RSpec, Minitest and Test::Unit. We'll use RSpec, as it has the most comp
Fixes issue #42. Users were being redirected to the home page after login, which is less useful than redirecting to the
âWe want the reading of code to be easy, even it makes the writing harder. (Of course, there's no way to write code wi
Getting loose coupling. Designing and Maintaining Software (DAMS). Louis Rose ... should not depend on low-level modules
Plug-ins. Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Problem. Page 3. Current Architecture. Shareabl
Tools: Vagrant. Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Bugs that appear in production and that c
Observers. Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Page 3. Delivery people need to know when pizz
Reducing duplication. Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Tactics. Accentuate similarities to
%w.rack tilt date INT TERM..map{|l|trap(l){$r.stop}rescue require l};. $u=Date;$z=($u.new.year + 145).abs;puts "== Almos
R&D: sketch habitable solutions on paper, using UML. 4. Evaluate solutions and implement the best, using TDD. Probab
Clear Names. Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Naming is hard. âThere are only two hard t
Why not duplicate? Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Habitable Software. Leaner. Less Compl
Clear Documentation. Designing and Maintaining Software (DAMS). Louis Rose. Page 2. Bad documentation. Misleading or con
âWe have tried to demonstrate that it is almost always incorrect to begin the decomposition of a system into modules o
Coupling Between Objects. Counts the number of other classes to which a class is coupled (other than via inheritance). C
providers are examples of issues that may need attention in online settings. .... World Congress in Computer Science, Computer Engineering, & Applied Com- ...... The work resulted among many contributions in a framework and notation for.
Designing and Maintaining Software (DAMS) - GitHub
What is it? Several pieces of data are often used together. Why is it problematic? Behaviour that operates on the clump
Cohesion Metrics
Designing and Maintaining Software (DAMS) Louis Rose
Recap: Cohesion
“A measure of the degree to which the elements of a module belong together.” - Yourdon & Constantine Structured Design, 1979
Cohesion Metrics
Indicate the extent to which elements are used together (and hence belong together?)
Corollary There are lots of cohesion metrics!
LCOM Lack of Cohesion of Methods
An inverse metric: a lower score is better We are using the 4th revision: LCOM4 Partitions an element (e.g., class) into sets of related elements
- Briand, Daly and Wust A Unified Framework for Cohesion Measurement in Object-Oriented Systems Empirical Software Engineering, 3, 1998
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
bake
oven
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
bake
oven
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
bake
oven
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
bake
oven
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
bake
oven
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
bake
oven
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
bake
oven
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
bake
oven
LCOM4 Example class Pizza attr_reader :toppings, :oven
toppings
def title toppings.title end
title
def cost toppings.cost + 4 end
cost
def bake oven.bake(self) end end
oven
bake
LCOM4 Example @toppings
@oven
toppings
oven
class Pizza attr_reader :toppings, :oven def title toppings.title end def cost toppings.cost + 4 end def bake oven.bake(self) end end
title
cost
bake
LCOM4 Example @toppings
@oven
toppings
oven
class Pizza attr_reader :toppings, :oven def title toppings.title end def cost toppings.cost + 4 end def bake @oven.bake(self) end end
title
cost
bake
LCOM4 Example @toppings
@oven
toppings
oven
class Pizza attr_reader :toppings, :oven def title toppings.title end def cost toppings.cost + 4 end def bake @oven.bake(self) end end
title
cost
bake
LCOM4 Example @toppings
@oven
toppings
oven
class Pizza attr_reader :toppings, :oven def title toppings.title end def cost toppings.cost + 4 end def bake @oven.bake(self) end end
title
cost
bake
Divergent Change What is it? A class can change for several reasons Why is it problematic? Changes are harder to make with confidence When does it arise? 👎 Violation of Single Responsibility Principle 👍 You know that the triggering changes won’t occur
Data Clumps What is it? Several pieces of data are often used together Why is it problematic? Behaviour that operates on the clump has no home (and consequently is often duplicated) When does it arise? 👎 High cohesion of the clump has not been detected 👍 Domain is not thoroughly understood (yet)
Primitive Obsession What is it? Using built-in types to represent domain concepts. Why is it problematic? Behaviour that operates on the domain object has no home (and consequently is often duplicated) When does it arise? 👎 Fear of OO (often due to performance concerns) 👍 If any extracted object would be very small
Feature Envy What is it? An object is more concerned with another object’s attributes or methods than its own. Why is it problematic? Behaviour probably belongs on the envied object (and consequently is often duplicated) When does it arise? 👎 Violation of Tell, Don’t Ask principle 👍 Behaviour is much more likely to change when the envying class changes
Summary Classes should have a single responsibility: a single reason to change Classes with low cohesion normally have more than one responsibility Extract classes to redistribute responsibilities