CINXE.COM
変数(variable)と値(value) - ソフトウェア設計を考える
<!DOCTYPE html> <html lang="ja" data-admin-domain="//blog.hatena.ne.jp" data-admin-origin="https://blog.hatena.ne.jp" data-author="masuda220" data-avail-langs="ja en" data-blog="masuda220.hatenablog.com" data-blog-host="masuda220.hatenablog.com" data-blog-is-public="1" data-blog-name="ソフトウェア設計を考える" data-blog-owner="masuda220" data-blog-show-ads="" data-blog-show-sleeping-ads="" data-blog-uri="https://masuda220.hatenablog.com/" data-blog-uuid="10257846132616531856" data-blogs-uri-base="https://masuda220.hatenablog.com" data-brand="pro" data-data-layer="{"hatenablog":{"admin":{},"analytics":{"brand_property_id":"","measurement_id":"","non_sampling_property_id":"","property_id":"","separated_property_id":"UA-29716941-22"},"blog":{"blog_id":"10257846132616531856","content_seems_japanese":"true","disable_ads":"pro","enable_ads":"false","enable_keyword_link":"true","entry_show_footer_related_entries":"true","force_pc_view":"false","is_public":"true","is_responsive_view":"false","is_sleeping":"false","lang":"ja","name":"\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u8a2d\u8a08\u3092\u8003\u3048\u308b","owner_name":"masuda220","uri":"https://masuda220.hatenablog.com/"},"brand":"pro","page_id":"entry","permalink_entry":{"author_name":"masuda220","categories":"","character_count":2489,"date":"2021-11-28","entry_id":"13574176438037277503","first_category":"","hour":"8","title":"\u5909\u6570(variable)\u3068\u5024(value)","uri":"https://masuda220.hatenablog.com/entry/2021/11/28/085132"},"pro":"pro","router_type":"blogs"}}" data-device="pc" data-dont-recommend-pro="false" data-global-domain="https://hatena.blog" data-globalheader-color="b" data-globalheader-type="pc" data-has-touch-view="1" data-help-url="https://help.hatenablog.com" data-page="entry" data-parts-domain="https://hatenablog-parts.com" data-plus-available="1" data-pro="true" data-router-type="blogs" data-sentry-dsn="https://03a33e4781a24cf2885099fed222b56d@sentry.io/1195218" data-sentry-environment="production" data-sentry-sample-rate="0.1" data-static-domain="https://cdn.blog.st-hatena.com" data-version="5fa31e35d1ab9280564e15ff7dbf6f" data-initial-state="{}" > <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#"> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="robots" content="max-image-preview:large" /> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=7; IE=9; IE=10; IE=11" /> <title>変数(variable)と値(value) - ソフトウェア設計を考える</title> <link rel="canonical" href="https://masuda220.hatenablog.com/entry/2021/11/28/085132"/> <meta itemprop="name" content="変数(variable)と値(value) - ソフトウェア設計を考える"/> <meta itemprop="image" content="https://cdn.image.st-hatena.com/image/scale/4edf6d3271d63932f932e1d347e758087fa3f4d5/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fm%2Fmasuda220%2F20211128%2F20211128085518.jpg"/> <meta property="og:title" content="変数(variable)と値(value) - ソフトウェア設計を考える"/> <meta property="og:type" content="article"/> <meta property="og:url" content="https://masuda220.hatenablog.com/entry/2021/11/28/085132"/> <meta property="og:image" content="https://cdn.image.st-hatena.com/image/scale/4edf6d3271d63932f932e1d347e758087fa3f4d5/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fm%2Fmasuda220%2F20211128%2F20211128085518.jpg"/> <meta property="og:image:alt" content="変数(variable)と値(value) - ソフトウェア設計を考える"/> <meta property="og:description" content="はじめてScalaに触れたとき、変数宣言(var)と値宣言(val)を使い分ける言語仕様に、なるほどなあ、と思った。簡単に言えば、変数(var)は再代入できて、値(val)は再代入できない。 プログラミングのスタイルとして、var宣言は命令的なプログラミング、val宣言は宣言的なプログラミングになる。どちらのプログラミングスタイルで書いているかを、varとvalで明示できるわけだ。 Javaだと言語の基本の仕組みはすべてが変数。final宣言をすることで再代入をコンパイルエラーにすることはできる。Javaは、C言語やC++などの命令的なプログラミングの系譜の言語なのですべて変数(variabl…" /> <meta property="og:site_name" content="ソフトウェア設計を考える"/> <meta property="article:published_time" content="2021-11-27T23:51:32Z" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:image" content="https://cdn.image.st-hatena.com/image/scale/4edf6d3271d63932f932e1d347e758087fa3f4d5/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fm%2Fmasuda220%2F20211128%2F20211128085518.jpg" /> <meta name="twitter:title" content="変数(variable)と値(value) - ソフトウェア設計を考える" /> <meta name="twitter:description" content="はじめてScalaに触れたとき、変数宣言(var)と値宣言(val)を使い分ける言語仕様に、なるほどなあ、と思った。簡単に言えば、変数(var)は再代入できて、値(val)は再代入できない。 プログラミングのスタイルとして、var宣言は命令的なプログラミング、val宣言は宣言的なプログラミングになる。どちらのプログラミ…" /> <meta name="twitter:app:name:iphone" content="はてなブログアプリ" /> <meta name="twitter:app:id:iphone" content="583299321" /> <meta name="twitter:app:url:iphone" content="hatenablog:///open?uri=https%3A%2F%2Fmasuda220.hatenablog.com%2Fentry%2F2021%2F11%2F28%2F085132" /> <meta name="twitter:site" content="@masuda220" /> <meta name="description" content="はじめてScalaに触れたとき、変数宣言(var)と値宣言(val)を使い分ける言語仕様に、なるほどなあ、と思った。簡単に言えば、変数(var)は再代入できて、値(val)は再代入できない。 プログラミングのスタイルとして、var宣言は命令的なプログラミング、val宣言は宣言的なプログラミングになる。どちらのプログラミングスタイルで書いているかを、varとvalで明示できるわけだ。 Javaだと言語の基本の仕組みはすべてが変数。final宣言をすることで再代入をコンパイルエラーにすることはできる。Javaは、C言語やC++などの命令的なプログラミングの系譜の言語なのですべて変数(variabl…" /> <meta name="keywords" content="ドメイン駆動設計 オブジェクト指向プログラミング カプセル化" /> <script id="embed-gtm-data-layer-loader" data-data-layer-page-specific="{"hatenablog":{"blogs_permalink":{"is_author_pro":"true","blog_afc_issued":"false","entry_afc_issued":"false","has_related_entries_with_elasticsearch":"true","is_blog_sleeping":"false"}}}" > (function() { function loadDataLayer(elem, attrName) { if (!elem) { return {}; } var json = elem.getAttribute(attrName); if (!json) { return {}; } return JSON.parse(json); } var globalVariables = loadDataLayer( document.documentElement, 'data-data-layer' ); var pageSpecificVariables = loadDataLayer( document.getElementById('embed-gtm-data-layer-loader'), 'data-data-layer-page-specific' ); var variables = [globalVariables, pageSpecificVariables]; if (!window.dataLayer) { window.dataLayer = []; } for (var i = 0; i < variables.length; i++) { window.dataLayer.push(variables[i]); } })(); </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-P4CXTW');</script> <!-- End Google Tag Manager --> <link rel="shortcut icon" href="https://masuda220.hatenablog.com/icon/favicon"> <link rel="apple-touch-icon" href="https://masuda220.hatenablog.com/icon/touch"> <link rel="icon" sizes="192x192" href="https://masuda220.hatenablog.com/icon/link"> <link rel="alternate" type="application/atom+xml" title="Atom" href="https://masuda220.hatenablog.com/feed"/> <link rel="alternate" type="application/rss+xml" title="RSS2.0" href="https://masuda220.hatenablog.com/rss"/> <link rel="alternate" type="application/json+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fmasuda220.hatenablog.com%2Fentry%2F2021%2F11%2F28%2F085132&format=json" title="oEmbed Profile of 変数(variable)と値(value)"/> <link rel="alternate" type="text/xml+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fmasuda220.hatenablog.com%2Fentry%2F2021%2F11%2F28%2F085132&format=xml" title="oEmbed Profile of 変数(variable)と値(value)"/> <link rel="author" href="http://www.hatena.ne.jp/masuda220/"> <link rel="stylesheet" type="text/css" href="https://cdn.blog.st-hatena.com/css/blog.css?version=5fa31e35d1ab9280564e15ff7dbf6f"/> <link rel="stylesheet" type="text/css" href="https://usercss.blog.st-hatena.com/blog_style/10257846132616531856/2efe4cb39299c62473bde483cdc580687b51bb5d"/> <script> </script> <style> div#google_afc_user, div.google-afc-user-container, div.google_afc_image, div.google_afc_blocklink { display: block !important; } </style> <script type="application/ld+json">{"@context":"http://schema.org","@type":"Article","dateModified":"2021-11-28T10:22:55+09:00","datePublished":"2021-11-28T08:51:32+09:00","headline":"変数(variable)と値(value)","image":["https://cdn-ak.f.st-hatena.com/images/fotolife/m/masuda220/20211128/20211128085518.jpg"]}</script> </head> <body class="page-entry globalheader-ng-enabled"> <div id="globalheader-container" data-brand="hatenablog" > <iframe id="globalheader" height="37" frameborder="0" allowTransparency="true"></iframe> </div> <nav class=" blog-controlls "> <div class="blog-controlls-blog-icon"> <a href="https://masuda220.hatenablog.com/"> <img src="https://cdn.blog.st-hatena.com/images/admin/blog-icon-noimage.png" alt="ソフトウェア設計を考える"/> </a> </div> <div class="blog-controlls-title"> <a href="https://masuda220.hatenablog.com/">ソフトウェア設計を考える</a> </div> <a href="https://blog.hatena.ne.jp/masuda220/masuda220.hatenablog.com/subscribe?utm_source=blogs_topright_button&utm_medium=button&utm_campaign=subscribe_blog" class="blog-controlls-subscribe-btn test-blog-header-controlls-subscribe"> 読者になる </a> </nav> <div id="container"> <div id="container-inner"> <header id="blog-title" data-brand="hatenablog"> <div id="blog-title-inner" > <div id="blog-title-content"> <h1 id="title"><a href="https://masuda220.hatenablog.com/">ソフトウェア設計を考える</a></h1> </div> </div> </header> <div id="content" class="hfeed" > <div id="content-inner"> <div id="wrapper"> <div id="main"> <div id="main-inner"> <!-- google_ad_section_start --> <!-- rakuten_ad_target_begin --> <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-2800 words-100 mode-markdown entry-odd" id="entry-13574176438037277503" data-keyword-campaign="" data-uuid="13574176438037277503" data-publication-type="entry"> <div class="entry-inner"> <header class="entry-header"> <div class="date entry-date first"> <a href="https://masuda220.hatenablog.com/archive/2021/11/28" rel="nofollow"> <time datetime="2021-11-27T23:51:32Z" title="2021-11-27T23:51:32Z"> <span class="date-year">2021</span><span class="hyphen">-</span><span class="date-month">11</span><span class="hyphen">-</span><span class="date-day">28</span> </time> </a> </div> <h1 class="entry-title"> <a href="https://masuda220.hatenablog.com/entry/2021/11/28/085132" class="entry-title-link bookmark">変数(variable)と値(value)</a> </h1> </header> <div class="entry-content hatenablog-entry"> <p>はじめて<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scala">Scala</a>に触れたとき、変数宣言(var)と値宣言(val)を使い分ける言語仕様に、なるほどなあ、と思った。簡単に言えば、変数(var)は再代入できて、値(val)は再代入できない。</p> <p>プログラミングのスタイルとして、var宣言は命令的なプログラミング、val宣言は宣言的なプログラミングになる。どちらのプログラミングスタイルで書いているかを、varとvalで明示できるわけだ。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>だと言語の基本の仕組みはすべてが変数。final宣言をすることで再代入を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>エラーにすることはできる。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%B8%C0%B8%EC">C言語</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>などの命令的なプログラミングの系譜の言語なのですべて変数(variable)というのは、とうぜんの言語仕様だった。</p> <h2>命令的なスタイルから宣言的なスタイルに</h2> <p>命令的なプログラミングでは変数(<strong>var</strong>iable)を使う。宣言的なプログラミングでは値(<strong>val</strong>ue)を使う。</p> <p>再代入可能な変数(<strong>var</strong>iable)は、プログラムの実行時の状態が基本的には<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%D4%C4%EA">不定</a>(不安定)になる。</p> <p>それに対して再代入できない値(<strong>val</strong>ue)は、プログラムの実行時の状態が仕組みとして不変になり安定する。</p> <h4>宣言的なスタイルを選ぶ</h4> <p>プログラミングのアプローチとしては、命令的なスタイルより宣言的なスタイルのほうが良い。プログラムの実行時の挙動が安定することは、良いプログラムを書くために大きなアドバンテージになる。</p> <h4>変数(<strong>var</strong>iable)と値(<strong>val</strong>ue)の使い分け</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Scala">Scala</a>やKotlinのように変数(var)と値(val)を明示的に使い分けることができる言語だと、命令的なスタイルと、宣言的なスタイルを明示的に書き分けることができる。</p> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>のfinal宣言</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>だと、final宣言を使うことで、いちおう宣言的なスタイルを表明することはできる。ただしfinal宣言した変数が参照するオブジェクトの状態が変更可能であると、簡単に命令的なプログラミングに逆戻りしてしまう。</p> <h2>実際にやってみると</h2> <p>私自身は可能な限り宣言的なスタイルでプログラミングをしたいので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scala">Scala</a>やKotlinでいろいろ書いてみた時は、変数宣言(var)はまったく使わず、値宣言(val)だけで書いた。</p> <h4>valだらけの気持ち悪さ</h4> <p>そうして書いたコードを眺めてみると、valだらけで、valという宣言がほとんど意味のないノイズに近い印象をうけた。その時思ったのは、何も宣言しなければ、デフォルトで値宣言(val)になり、どうしても変数宣言(var)にしたいところだけvarを記述する、という言語であればもっとよいのになあ、と思った。</p> <h4>final だらけの気持ち悪さ</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>の場合は、もっとひどい。言語仕様としては、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>変数・メソッドの引数・メソッドのローカル変数・クラス変数をすべてfinal宣言にできる。</p> <p>しかし、宣言的なスタイルの表明ということで徹底的にfinal宣言を書きまくると、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Scala">Scala</a>やKotlinのval宣言だらけよりも、もっと読みにくいひどいコードになる。わかりきった場所までfinalを書くことに「いったいなんの意味があるのか」と疑問に思うくらい、final宣言が邪魔に見えてくる。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>の場合、final宣言を徹底しないとfinalで宣言した参照先のオブジェクトで変数を上書きされてしまう可能性が高い。標準ライブラリで用意されているList・Set・Mapなどは、変更可能なオブジェクトなので、<code>final Map map;</code> というような宣言をしても、実質的には、宣言的なプログラミングではなく命令的なプログラミングのままになる。つまり実行時のmapの状態は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%D4%C4%EA">不定</a>(不安定)なままなのだ。</p> <p>しかし、そこまでfinal宣言を書くことは単純に面倒だし、書けば書くほどコードが読みにくくなるのが現実。</p> <h2>じゃあどうするか</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Scala">Scala</a>やKotlinだとvalだらけになるのは、言語仕様上しかたがない。ところが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>の場合は、別の選択肢がある。</p> <h4>finalを書かないという選択肢</h4> <p>それは<strong>finalを書かない</strong>という選択肢である。</p> <p>もちろん、言語仕様的にはfinal宣言をしていない以上、それは再代入可能な変数であり、見た目は命令的なプログラミングそのものである。</p> <p>ただしプログラミングの方針あるいは約束事として、宣言的に書く、変数の再代入はしない、ということを<strong>大前提</strong>として共有できていれば、ノイ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B8%A1%BC">ジー</a>で面倒くさいfinal宣言をまったく書かないことも選択できる。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Scala">Scala</a>やKotlinのように値(val)を取り入れるた言語では、宣言的に書くにはvalを書かざるを得ない。 しかし、値(val)の仕組みがない<a class="keyword" href="http://d.hatena.ne.jp/keyword/Java">Java</a>の場合、それを逆手にとって、約束として再代入不可を共有して<strong>finalは書かない</strong>というアプローチを選択できるわけだ。</p> <p>ここらへんは、ふつうのぷろぐらまのirofさんのこの記事も参考になる。</p> <p><a href="https://irof.hateblo.jp/entry/2019/09/27/233547"><strong>finalを付けるのをやめてみた(日々常々)</strong></a></p> <h4>final書かずに、宣言的なプログラミングスタイルで意思統一しよう</h4> <p>私は、finalを書いても命令的なプログラミングのままのコードをたくさん見てきた。</p> <p>final宣言の記述を強制しても、コードを書く人間の頭は命令的なプログラミングスタイルのままだということ。</p> <p>そこの発想を切り替えるには、final宣言の記述のルール化よりも、変数に再代入をしない、そうすることでプログラムの挙動が安定するし、プログラムのロジックがシンプルになる、という宣言的なプログラミングスタイルの考え方とやり方を粘り強く伝え、それを共有知にすることに時間とエネルギーを使う方が費用対効果が高いと思って、日々の開発に取り組んでいる。</p> <p>実際のところ、表面的にfinal宣言だらけで書いているチームよりも、final宣言は書かないが、変数には再代入をしないプログラミングスタイルを共有できているチームのほうが、読みやすく質の高いコードを生み出せている手ごたえがある。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/masuda220/20211128/20211128085518.jpg" alt="f:id:masuda220:20211128085518j:plain" width="1200" height="675" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p> </div> <footer class="entry-footer"> <div class="entry-tags-wrapper"> <div class="entry-tags"> </div> </div> <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{"area": "finish_reading"}"> <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="masuda220" >masuda220</span></span> <span class="entry-footer-time"><a href="https://masuda220.hatenablog.com/entry/2021/11/28/085132"><time data-relative datetime="2021-11-27T23:51:32Z" title="2021-11-27T23:51:32Z" class="updated">2021-11-28 08:51</time></a></span> <span class=" entry-footer-subscribe " data-test-blog-controlls-subscribe> <a href="https://blog.hatena.ne.jp/masuda220/masuda220.hatenablog.com/subscribe?utm_source=blogs_entry_footer&utm_medium=button&utm_campaign=subscribe_blog"> 読者になる </a> </span> </p> <div class="hatena-star-container" data-hatena-star-container data-hatena-star-url="https://masuda220.hatenablog.com/entry/2021/11/28/085132" data-hatena-star-title="変数(variable)と値(value)" data-hatena-star-variant="profile-icon" data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/" ></div> <div class="social-buttons"> <div class="social-button-item"> <a href="https://b.hatena.ne.jp/entry/s/masuda220.hatenablog.com/entry/2021/11/28/085132" class="hatena-bookmark-button" data-hatena-bookmark-url="https://masuda220.hatenablog.com/entry/2021/11/28/085132" data-hatena-bookmark-layout="vertical-balloon" data-hatena-bookmark-lang="ja" title="この記事をはてなブックマークに追加"><img src="https://b.st-hatena.com/images/entry-button/button-only.gif" alt="この記事をはてなブックマークに追加" width="20" height="20" style="border: none;" /></a> </div> <div class="social-button-item"> <div class="fb-share-button" data-layout="box_count" data-href="https://masuda220.hatenablog.com/entry/2021/11/28/085132"></div> </div> <div class="social-button-item"> <a class="entry-share-button entry-share-button-twitter test-share-button-twitter" href="https://x.com/intent/tweet?text=%E5%A4%89%E6%95%B0(variable)%E3%81%A8%E5%80%A4(value)+-+%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E8%A8%AD%E8%A8%88%E3%82%92%E8%80%83%E3%81%88%E3%82%8B&url=https%3A%2F%2Fmasuda220.hatenablog.com%2Fentry%2F2021%2F11%2F28%2F085132" title="X(Twitter)で投稿する" ></a> </div> </div> <div class="customized-footer"> <div class="entry-footer-modules" id="entry-footer-secondary-modules"> <div class="hatena-module hatena-module-related-entries" > <!-- Hatena-Epic-has-related-entries-with-elasticsearch:true --> <div class="hatena-module-title"> 関連記事 </div> <div class="hatena-module-body"> <ul class="related-entries hatena-urllist urllist-with-thumbnails"> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <a class="urllist-image-link related-entries-image-link" href="https://masuda220.hatenablog.com/entry/2023/06/12/124719"> <img alt="マネジメントの知識がドメイン駆動設計を加速する" src="https://cdn.image.st-hatena.com/image/square/84245663466f65baa407a70ca75874b69745202e/backend=imagemagick;height=100;version=1;width=100/https%3A%2F%2Fm.media-amazon.com%2Fimages%2FI%2F41vsXRQhu8L._SL500_.jpg" class="urllist-image related-entries-image" title="マネジメントの知識がドメイン駆動設計を加速する" width="100" height="100" loading="lazy"> </a> <div class="urllist-date-link related-entries-date-link"> <a href="https://masuda220.hatenablog.com/archive/2023/06/12" rel="nofollow"> <time datetime="2023-06-12T03:47:19Z" title="2023年6月12日"> 2023-06-12 </time> </a> </div> <a href="https://masuda220.hatenablog.com/entry/2023/06/12/124719" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">マネジメントの知識がドメイン駆動設計を加速する</a> <div class="urllist-entry-body related-entries-entry-body">2023年6月13日開催の設計コミュニティイベント「現場から学ぶモ…</div> </div> </li> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <a class="urllist-image-link related-entries-image-link" href="https://masuda220.hatenablog.com/entry/2021/05/07/142824"> <img alt="ドメイン駆動設計の集約のわかりにくさの原因と集約を理解するためのヒント" src="https://cdn.image.st-hatena.com/image/square/956fa5fc5b7fabbd935f9699f77d03be0319e17e/backend=imagemagick;height=100;version=1;width=100/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fm%2Fmasuda220%2F20210507%2F20210507132924.png" class="urllist-image related-entries-image" title="ドメイン駆動設計の集約のわかりにくさの原因と集約を理解するためのヒント" width="100" height="100" loading="lazy"> </a> <div class="urllist-date-link related-entries-date-link"> <a href="https://masuda220.hatenablog.com/archive/2021/05/07" rel="nofollow"> <time datetime="2021-05-07T05:28:24Z" title="2021年5月7日"> 2021-05-07 </time> </a> </div> <a href="https://masuda220.hatenablog.com/entry/2021/05/07/142824" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">ドメイン駆動設計の集約のわかりにくさの原因と集約を理解するためのヒント</a> <div class="urllist-entry-body related-entries-entry-body">『ドメイン駆動設計』のモデル要素のひとつとして「集約」があ…</div> </div> </li> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <a class="urllist-image-link related-entries-image-link" href="https://masuda220.hatenablog.com/entry/2020/01/16/131204"> <img alt="モダンなSIer開発手法 勉強会" src="https://cdn.image.st-hatena.com/image/square/9c0c72fc24cd0e2fca9bd08724fb8f7c1859bf3d/backend=imagemagick;height=100;version=1;width=100/https%3A%2F%2Fimages-fe.ssl-images-amazon.com%2Fimages%2FI%2F61XD5Of7CqL.jpg" class="urllist-image related-entries-image" title="モダンなSIer開発手法 勉強会" width="100" height="100" loading="lazy"> </a> <div class="urllist-date-link related-entries-date-link"> <a href="https://masuda220.hatenablog.com/archive/2020/01/16" rel="nofollow"> <time datetime="2020-01-16T04:12:04Z" title="2020年1月16日"> 2020-01-16 </time> </a> </div> <a href="https://masuda220.hatenablog.com/entry/2020/01/16/131204" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">モダンなSIer開発手法 勉強会</a> <div class="urllist-entry-body related-entries-entry-body">昨日、株式会社ディマージシェアさん主催の モダンなSIer開発手…</div> </div> </li> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <div class="urllist-date-link related-entries-date-link"> <a href="https://masuda220.hatenablog.com/archive/2019/09/07" rel="nofollow"> <time datetime="2019-09-07T02:22:57Z" title="2019年9月7日"> 2019-09-07 </time> </a> </div> <a href="https://masuda220.hatenablog.com/entry/2019/09/07/112257" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">オブジェクト指向プログラミングを学ぶための推薦図書</a> <div class="urllist-entry-body related-entries-entry-body">オブジェクト指向プログラミングを学ぶ オブジェクト指向プログ…</div> </div> </li> <li class="urllist-item related-entries-item"> <div class="urllist-item-inner related-entries-item-inner"> <div class="urllist-date-link related-entries-date-link"> <a href="https://masuda220.hatenablog.com/archive/2019/03/04" rel="nofollow"> <time datetime="2019-03-04T05:41:54Z" title="2019年3月4日"> 2019-03-04 </time> </a> </div> <a href="https://masuda220.hatenablog.com/entry/2019/03/04/144154" class="urllist-title-link related-entries-title-link urllist-title related-entries-title">ドメイン駆動設計を理解する3つのキーワード</a> <div class="urllist-entry-body related-entries-entry-body">ドメイン駆動設計を理解するための三つのキーワードの紹介。 ビ…</div> </div> </li> </ul> </div> </div> </div> </div> <div class="comment-box js-comment-box"> <ul class="comment js-comment"> <li class="read-more-comments" style="display: none;"><a>もっと読む</a></li> </ul> <a class="leave-comment-title js-leave-comment-title">コメントを書く</a> </div> </footer> </div> </article> <!-- rakuten_ad_target_end --> <!-- google_ad_section_end --> <div class="pager pager-permalink permalink"> <span class="pager-prev"> <a href="https://masuda220.hatenablog.com/entry/2022/10/22/165921" rel="prev"> <span class="pager-arrow">« </span> 本の紹介『読みやすいコードのガイドライ… </a> </span> <span class="pager-next"> <a href="https://masuda220.hatenablog.com/entry/2021/11/02/095605" rel="next"> ドメイン駆動設計というソフトウェア開発… <span class="pager-arrow"> »</span> </a> </span> </div> </div> </div> <aside id="box1"> <div id="box1-inner"> </div> </aside> </div><!-- #wrapper --> <aside id="box2"> <div id="box2-inner"> <div class="hatena-module hatena-module-profile"> <div class="hatena-module-title"> プロフィール </div> <div class="hatena-module-body"> <a href="https://masuda220.hatenablog.com/about" class="profile-icon-link"> <img src="https://cdn.profile-image.st-hatena.com/users/masuda220/profile.png" alt="id:masuda220" class="profile-icon" /> </a> <span class="id"> <a href="https://masuda220.hatenablog.com/about" class="hatena-id-link"><span data-load-nickname="1" data-user-name="masuda220">id:masuda220</span></a> <a href="https://blog.hatena.ne.jp/-/pro?plus_via=blog_plus_badge&utm_source=pro_badge&utm_medium=referral&utm_campaign=register_pro" title="はてなブログPro"><i class="badge-type-pro">はてなブログPro</i></a> </span> <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box" > <a href="#" class="hatena-follow-button js-hatena-follow-button"> <span class="subscribing"> <span class="foreground">読者です</span> <span class="background">読者をやめる</span> </span> <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once> <span class="foreground">読者になる</span> <span class="background">読者になる</span> </span> </a> <div class="subscription-count-box js-subscription-count-box"> <i></i> <u></u> <span class="subscription-count js-subscription-count"> </span> </div> </div> <div class="profile-about"> <a href="https://masuda220.hatenablog.com/about">このブログについて</a> </div> </div> </div> <div class="hatena-module hatena-module-search-box"> <div class="hatena-module-title"> 検索 </div> <div class="hatena-module-body"> <form class="search-form" role="search" action="https://masuda220.hatenablog.com/search" method="get"> <input type="text" name="q" class="search-module-input" value="" placeholder="記事を検索" required> <input type="submit" value="検索" class="search-module-button" /> </form> </div> </div> <div class="hatena-module hatena-module-links"> <div class="hatena-module-title"> リンク </div> <div class="hatena-module-body"> <ul class="hatena-urllist"> <li> <a href="https://hatena.blog/">はてなブログ</a> </li> <li> <a href="https://hatena.blog/guide?via=200109">ブログをはじめる</a> </li> <li> <a href="http://blog.hatenablog.com">週刊はてなブログ</a> </li> <li> <a href="https://hatena.blog/guide/pro">はてなブログPro</a> </li> </ul> </div> </div> <div class="hatena-module hatena-module-recent-entries "> <div class="hatena-module-title"> <a href="https://masuda220.hatenablog.com/archive"> 最新記事 </a> </div> <div class="hatena-module-body"> <ul class="recent-entries hatena-urllist "> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://masuda220.hatenablog.com/entry/2025/02/09/130120" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">システムを捉える5つの視点</a> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://masuda220.hatenablog.com/entry/2023/06/12/124719" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">マネジメントの知識がドメイン駆動設計を加速する</a> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://masuda220.hatenablog.com/entry/2023/05/24/105949" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">『ドメイン駆動設計』の5つの基本アイデア</a> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://masuda220.hatenablog.com/entry/2023/01/18/132316" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">『ドメイン駆動設計』の解説記事を書きました</a> </div> </li> <li class="urllist-item recent-entries-item"> <div class="urllist-item-inner recent-entries-item-inner"> <a href="https://masuda220.hatenablog.com/entry/2022/10/22/165921" class="urllist-title-link recent-entries-title-link urllist-title recent-entries-title">本の紹介『読みやすいコードのガイドライン』</a> </div> </li> </ul> </div> </div> <div class="hatena-module hatena-module-archive" data-archive-type="default" data-archive-url="https://masuda220.hatenablog.com/archive"> <div class="hatena-module-title"> <a href="https://masuda220.hatenablog.com/archive">月別アーカイブ</a> </div> <div class="hatena-module-body"> <ul class="hatena-urllist"> <li class="archive-module-year archive-module-year-hidden" data-year="2025"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://masuda220.hatenablog.com/archive/2025" class="archive-module-year-title archive-module-year-2025"> 2025 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2025/02" class="archive-module-month-title archive-module-month-2025-2"> 2025 / 2 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2023"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://masuda220.hatenablog.com/archive/2023" class="archive-module-year-title archive-module-year-2023"> 2023 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2023/06" class="archive-module-month-title archive-module-month-2023-6"> 2023 / 6 </a> </li> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2023/05" class="archive-module-month-title archive-module-month-2023-5"> 2023 / 5 </a> </li> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2023/01" class="archive-module-month-title archive-module-month-2023-1"> 2023 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2022"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://masuda220.hatenablog.com/archive/2022" class="archive-module-year-title archive-module-year-2022"> 2022 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2022/10" class="archive-module-month-title archive-module-month-2022-10"> 2022 / 10 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2021"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://masuda220.hatenablog.com/archive/2021" class="archive-module-year-title archive-module-year-2021"> 2021 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2021/11" class="archive-module-month-title archive-module-month-2021-11"> 2021 / 11 </a> </li> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2021/05" class="archive-module-month-title archive-module-month-2021-5"> 2021 / 5 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2020"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://masuda220.hatenablog.com/archive/2020" class="archive-module-year-title archive-module-year-2020"> 2020 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2020/06" class="archive-module-month-title archive-module-month-2020-6"> 2020 / 6 </a> </li> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2020/05" class="archive-module-month-title archive-module-month-2020-5"> 2020 / 5 </a> </li> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2020/04" class="archive-module-month-title archive-module-month-2020-4"> 2020 / 4 </a> </li> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2020/01" class="archive-module-month-title archive-module-month-2020-1"> 2020 / 1 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2019"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://masuda220.hatenablog.com/archive/2019" class="archive-module-year-title archive-module-year-2019"> 2019 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2019/09" class="archive-module-month-title archive-module-month-2019-9"> 2019 / 9 </a> </li> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2019/03" class="archive-module-month-title archive-module-month-2019-3"> 2019 / 3 </a> </li> </ul> </li> <li class="archive-module-year archive-module-year-hidden" data-year="2018"> <div class="archive-module-button"> <span class="archive-module-hide-button">▼</span> <span class="archive-module-show-button">▶</span> </div> <a href="https://masuda220.hatenablog.com/archive/2018" class="archive-module-year-title archive-module-year-2018"> 2018 </a> <ul class="archive-module-months"> <li class="archive-module-month"> <a href="https://masuda220.hatenablog.com/archive/2018/10" class="archive-module-month-title archive-module-month-2018-10"> 2018 / 10 </a> </li> </ul> </li> </ul> </div> </div> </div> </aside> </div> </div> </div> </div> <footer id="footer" data-brand="hatenablog"> <div id="footer-inner"> <div style="display:none !important" class="guest-footer js-guide-register test-blogs-register-guide" data-action="guide-register"> <div class="guest-footer-content"> <h3>はてなブログをはじめよう!</h3> <p>masuda220さんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?</p> <div class="guest-footer-btn-container"> <div class="guest-footer-btn"> <a class="btn btn-register js-inherit-ga" href="https://blog.hatena.ne.jp/register?via=200227" target="_blank">はてなブログをはじめる(無料)</a> </div> <div class="guest-footer-btn"> <a href="https://hatena.blog/guide" target="_blank">はてなブログとは</a> </div> </div> </div> </div> <address class="footer-address"> <a href="https://masuda220.hatenablog.com/"> <img src="https://cdn.blog.st-hatena.com/images/admin/blog-icon-noimage.png" width="16" height="16" alt="ソフトウェア設計を考える"/> <span class="footer-address-name">ソフトウェア設計を考える</span> </a> </address> <p class="services"> Powered by <a href="https://hatena.blog/">Hatena Blog</a> | <a href="https://blog.hatena.ne.jp/-/abuse_report?target_url=https%3A%2F%2Fmasuda220.hatenablog.com%2Fentry%2F2021%2F11%2F28%2F085132" class="report-abuse-link test-report-abuse-link" target="_blank">ブログを報告する</a> </p> </div> </footer> <script async src="https://s.hatena.ne.jp/js/widget/star.js"></script> <script> if (typeof window.Hatena === 'undefined') { window.Hatena = {}; } if (!Hatena.hasOwnProperty('Star')) { Hatena.Star = { VERSION: 2, }; } </script> <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&appId=719729204785177&version=v17.0"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> <div class="quote-box"> <div class="tooltip-quote tooltip-quote-stock"> <i class="blogicon-quote" title="引用をストック"></i> </div> <div class="tooltip-quote tooltip-quote-tweet js-tooltip-quote-tweet"> <a class="js-tweet-quote" target="_blank" data-track-name="quote-tweet" data-track-once> <img src="https://cdn.blog.st-hatena.com/images/admin/quote/quote-x-icon.svg?version=5fa31e35d1ab9280564e15ff7dbf6f" title="引用して投稿する" > </a> </div> </div> <div class="quote-stock-panel" id="quote-stock-message-box" style="position: absolute; z-index: 3000"> <div class="message-box" id="quote-stock-succeeded-message" style="display: none"> <p>引用をストックしました</p> <button class="btn btn-primary" id="quote-stock-show-editor-button" data-track-name="curation-quote-edit-button">ストック一覧を見る</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="message-box" id="quote-login-required-message" style="display: none"> <p>引用するにはまずログインしてください</p> <button class="btn btn-primary" id="quote-login-button">ログイン</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="quote-stock-failed-message" style="display: none"> <p>引用をストックできませんでした。再度お試しください</p> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="unstockable-quote-message-box" style="display: none; position: absolute; z-index: 3000;"> <p>限定公開記事のため引用できません。</p> </div> </div> <script type="x-underscore-template" id="js-requote-button-template"> <div class="requote-button js-requote-button"> <button class="requote-button-btn tipsy-top" title="引用する"><i class="blogicon-quote"></i></button> </div> </script> <div id="hidden-subscribe-button" style="display: none;"> <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box" > <a href="#" class="hatena-follow-button js-hatena-follow-button"> <span class="subscribing"> <span class="foreground">読者です</span> <span class="background">読者をやめる</span> </span> <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once> <span class="foreground">読者になる</span> <span class="background">読者になる</span> </span> </a> <div class="subscription-count-box js-subscription-count-box"> <i></i> <u></u> <span class="subscription-count js-subscription-count"> </span> </div> </div> </div> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <script src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> <script type="text/javascript" src="https://cdn.blog.st-hatena.com/js/external/jquery.min.js?v=1.12.4&version=5fa31e35d1ab9280564e15ff7dbf6f"></script> <script src="https://cdn.blog.st-hatena.com/js/texts-ja.js?version=5fa31e35d1ab9280564e15ff7dbf6f"></script> <script id="vendors-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/vendors.js?version=5fa31e35d1ab9280564e15ff7dbf6f" crossorigin="anonymous"></script> <script id="hatenablog-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/hatenablog.js?version=5fa31e35d1ab9280564e15ff7dbf6f" crossorigin="anonymous" data-page-id="entry"></script> <script>Hatena.Diary.GlobalHeader.init()</script> </body> </html>