学ぶ、考える、書き出す。

学習し、自分なりに噛み砕いて、書き出すブログ。

Atomic Designを実案件に導入して運用してみた結果はどうなのか

かつてAtomic Design の考え方と利点・欠点という記事を書きました。
この記事内で日本ではAbemaTVで使われていると書きました。そして今でも AbemaTV では Atomic Design の考えに基づいてコンポーネントが作られています。

AbemaTV での経験を通じて、Web アプリケーションのクライアントサイドの開発者という立場から Atomic Design はどうなのかについて書いていきます。

なお AbemaTV ではビューライブラリとして React を使っているので、React 前提の話になります。

Atomic Design に基づくのは実際どうなのか

基本的には良いです。良い点について書いていたらAtomic Design を実案件に導入 - UI コンポーネントの粒度を明確化した結果と副産物 | ygoto3.comAtomic Design powered by React @ AbemaTVに書いてある内容と似てきたので、良い点についてはこれらの資料を見てください。

ただし問題点もあります。いま思いつく限りでは大きく 2 つ問題があると考えています。

人によってコンポーネントの粒度が違う

Atomic Design において atoms はそれ単体で使うことはなく moleculesorganisms 内に取り込まれた状態で使われます。

また molecules にあたるコンポーネントは単一責任の原則に基づくのが良いとされています。

しかしコンポーネントによっては props が多すぎるものもあります。特に molecules の一部コンポーネントは props が 22 個あります。
実際に該当のコンポーネントは挙動を変更する理由がいくつかある状態です。

この場合は責務ごとにコンポーネントを分割すればよかったのかもしれません。
もしくはHigher-Order Components - Reactを取り入れても良いかもしれません。

デザイナーとデベロッパーのコンポーネントの粒度も違う

今だとデザイナーが Sketch の Symbol 上に構築したコンポーネントの粒度とデベロッパーが実装したコンポーネントの粒度が違うものもあります。

デザイナーとデベロッパーのどちらかの考えに粒度を合わせるのが良いでしょう。
この場合、基本的にはデザイナーの考えに合わせたほうが良いと思います。
morishitter の CSS の書き方(2016 年夏) - morishitter blogにもある「デザインの意図を正確に理解した上で書かれた CSS は破綻しない」です。

とはいえ、自分もあまり余裕がなかったため「なぜこのデザインなのか」をあまり聞けていません(Slack 上でどのデザインにするかやりとりしているときに「これが良いですねー」とか反応するくらい)。

Pattern Lab のデモに作りたいコンポーネントのカテゴリーがあったらお互いそれに沿うようにするのもいいでしょう。
たとえば blocks だったら moleculessections だったら organisms という感じです。

コンポーネントのテストが面倒

コンポーネントのテストを書く場合は enzyme を使って find() などを用いて要素があるかを探し、表示されている文字が期待のものと合致しているかなどをテストすると思います。

この場合テストとは直接的に関係ないコードがテストコード内に存在することになります。
テストを書くときに Virtual DOM 内をいちいち探索しないといけなくなるため、そこまでテストコードが書かれていないコンポーネントが増えることにもなります。
また各コンポーネントがどのような props を持っているか調べないといけないため特に organisms にあたるコンポーネントのテストは面倒になるでしょう。

そのため Jest のSnapshot Testingのように、スナップショットとなるコードを書いてテストコード側でそれと合致するか確かめるようにする流れができつつあります。


この記事はAbemaTV Advent Calendar 2017の 17 日目の記事でした。
AbemaTV ではAtomic Design のよりよい運用を考えたいデベロッパーを募集中です。

記事を共有する

関連記事

  1. Atomic Designの考え方と利点・欠点

    Atomic Design はデザインシステムを作る方法論となります。

  2. eslint-plugin-importによってVitestの設定ファイル上でエラーが発生する場合がある

    vitest と eslint-plugin-import に依存している環境では、vitest.config.ts内で vitest/config をインポートすると Unable to resolve path to module 'vitest/config'. eslint(import/no-unresolved) というエラーが出る場合があります。

  3. Next.js + Vercel + microCMSなどを使ってほぼ無料でブログを運用する

    当ブログのシステム構成について紹介します。構成を真似することでほぼ無料(後述)でブログを運営できます。

  4. ブログ記事を投稿するためのフォームを作った

    はてなブログのMarkdownによる記事編集画面やesa - 自律的なチームのための情報共有サービスのように、本文の編集画面とリアルタイムプレビューが横並びになるような投稿フォームが個人的に好みです。