Video: Unconditional Code - Michael Feathers
Unconditional Code - Michael Feathers
(https://www.youtube.com/watch?v=AnZ0uTOerUI)


Null Object Pattern

something bad has happened, but we'll act like it didn't
others: NaN, [], null, special case

that error is part of our domain
same in functional


error has moved to the place where the error occurred

when successful, do this


---
Example

count # groups of '1' (blue here)

"edgy code", it has a lot of edge cases

add 0 at front, removes one edge

we eliminated an edge, by extending the domain
example




makes it more general, can now work with multiple files
generalizing the problem a bit, so that things that can occur can be okay


extend the range of input
so some things are not an error
not here:

we do here:

make a bet: when you extend the domain, people will understand that



2 parts of the program
1) checking
2) do stuff

area where there is no need of error checking
option monad in haskell, mimicked in haskell)

output =
- cumulative error message
- or
- actual output
=> mixed feeling

exceptions should be like a time machine
(like transactions)
intention can succeed or fail
example: shuffle

5 why when designing

error handling: distance between detecting problem and what you go and do about it
if I can't read a config, can I use a default config + notify?
always question errors
can't eliminate entirely
but can we restructure the system so as to remove this error?
tended systems vs untended systems




supervisor trees = mimic the human
cost choice
safety choice



counter-intuitive

care happens when there is hazard
vs:
rust - prevent things from happening
erlang - react to when they happen
