PROMARI JOURNAL

SRP――一つの共有先の定義は、一つの理由で変わるか

作成: / 公開: / 内容更新:

執筆:tamito0201 / 掲載・運営:プロマリ

丸い共有ボタンの裏側を掘る連載の第4回。SOLID の最初の原則 SRP を、共有先の名札カード1枚からプラグイン全体まで当てて確かめます。責任とは仕事の数ではなく、変更を頼んでくる人の数。Martin の車の修理のたとえから、実際の変更履歴を数える宿題まで、図22点で読み解きます。

PASS IT ON

ひとつの発見を、次の会話へ。

分けすぎると、1つの依頼が散らばる

ここまで読むと、「では、もっと細かく分けたほうが良いのでは」と思うかもしれません。名札カードの項目を、URL・表示名・色・アイコンと、1項目1ファイルに分けてみたらどうなるでしょうか。SRPの問いは、分けすぎの側にも答えを持っています。

図5-1 分けすぎると、1つの依頼が散らばる
図5-1 分けすぎると、1つの依頼が散らばる。説明例(選ばなかった形)。同じ依頼主の変更が何枚にも散らばるなら、分けすぎです。分ける線は依頼主の境目に引きます。図5-1 分けすぎると、1つの依頼が散らばる。説明例(選ばなかった形)。同じ依頼主の変更が何枚にも散らばるなら、分けすぎです。分ける線は依頼主の境目に引きます。

X がロゴと色を変えたとします。項目ごとに分けた形では、x-color.toml と x-icon.toml の2枚を開くことになります。依頼主は X の1人なのに、変更はファイルをまたいで散らばります。この状態は散弾銃手術と呼ばれ、先ほどの発散的変更と対になる言葉です。今の形なら、x.toml を1枚開けば済みます。分ける線は、細かさではなく、依頼主の境目に引くのが SRP の答えです。

散らばることの困りごとは、開くファイルが増えることだけではありません。ロゴを変えて色を変え忘れる、という「一緒に変えるはずだったものの片方だけが変わる」事故が起きやすくなります。引っ越しの住所変更で、銀行には届けたのに携帯電話の会社には届け忘れた、という状態です。1か所にまとまっていれば、関連する項目を一緒に確認しやすくなります。

分ける細かさには、ちょうどよい目盛りがある

発散的変更と散弾銃手術は、同じ物差しの両端にあります。まとめすぎると別々の依頼がぶつかり、分けすぎると1つの依頼が散らばります。

図5.1-1 分ける細かさの物差し
図5.1-1 分ける細かさの物差し。考え方。細かければ良いわけでも、まとめれば良いわけでもありません。目盛りは依頼主の境目に合わせます。図5.1-1 分ける細かさの物差し。考え方。細かければ良いわけでも、まとめれば良いわけでもありません。目盛りは依頼主の境目に合わせます。

物差しの目盛りを「細かいほど良い」「まとめるほど良い」のどちらかに合わせるのではなく、依頼主の境目に合わせます。このプラグインでは、それが「共有先ごとに1枚」でした。1つの SNS の決まりは1枚にまとまり、別の SNS とは別の紙に分かれます。細かさの正解は、ファイルの行数からではなく、依頼主の数から決まるのです。

依頼主は、変わる時期で見分ける

とはいえ、実際のファイルを前にして「これは別の依頼主か」を見分けるのは、慣れないうちは難しいものです。手がかりになるのが、変わる時期です。

図5.2-1 依頼主は、変わる時期で見分ける
図5.2-1 依頼主は、変わる時期で見分ける。説明例。変わる時期がそろわないものは、別の依頼主です。同じ時期に一緒に変わるものは、同じ場所に置きます。図5.2-1 依頼主は、変わる時期で見分ける。説明例。変わる時期がそろわないものは、別の依頼主です。同じ時期に一緒に変わるものは、同じ場所に置きます。

SNS各社の変更は、各社の都合でやって来ます。サイトの運営者の変更は、キャンペーンやデザインの見直しに合わせてやって来ます。ブラウザと標準の変更は、ブラウザの更新に合わせて、保守する開発者の変更は、開発の予定に合わせてやって来ます。変わる時期がそろわないものは、別の依頼主を探す候補になります。逆に、いつも同じ時期に一緒に変わるものは、同じ依頼主の持ち物だと考えて、同じ場所に置きます。

変わった時期は、変更の履歴から読み取れます。git log に日付を出す指定を付けて、ファイルごとに並べてみると、「このファイルとこのファイルは、いつも同じ日に変わっている」「このファイルだけは、ほかと関係のない日に変わっている」といった傾向が見えてきます。いつも同じ日に変わる2つのファイルは、同じ依頼主の持ち物が分かれて置かれているのかもしれません。ほかと関係のない日に変わるファイルには、別の依頼主がいるのかもしれません。

ただし、日付は依頼主を断定する証拠にはなりません。年末の一括整形、依存ライブラリの更新、複数の機能をまとめたコミットでも、多くのファイルが同じ日に変わります。反対に、一つの仕様変更を数日に分けて実装することもあります。同じ日に変わったという印は、理由を読みに行くための手がかりです。

履歴から候補が見つかったら、コミット本文や関連Issueで、何を実現したかったかを確かめます。「この二つはいつも一緒だ」と気づいたあとに、「なぜ一緒だったのか」を一文で説明できるかを見ます。その一文が書けなければ、まだ分け方を決めず、調べる候補として置いておけます。日付の相関だけでファイルを移動するより、判断を急がないほうが確実です。

プラグイン全体にも、依頼主の境目がある

ここまでは名札カードと設定ファイルを数えてきました。同じ問いは、プラグインのコード全体にも当てられます。ブラウザで動く部分(web/src)は、仕事の種類ごとにフォルダが分かれています。それぞれのフォルダに、誰が変更を頼んでくるかを並べてみました。

図5.3-1 プラグイン全体にも、依頼主の境目がある
図5.3-1 プラグイン全体にも、依頼主の境目がある。考え方の整理(割り当ては見立て)。フォルダの境目は、おおむね依頼主の境目に沿っています。1つのフォルダに複数の依頼主が来るなら、そこが次に分ける候補です。図5.3-1 プラグイン全体にも、依頼主の境目がある。考え方の整理(割り当ては見立て)。フォルダの境目は、おおむね依頼主の境目に沿っています。1つのフォルダに複数の依頼主が来るなら、そこが次に分ける候補です。

domain には共有URLの決まりがあり、変わるきっかけは SNS 各社です。application には並び・言い回し・色の上書きのような、サイトの判断を形にするコードがあります。infrastructure はブラウザのコピーや共有画面を呼び出す部分で、ブラウザと標準が変わったときに直します。presentation はボタンの見た目、composition は部品の組み立て、generated は生成器が作るファイルです。

フォルダの境目は、おおむね依頼主の境目に沿っています。ここで「おおむね」と書いたのは、application と presentation の2つに、どちらもサイトの運営者の依頼が届くからです。ただ、application は「何を出すか」、presentation は「どう見せるか」と、同じ依頼主の中でも仕事の種類で分かれています。4ページ目で見た「データは依頼主で、コードは仕事の種類で」が、ここでも同じ形で出ています。1つのフォルダに、仕事の種類の違う複数の依頼主が来るようになったら、そこが次に分ける候補です。

SRPを確かめる4つの問い

ここまでの話を、ファイルを見るときの問いにまとめておきます。同じ4つの問いで、今の x.toml と、3ページ目で考えた「並び順入り」の x.toml を採点してみました。

図5.4-1 SRPを確かめる4つの問い
図5.4-1 SRPを確かめる4つの問い。確かめ方の提案。4つとも「はい」なら、そのファイルの境目は依頼主の境目と重なっています。図5.4-1 SRPを確かめる4つの問い。確かめ方の提案。4つとも「はい」なら、そのファイルの境目は依頼主の境目と重なっています。

このファイルに変更を頼むのは誰か。その人の変更は、このファイルだけで済むか。別の依頼主の変更で、ここを開くことはないか。中身は同じ時期に、同じ理由で変わるか。4つとも「はい」なら、ファイルの境目は依頼主の境目と重なっています。並び順入りの形は、2つ目の問いにしか「はい」と答えられません。

四つの問いも、設計の合否を自動で決める採点機ではありません。「はい」が並んだら、現在想定している変更に対して、境目の説明ができたということです。まだ来ていない依頼や、組織の役割の変化まで証明したわけではありません。図の印の横に、そう答えた具体的な変更を一つずつ添えると、あとで判断をやり直せます。

「別の依頼主はいない」と断言しにくいときは、その迷いも役立ちます。たとえばロゴの既定色はSNSの都合、読みやすくする色の上書きはサイトの都合、と言い直せば、同じ色という項目の中にも境目が見つかります。原則の名前を知っているかより、迷った例をどこへ置くかを話せることのほうが、実際のレビューでは役に立ちます。

COMMENTS
コメント…

このページ(5ページ目)の感想・質問・設計へのコメント

PASS IT ON

この気づきを、誰かにも。

この記事を書いた人

Takaomi Murasaki

Promari SNS Shareの開発を通して、Webの仕組みや設計の選び方を紹介しています。動く実装と、その判断に至るまでを記事に残しています。

公開記事 11 件

プロフィールを見る
THANK YOU FOR READING.すべての記事へ ↗

FROM INSIGHT TO IMPACT

「できたらいいな」を、
動く仕組みに。

記事で見つけたヒントを、あなたの事業へ。
新しいサービスも、手間のかかる業務も。
いまの課題から、つくるべきものを一緒に考えます。

開発・AI・研修の実績を見る

まだ、仕様書はいりません。

「何から始める?」から、ご一緒に。

課題がまとまっていなくても大丈夫。テーマを選ぶと相談文をご用意します。
連絡先の必須入力は、お名前とメールアドレスだけ。

まずは課題の整理から相談する

ご相談後の流れ

  1. 01 内容を確認
  2. 02 メールでご連絡
  3. 03 課題・進め方をご相談
送信だけで契約やお申込みが確定することはありません。