{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/blog/2012/08/28/practical-object-oriented-design-in-ruby-is-a-really-good-book",
    "result": {"data":{"site":{"siteMetadata":{"title":"your friend Joel's digital garden","description":"Articles and notes from a collaborator at egghead.io. Musings on software, business, and life from a skilled virtual assistant.","author":{"name":"Joel Hooks"},"keywords":["Video Blogger"]}},"mdx":{"excerpt":"I've been reading the Rough Cut of  Practical Object Oriented Design , and I have been absolutely enjoying every page. It isn't very often that a technical book comes along that really strikes me as a \"new classic,\" but this one qualifies…","fields":{"github":"https://github.com/joelhooks/joelhooks-com/tree/master/content/legacy_blog/2012-08-28-practical-object-oriented-design-in-ruby-is-a-really-good-book.markdown"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"post\",\n  \"title\": \"Practical Object Oriented Design is Excellent\",\n  \"date\": \"2012-08-28T00:00:00.000Z\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"381px\"\n    }\n  }, \"\\n      \", mdx(\"a\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/56aa3132eef03048efde796ce6c82856/ac471/pood.jpg\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"\\n    \", mdx(\"span\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"131.27413127413126%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAaABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAgABBP/EABcBAQEBAQAAAAAAAAAAAAAAAAEDAgT/2gAMAwEAAhADEAAAAeUZk+5xhtOuFKKf/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAECERASITL/2gAIAQEAAQUCss6SoTHNIaKiaRwvR//EABwRAAEEAwEAAAAAAAAAAAAAAAABAgMREhNRQf/aAAgBAwEBPwF0iXSmcXTFq+GpnD//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAECAQE/AYR5Wf/EABsQAQACAgMAAAAAAAAAAAAAAAAxQQEQEYGR/9oACAEBAAY/AkJX0tblCM+sb//EAB4QAAICAgIDAAAAAAAAAAAAAAERACFBgVFhEDFx/9oACAEBAAE/ISkPLaBg6airRuBkXbNTDQ30J46jsn9hLAyCncJ6+P/aAAwDAQACAAMAAAAQA+zN/8QAGxEAAgEFAAAAAAAAAAAAAAAAAREAEDFBgbH/2gAIAQMBAT8QEIiW4MnUJjNyoP/EABcRAAMBAAAAAAAAAAAAAAAAAAABEWH/2gAIAQIBAT8QTyoxK0bH/8QAIBABAQACAQMFAAAAAAAAAAAAAREAITFBYZEQcaHB0f/aAAgBAQABPxCSHPtjV5jiLmqIvBOCLYk14k585UCTppMUBel0H7gmgDVXZ5vjKIwM6L8Y2LoJ0fWQaQSo98TYr3vp/9k=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"img\", {\n    parentName: \"a\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Practical Object-Oriented Design in Ruby\",\n    \"title\": \"Practical Object-Oriented Design in Ruby\",\n    \"src\": \"/static/56aa3132eef03048efde796ce6c82856/ac471/pood.jpg\",\n    \"srcSet\": [\"/static/56aa3132eef03048efde796ce6c82856/8356d/pood.jpg 259w\", \"/static/56aa3132eef03048efde796ce6c82856/ac471/pood.jpg 381w\"],\n    \"sizes\": \"(max-width: 381px) 100vw, 381px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\",\n    \"decoding\": \"async\"\n  }), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"I've been reading the Rough Cut of \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.amazon.com/exec/obidos/ASIN/0321721330/joehoobuiblo-20/ref=nosim/\"\n  }, \"Practical Object Oriented Design\"), \", and I have been absolutely enjoying every page. It isn't very often that a technical book comes along that really strikes me as a \\\"new classic,\\\" but this one qualifies. \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://twitter.com/sandimetz\"\n  }, \"Sandi Metz\"), \" has compiled a concise review of \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod\"\n  }, \"SOLID design principles\"), \" in clear approachable language.\"), mdx(\"p\", null, \"Don't be put off by the \\\"in Ruby\\\" portion of the title. If you can read code and understand the basics of design patterns, this book shouldn't pose any technical hurdles regarding the language the author uses.\"), mdx(\"p\", null, \"One of my favorite features of this book was the way she guides us through the anti-patterns that we typically see in our code. We then step through a series of refactorings before arriving at a simple, maintainable, nicely packaged object-oriented design.\"), mdx(\"blockquote\", {\n    className: \"twitter-tweet tw-align-center\"\n  }, mdx(\"p\", null, \"\\u201CDon\\u2019t overestimate your strengths and use an inflated self-view as an excuse to avoid tests.\\u201D \", mdx(\"a\", {\n    href: \"https://twitter.com/sandimetz\"\n  }, mdx(\"s\", null, \"@\"), mdx(\"b\", null, \"sandimetz\")), \" is talking to you. \", mdx(\"a\", {\n    href: \"https://twitter.com/search/?q=%23PracticalOOD\"\n  }, mdx(\"s\", null, \"#\"), mdx(\"b\", null, \"PracticalOOD\"))), \"\\u2014 Joel Hooks (@jhooks) \", mdx(\"a\", {\n    href: \"https://twitter.com/jhooks/status/240446750157070336\",\n    \"data-datetime\": \"2012-08-28T13:52:27+00:00\"\n  }, \"August 28, 2012\")), mdx(\"script\", {\n    src: \"//platform.twitter.com/widgets.js\",\n    charSet: \"utf-8\"\n  }), mdx(\"p\", null, \"After we've been well schooled in fundamentals, we are given an excellent exposition of unit testing. \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"The unit testing chapter is worth the cost of admission alone.\")), mdx(\"blockquote\", {\n    className: \"twitter-tweet tw-align-center\",\n    \"data-in-reply-to\": \"240464842845208576\"\n  }, mdx(\"p\", null, mdx(\"a\", {\n    href: \"https://twitter.com/robpenner\"\n  }, mdx(\"s\", null, \"@\"), mdx(\"b\", null, \"robpenner\")), \" \", mdx(\"a\", {\n    href: \"https://twitter.com/troygilbert\"\n  }, mdx(\"s\", null, \"@\"), mdx(\"b\", null, \"troygilbert\")), \" \", mdx(\"a\", {\n    href: \"https://twitter.com/jhooks\"\n  }, mdx(\"s\", null, \"@\"), mdx(\"b\", null, \"jhooks\")), \" Laziness, combined with very high standards, breeds the perfect programmer.\"), \"\\u2014 Sandi Metz (@sandimetz) \", mdx(\"a\", {\n    href: \"https://twitter.com/sandimetz/status/240472922702086144\",\n    \"data-datetime\": \"2012-08-28T15:36:27+00:00\"\n  }, \"August 28, 2012\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"This\"), \" is where we want to go after grasping design patterns. It is earning a well deserved spot next to \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.amazon.com/exec/obidos/ASIN/0321503627/joehoobuiblo-20/ref=nosim/\"\n  }, \"Growing Object-Oriented Software, Guided by Tests\"), \" in my top ten list.\"), mdx(\"p\", null, \"What tops your favorites list for object-oriented patterns/practices?\"));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Practical Object Oriented Design is Excellent","date":"August 28, 2012","banner":null,"slug":null,"keywords":null}}},"pageContext":{"id":"b28faa8b-8771-5e26-8e21-ad40debf0dce","prev":{"id":"18235215-6af2-59bd-9937-823f7d7ca5a0","parent":{"name":"2012-11-17-using-custom-jasmine-matchers-to-make-unit-tests-more-readable","sourceInstanceName":"legacy"},"excerpt":"Image from purplemattfish I'm a stickler for the \"single assertion per test\" guideline. One of the pillars of good unit tests is readability. Multiple asserts undermine this principle and make tests that are more difficult to read, understand, and…","fields":{"title":"Using Custom Jasmine Matchers to Make Unit Tests More Readable","slug":"blog/2012/11/17/using-custom-jasmine-matchers-to-make-unit-tests-more-readable","date":"2012-11-17T00:00:00.000Z"}},"next":{"id":"151e5788-bf05-5309-98cb-944be474593a","parent":{"name":"2012-08-27-on-transitioning-to-javascript-from-as3-slash-flex","sourceInstanceName":"legacy"},"excerpt":"I'm currently working on a large enterprise JS application, and enjoying myself quite a bit. We've implemented standards and practices that remove most of the bad parts of JS dev. We are using straight up JS with  AngularJS . We are covering our…","fields":{"title":"On Transitioning to JavaScript From AS3/Flex","slug":"blog/2012/08/27/on-transitioning-to-javascript-from-as3-slash-flex","date":"2012-08-27T00:00:00.000Z"}}}},
    "staticQueryHashes": ["1045846374"]}