{
    "componentChunkName": "component---src-templates-blog-post-tsx",
    "path": "/2020/02/17/",
    "result": {"data":{"site":{"siteMetadata":{"title":"otegal.dev"}},"markdownRemark":{"id":"afc1c6f1-ce2c-50a8-a994-a1677286622c","excerpt":"なにこれ の自分用まとめ 値オブジェクトとは？ ドメインオブジェクトの1種。\nシステム固有の値を表現するためのオブジェクト。 例えば商品番号をみたいに表現する場合、普通にプログラミングするとstring…","html":"<h1>なにこれ</h1>\n<p><code class=\"language-text\">ドメイン駆動設計入門</code>の自分用まとめ</p>\n<h1>値オブジェクトとは？</h1>\n<p>ドメインオブジェクトの1種。\nシステム固有の値を表現するためのオブジェクト。</p>\n<p>例えば商品番号を<code class=\"language-text\">S-123456-1</code>みたいに表現する場合、普通にプログラミングするとstringとして定義する。<br>\nしかし、<code class=\"language-text\">S</code>, <code class=\"language-text\">123456</code>, <code class=\"language-text\">1</code>のそれぞれの意味はコードでは表現されず、この番号の意味を理解するのに有識者にヒアリングするしか無い。<br>\nまた、<code class=\"language-text\">S-1-1</code>みたいに真ん中の数値は桁の増減をしても良いのか分からない。</p>\n<p>そういったドメイン知識（自分的には業務知識と置き換える）をコードで表現するもの。<br>\nガバガバだけど以下みたいなクラスを作ると商品番号の各数字の意味がわかるよってはなし。</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token php language-php\"><span class=\"token delimiter important\">&lt;?php</span>\n<span class=\"token keyword\">declare</span><span class=\"token punctuation\">(</span>strict_types<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name-definition class-name\">ItemCode</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token variable\">$productType</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token variable\">$branch</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token variable\">$lot</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token function\">__constructor</span><span class=\"token punctuation\">(</span><span class=\"token keyword type-hint\">string</span> <span class=\"token variable\">$productType</span><span class=\"token punctuation\">,</span> <span class=\"token keyword type-hint\">string</span> <span class=\"token variable\">$branch</span><span class=\"token punctuation\">,</span> <span class=\"token keyword type-hint\">string</span> <span class=\"token variable\">$lot</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token function\">in_array</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$productType</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string single-quoted-string\">'S'</span><span class=\"token punctuation\">,</span> <span class=\"token string single-quoted-string\">'O'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Exception</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'不正なproductTypeです'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span><span class=\"token variable\">$branch</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Exception</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'branchの桁数が不正です'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword type-casting\">int</span><span class=\"token punctuation\">)</span><span class=\"token variable\">$lot</span> <span class=\"token operator\">&lt;</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Exception</span><span class=\"token punctuation\">(</span><span class=\"token string single-quoted-string\">'lotは1以上を登録する必要があります'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">productType</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$productType</span><span class=\"token punctuation\">,</span>\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">branch</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$branch</span><span class=\"token punctuation\">,</span>\n        <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">lot</span> <span class=\"token operator\">=</span> <span class=\"token variable\">$lot</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function-definition function\">getItemCode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">productType</span> <span class=\"token operator\">.</span> <span class=\"token string single-quoted-string\">'-'</span> <span class=\"token operator\">.</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">branch</span> <span class=\"token operator\">.</span> <span class=\"token string single-quoted-string\">'-'</span> <span class=\"token operator\">.</span> <span class=\"token variable\">$this</span><span class=\"token operator\">-></span><span class=\"token property\">lot</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></span></code></pre></div>\n<p>これいいっすね。\n本では以下にメリット有りとのことです。</p>\n<ul>\n<li>表現力が増す</li>\n<li>不正な値を存在させない</li>\n<li>誤った代入を防ぐ</li>\n<li>ロジックの散在を防ぐ</li>\n</ul>\n<p>ロジックの散在を防ぐについては補足する。<br>\nこのクラスを使えばItemCodeの値のチェックが行われるから、insertもupdateも一貫した値のチェックが出来て、呼び出し元で値のチェックを行う必要がなくなる。<br>\nよってロジックの散在を防ぐことが出来る。</p>\n<p>思い当たる大規模リファクタリングを行った記憶があるから身に染みる、、、</p>\n<h1>まとめ</h1>\n<p>値オブジェクトについては分かりやすかった。<br>\n固有の値を扱う暗黙のルールで運用している箇所は、これを導入すると新規参入のエンジニアのキャッチアップが早くなりそうですね。</p>","frontmatter":{"title":"値オブジェクトについて","tags":["読書感想","DDD"],"date":"2020-02-17","description":null}}},"pageContext":{"id":"afc1c6f1-ce2c-50a8-a994-a1677286622c","previousPostId":"ce6a5f4a-2da7-51c0-b0d0-b19cea9d9ed0","nextPostId":"c7e729d6-643d-5fe5-b616-2a0dabd81ed9"}},
    "staticQueryHashes": ["2841359383"]}