confident ruby

Download Confident Ruby

Post on 17-Jul-2016

8 views

Category:

Documents

1 download

Embed Size (px)

DESCRIPTION

great ruby book

TRANSCRIPT

  • Confident Ruby

    Avdi Grimm

    June 27, 2013

  • Contents

    Introduction 17

    Ruby meets the real world . . . . . . . . . . . . . . . . . . . . . . . . 17

    Confident code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    A good story, poorly told . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    Code as narrative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    The four parts of a method . . . . . . . . . . . . . . . . . . . . . . . . 20

    How this book is structured . . . . . . . . . . . . . . . . . . . . . . . . 22

    3.times { rejoice! } . . . . . . . . . . . . . . . . . . . . . . . . . 23

    Performing Work 25

    Sending a strong message . . . . . . . . . . . . . . . . . . . . . . . . 26

    Importing purchase records . . . . . . . . . . . . . . . . . . . . . . . 26

    Identifying the messages . . . . . . . . . . . . . . . . . . . . . . . . . 27

    Identifying the roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    Avoiding the MacGyver method . . . . . . . . . . . . . . . . . . . . . 29

    Letting language be constrained by the system . . . . . . . . . . . . 29

    Talk like a duck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

    Herding ducks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

    Collecting Input 32

    Introduction to collecting input . . . . . . . . . . . . . . . . . . . . . . 32

    Indirect inputs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    From Roles to Objects . . . . . . . . . . . . . . . . . . . . . . . . 35

    Guard the borders, not the hinterlands . . . . . . . . . . . . . . . 36

    Use built-in conversion protocols . . . . . . . . . . . . . . . . . . . . . 37

    1

  • CONTENTS 2

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    Example: Announcing winners . . . . . . . . . . . . . . . . . . . 37

    Example: ConfigFile . . . . . . . . . . . . . . . . . . . . . . . . 39

    A list of standard conversion methods . . . . . . . . . . . . . . . 40

    Explicit and implicit conversions . . . . . . . . . . . . . . . . . . 41

    If you know what you want, ask for it . . . . . . . . . . . . . . . . 44

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    Conditionally call conversion methods . . . . . . . . . . . . . . . . . . 46

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

    Example: opening files . . . . . . . . . . . . . . . . . . . . . . . . 47

    Violating duck typing, just this once . . . . . . . . . . . . . . . . 48

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

    Define your own conversion protocols . . . . . . . . . . . . . . . . . . 51

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    Example: Accepting either a Point or a pair . . . . . . . . . . . . 51

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    Define conversions to user-defined types . . . . . . . . . . . . . . . . 53

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    Example: Converting feet to meters . . . . . . . . . . . . . . . . 53

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    Use built-in conversion functions . . . . . . . . . . . . . . . . . . . . . 56

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    Example: Pretty-printing numbers . . . . . . . . . . . . . . . . . 57

    2

  • CONTENTS 3

    Hash.[] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    Use the Array() conversion function to array-ify inputs . . . . . . . . 60

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    Example: Accepting one or many arguments . . . . . . . . . . . 61

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    Define conversion functions . . . . . . . . . . . . . . . . . . . . . . . . 62

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

    Example: A conversion function for 2D points . . . . . . . . . . . 63

    About module_function . . . . . . . . . . . . . . . . . . . . . . . 65

    Combining conversion protocols and conversion functions . . . 65

    Lambdas as case conditions . . . . . . . . . . . . . . . . . . . . . 67

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

    Replace string typing with classes . . . . . . . . . . . . . . . . . . . 68

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    Example: Traffic light states . . . . . . . . . . . . . . . . . . . . . 68

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

    Wrap collaborators in Adapters . . . . . . . . . . . . . . . . . . . . . . 77

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    Example: Logging to IRC . . . . . . . . . . . . . . . . . . . . . . 77

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

    Use transparent adapters to gradually introduce abstraction . . . . . 82

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    3

  • CONTENTS 4

    Example: Logging to IRC, again . . . . . . . . . . . . . . . . . . . 82

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    Reject unworkable values with preconditions . . . . . . . . . . . . . . 85

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

    Example: Employee hire dates . . . . . . . . . . . . . . . . . . . 86

    Executable documentation . . . . . . . . . . . . . . . . . . . . . . 89

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    Use #fetch to assert the presence of Hash keys . . . . . . . . . . . . 90

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

    Example: A wrapper for useradd(8) . . . . . . . . . . . . . . . . 90

    Go #fetch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

    Customizing #fetch . . . . . . . . . . . . . . . . . . . . . . . . . 95

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    Use #fetch for defaults . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

    Example: Optionally receiving a logger . . . . . . . . . . . . . . 97

    Reusable #fetch blocks . . . . . . . . . . . . . . . . . . . . . . . 100

    Two-argument #fetch . . . . . . . . . . . . . . . . . . . . . . . . 101

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    Document assumptions with assertions . . . . . . . . . . . . . . . . . 103

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    Synopsis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    Rationale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    Example: Importing bank transactions . . . . . . . . . . . . . . . 103

    Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

    Handle special cases with a Guard Clause . . . . . . . . . . . . . . . 108

    Indications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

    4

  • CONTENTS 5

    Syno