{"componentChunkName":"component---node-modules-gatsby-theme-medium-to-own-blog-src-templates-blog-post-js","path":"/4-things-about-domain-objects/","result":{"data":{"site":{"siteMetadata":{"siteUrl":"https://javame.netlify.app","githubUrl":"https://github.com/aterreno/blog"}},"mdx":{"fields":{"slug":"/4-things-about-domain-objects/"},"excerpt":"First , please do not mock a domain object.  Stub  it. Thanks. Second , do not write an interface for it. Neither if you want a Null Object…","timeToRead":1,"frontmatter":{"title":"4 things about domain objects","description":"","categories":[],"date":"June 13, 2007","canonical_link":"https://javame.netlify.app//4-things-about-domain-objects-f869df13442f"},"body":"function _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  \"title\": \"4 things about domain objects\",\n  \"description\": \"\",\n  \"date\": \"2007-06-13T00:00:00.000Z\",\n  \"categories\": [],\n  \"published\": true,\n  \"canonical_link\": \"https://javame.netlify.app//4-things-about-domain-objects-f869df13442f\",\n  \"redirect_from\": [\"/4-things-about-domain-objects-f869df13442f\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"First\"), \", please do not mock a domain object. \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.martinfowler.com/articles/mocksArentStubs.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"Stub\"), \" it. Thanks.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Second\"), \", do not write an interface for it. Neither if you want a Null Object implementation.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Third\"), \" do not be obsessed with Null Objects, sometimes they are good, not always. If you end with a\"), mdx(\"p\", null, \"if objectInstanceType == ObjectType.NULL in your code perhaps something is wrong in your design, a null object is to avoid that stuff and to give a \\u201Cnull behaviour\\u201D.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Forth\"), \". Do not use the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.martinfowler.com/eaaCatalog/activeRecord.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"ActiveRecord\"), \" pattern, seriously, you\\u2019re gonna couple the infrastructure layer with the domain layer. It\\u2019s not a pattern IMHO, kind of antiproton, try considering a \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.martinfowler.com/eaaCatalog/repository.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"repository\"), \".\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Fifth\"), \". For the point one maybe you will like a \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"http://www.martinfowler.com/bliki/ExpressionBuilder.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"nofollow noopener noreferrer\"\n  }), \"builder\"), \" pattern in order to stub objects. Here an example:  \"), mdx(\"p\", null, \"class PersonBuilder\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"{\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"private string name = \\u201Ctestname\\u201D;\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"private int age;\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"public PersonBuilder Name(string value)\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"{\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"name = value;\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"return this;\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"}\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"}\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"public PersonBuilder Age(int value)\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"{\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"age = value;\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"return this;\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"}\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"public Person ToPerson()\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"{\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"return new Person(name, age);\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"}  \"), mdx(\"p\", null, \"Syntax then is nice, I really like it.\"), mdx(\"p\", null, \"Person expected = new PersonBuilder().Age(29).Name(\\u201Cantonio\\u201D).ToPerson();\"), mdx(\"p\", null, \"and it encourages to write not mutable object like this Person:  \"), mdx(\"p\", null, \"class Person\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"{\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"private readonly int age;\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"private readonly string name;\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"public Person(string name, int age){\\xE2\\u20AC\\xA6}\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"public int age\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"{\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"get { return age; }\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"}\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"}\"), mdx(\"p\", null, \"Looks like I\\u2019ve lost my code formatter\\u2026\\xA0:-(\"));\n}\n;\nMDXContent.isMDXComponent = true;"},"allWebMentionEntry":{"nodes":[]}},"pageContext":{"id":"1349dec8-a272-57b9-88ae-2c9b325bcf19","previous":{"id":"a543c92f-e84d-53aa-ab2c-54326d66c378","fields":{"slug":"/net-infected/","published":true},"frontmatter":{"redirect_from":["/net-infected-9be634a85dcc"],"redirect_to":null,"title":".net infected"}},"next":{"id":"2dc615b6-a414-5214-b813-adae6f591947","fields":{"slug":"/iphone-to-support-third-party-web-20-applications/","published":true},"frontmatter":{"redirect_from":["/iphone-to-support-third-party-web-2-0-applications-29b27c939675"],"redirect_to":null,"title":"iPhone to Support Third-Party Web 2.0 Applications"}},"permalink":"https://javame.netlify.app/4-things-about-domain-objects/","themeOptions":{"plugins":[],"config":{"title":"Antonio Terreno","description":"Antonio Terreno's blog archive","shortBio":"","bio":"Principal Consultant at Equal Experts","author":"Antonio Terreno","githubUrl":"https://github.com/aterreno/blog","siteUrl":"https://javame.netlify.app/","social":{"twitter":"javame","medium":"","facebook":"","github":"aterreno","linkedin":"antonioterreno","instagram":"tritonitri"},"goatCounterCode":null}}}},"staticQueryHashes":["4131332129","645483741"]}