2018年のフロントエンドエンジニア/デザイナーに知ってほしいAtomic Design

## 目的
フロントエンドを開発する上でUIコンポーネントを区分する際に問題が起きました。
UIコンポーネントを区分せず、フラットに開発すると、1サービスで軽くUIコンポーネントが3桁ぐらい同一ディレクトリで無法地帯のように散乱されるのは想像に難くないでしょう。(事実そうなりかけて解決策を探した結果この記事を書いています
それを解決するためにAtomic Designを参考にしようといくつかの方のAtomic Designのスライドショーを見ましたが、それらのスライドショーの内容の通りやっても上手く行かない事は明白でした。
調査した所、Atomic Designをフロントエンド界隈では使っている所はとても多かったです。
そんなに広まっている設計がこれほどまでに薄いものだとはどうしても思えなくて、原文を探し呼んだ所、とても重要な部分が他のスライドや記事では抜けている、または間違った解説をしていたので、要点を纏めた翻訳をしました。

## Atomic Designとは
Atomic Design とは小さい部品を徐々に複雑にする一本道の過程のこと**ではなく**、
むしろ、UIをまとまった一つの全体として見る見方と、個々の部品の集まりとして見る見方を
共存させて考えるという、**[メンタルモデル](https://www.ctale.jp/blog/archives/2041)**のひとつです。

## 生まれ
Broad Frost氏はこの複雑なUIの世界を考えた際に、高校の化学実験室の机の上に座っている思い出を思い起こしたそうです。
くわしくは[原文のチャプター2](http://atomicdesign.bradfrost.com/chapter-2/)をどうぞ

## 重要ないくつかの画像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/9c2ebf43-cf90-825b-b2cd-571d71cf8f9d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/0138e8cc-d418-1ad4-d0b8-046161eb68b0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/3a9456df-185e-5960-500a-cecc9ef5b2c1.png)

## Atoms
一番基本的なもので、それ以上分解すると意味を失ってしまう要素
Atomsは、デザインシステムの開発が進んだときに、基本となるスタイルを全てひと目で示してくれる、
便利なリファレンスです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/89ff0ea2-2c6f-3936-ac13-4c6abc4e665c.png)


## Molecules
UIエレメントの**単純な**集まりで、協調して働くunit。
Atomが結びつくことで、Atomにはない目的を果たします。
単純な部品を作ることで、UIデザイナーや開発者は単一責任の原理を遵守しやすくなる。
単純に保つことで、テストや再利用性、UIの一貫性において有利です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/8b50f2d0-bdf7-e328-1ce6-f7be7278c10a.png)


## Organisms
Organismsは比較的複雑なUIコンポーネントで、[Molecules and(or) Atoms and(or) Organisms](http://atomicdesign.bradfrost.com/chapter-2/#organisms)で構成される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/d6729921-3fb2-2cff-c97a-d4712d17a139.png)

例えばヘッダーは、個々の部品はそれぞれ固有の性質と機能を持つが、UI上では、まとまって**独立したセクション**を作る。これがOrganismsです。

似た種類のMoleculesからなるOrgnanismもあれば、異なる種類からなるものもありうる。全く同じMoleculesをいくつも並べたOrganismもありえます。
たとえば、このOrganismで説明します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/b54b5216-7a23-6736-36e8-ac8d2c4d6d19.png)
この中には「img atom」 + 「text atom」 で構成された「かっこいい商品説明欄」moleculesがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/fe2fb232-955c-d774-7110-f2838dc89a47.png)
また、左上には
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/2de5d2b4-d9ff-6681-68b7-4898a79f26be.png)
という「text atom」で構成されたタイトルがあります。「かっこいい商品説明欄」moleculesを反復させ、タイトルatomを付与し、整列させた構成で、このorganismsは構成されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/b54b5216-7a23-6736-36e8-ac8d2c4d6d19.png)
このorganismsは他の所でも商品の一覧を見せる際に再度利用できます。

## Templates
皆さん、ここからは化学との類推はやめます。
Templatesはページレベルの[オブジェクト](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88)で、部品をレイアウトに沿って配置し、デザインの根底にあるコンテンツの構造を明確にします。
Templatesはページに必要な部品をすべて見せ、抽象的なmoleculesやorganismsの相対的な関係を与えてくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/a02a050e-839a-0d47-5740-651fce23f994.png)

Templatesの重要な性質として、ページの最終的な結果ではなく、コンテンツの骨組みを明確にする事に焦点を当てる点があります。デザインシステムは動的に変化するコンテンツに対応する必要があり、その規格(画像のサイズや文字の長さ)を決めることはとても役に立ちます。

> コンテンツを知らなくても良いユーザー体験を生み出すことはできます。コンテンツの構造を知らずに良いユーザー体験は作れません。コンテンツがどう作られたかが大事で、コンテンツが何であるかは重要ではありません。
> <font color="DarkOrange">- Mark Boulton</font>

たとえば、Time Inc.のホームページのTemplateでは、いくつかの重要なコンポーネントを示していますが、画像のサイズや文字の長さに関する構造も示しています。
注釈: [Lorem ipsum](https://ja.wikipedia.org/wiki/Lorem_ipsum)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/45bac4b3-d8be-a586-af04-84df2ef5a52e.png)

## Pages
Pageとは実際にユーザーが見るTemplateの実体です。
前の例で言うと、Templateにテキストや画像、メディアを流し込むと、実際に稼働するコンテンツが以下のように表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/10ba33c7-d912-6eed-1dfd-8f73cd51e541.png)

PagesはAtomic designにおいて最も具体的な段階です。結局、Pagesはユーザーが実際に見て触れるものです。
それに加え、Pagesは根底にあるデザインシステムの有効性をテストするのに本質的です。ちゃんと実際のPagesが上手く機能していなければ、前に戻ってMoleculesやOrganism、Templatesを修正できます。

せっかくなので先程のTime IncのTemplateにコンテンツ流し込んでみると、デザインのパターンがどのように維持されているかがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/141711/449db505-b399-bbc1-9622-9b64fa44174b.png)
Pagesというのは、条件によってTemplatesが変化する様子がはっきりと見える場所でもあります。根底にあるTemplatesは同じですが、UIは多様なコンテンツを反映して変化します。このような変化は、実際にMoleculesやOrganisms、Templatesがどのように構築されるかに影響します。このような変化を考慮に入れてPagesを作ることで、より弾力的なデザインシステムを構築できます。

## まとめ
以上が、Atomic Designです。
5つの異なる舞台が並列に一斉に機能することで、効果的なUIデザインシステムを生み出すことができます。

* Atomsはそれ以上分解できないUI要素で、基本的な構築要素となります。
* MoleculesはAtomの単純な集まりで、比較的単純なUI要素を形成します。
* OrganismsはUIの独立したセクションをなす、比較的複雑な部品です。
* Templatesは部品をレイアウトに沿って配置し、根底にあるコンテンツの構造を明確にします。
* Pagesは実際のコンテンツをテンプレートに適用します。また、条件による変化を正確に反映することで、最終的なUIをユーザーに正しく見せたり、デザインシステムの弾力性を検証したりします。

## 補足
セクションとは、直訳すると区切られた部門って意味もあります。
つまり、テンプレート上で区切られた領域に単体で配置されても意味を成せるのがOrganismsを設計する上で重要な指標となるでしょう。