Slide 1

Slide 1 text

Ted M. Young https://maketestable.com/ @jitterted Stop Obsessing About Primitives from the MAKE YOUR CODE MORE TESTABLE series Ted M. Young Java Trainer, Coach, & Live Coder [email protected] https://ted.dev @JitterTed (Twitch, Twitter, YouTube) Discord: https://discord.gg/9XDfBSZ

Slide 2

Slide 2 text

Ted M. Young https://maketestable.com/ @jitterted Ask Questions As You Need To

Slide 3

Slide 3 text

Ted M. Young https://maketestable.com/ @jitterted Primitive Obsession The Code Smell

Slide 4

Slide 4 text

Ted M. Young https://maketestable.com/ @jitterted Primitives: What Are They? • int, long, char • boolean • String • List, Map, Set

Slide 5

Slide 5 text

Ted M. Young https://maketestable.com/ @jitterted Primitives: Where Are They? • Instance variables (fields) • Method parameters • Return values • Not local variables

Slide 6

Slide 6 text

Ted M. Young https://maketestable.com/ @jitterted Primitives: What’s Wrong? • Mixes responsibilities • Not self-documenting • Leads to dispersed logic

Slide 7

Slide 7 text

Ted M. Young https://maketestable.com/ @jitterted Fixing Primitive Obsession Create New Types

Slide 8

Slide 8 text

Ted M. Young https://maketestable.com/ @jitterted Enum Usage: Limited Options Known at Coding Time

Slide 9

Slide 9 text

Ted M. Young https://maketestable.com/ @jitterted Enum Examples • Playing Card Suit or Rank • Hearts, Clubs; Ace, 2, 3…, Queen, King • Game Outcomes • Beat Dealer, Lost to Dealer, Went “Bust”, Won Blackjack • Option Contract Type • Put or Call • Coffee Ingredient

Slide 10

Slide 10 text

Ted M. Young https://maketestable.com/ @jitterted Enum: Turn Logic into Constant

Slide 11

Slide 11 text

Ted M. Young https://maketestable.com/ @jitterted Enum: Turn Logic into Constant

Slide 12

Slide 12 text

Ted M. Young https://maketestable.com/ @jitterted Value Object Usage: Many Options, May Change Dynamically

Slide 13

Slide 13 text

Ted M. Young https://maketestable.com/ @jitterted unconstrained number constrained type 1 100 Wager int -2,147,483,648 2,147,483,647

Slide 14

Slide 14 text

Ted M. Young https://maketestable.com/ @jitterted unconstrained date constrained type 2021-01-15 ExpirationDate LocalDate -999999999-01-01 +999999999-12-31 2021-02-19 2020-11-20 2020-12-18 2021-03-19 2021-04-16

Slide 15

Slide 15 text

Ted M. Young https://maketestable.com/ @jitterted Other Value Objects Money • Contains Currency and Amount Birthdate Color Identifiers • UserId, CustomerId

Slide 16

Slide 16 text

Ted M. Young https://maketestable.com/ @jitterted Stateful Type Usage: Holds Mutable State

Slide 17

Slide 17 text

Ted M. Young https://maketestable.com/ @jitterted Stateful Types Inventory Level Blackjack Hand Order Quantity

Slide 18

Slide 18 text

Ted M. Young https://maketestable.com/ @jitterted Refactoring to New Type InventoryLevel

Slide 19

Slide 19 text

Ted M. Young https://maketestable.com/ @jitterted

Slide 20

Slide 20 text

Ted M. Young https://maketestable.com/ @jitterted Feature Envy Behavior implemented against data in another object

Slide 21

Slide 21 text

Ted M. Young https://maketestable.com/ @jitterted Fix Scalar Primitive Obsession 1. Fix Feature Envy: gather usages via getter and setter 2. Remove getter & setter via inlining 3. Move scalar field to a new class 4. Change old scalar to instance of new type 5. Replace getter with new type’s methods

Slide 22

Slide 22 text

Ted M. Young https://maketestable.com/ @jitterted Fix Collection Primitive Obsession 1. Move collection field to new class via getter 2. Look for Feature Envy (usages of new getter) 3. Extract and Move Methods to new class 4. Continue until no more accesses via getter 5. Inline & remove getter

Slide 23

Slide 23 text

Ted M. Young https://maketestable.com/ @jitterted Further Constrain Data Exposure • Look for public methods that: • Can now be private • Return unconstrained types

Slide 24

Slide 24 text

Ted M. Young https://maketestable.com/ @jitterted Questions? Ted M. Young Java Trainer, Coach, & Live Coder [email protected] https://ted.dev @JitterTed (Twitch, Twitter, YouTube)

Slide 25

Slide 25 text

Ted M. Young https://maketestable.com/ @jitterted Thank You Ted M. Young Java Trainer, Coach, & Live Coder [email protected] https://ted.dev @JitterTed (Twitch, Twitter, YouTube) Discord: https://discord.gg/9XDfBSZ