コンポーネント指向のススメ

今回は複数人で構築する際にとても便利なコンポーネントについてお話できれば、と思います。
コンポーネントの概念を把握しておくとReactやvue.jsと通じるところもあるので、
知っていて損はない概念と思います！


# コンポーネント指向とは 

まず、コンポーネント指向で大切な概念として、[Atomic Design](https://atomicdesign.bradfrost.com/chapter-2/)があります。
<br>
ざっくりAtomic Designのお話をすると…

以下の添付画像のように
<font color="#be6700">PAGES</font>（フロントのページ）は最小単位の<font color="#be6700">ATOMS</font>から構成されている、ということです。

![instagram-atomic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617643/dce05803-7f32-8663-75e1-5287e80c0b67.png)

複数の<font color="#be6700">ATOMS</font>から
一つの機能（例えばボタンアイコンなど）が構成されて、（<font color="#be6700">MOLECULES</font>）

<font color="#be6700">MOLECULES</font>から、
いわゆるヘッダー、コンテンツ、フッター（<font color="#be6700">ORGANISMS</font>）が構成されて、

各ページを作り上げている、というイメージです。

そしてコンポーネント指向というのは、**ATOMSやMOLECULESを組み合わせて開発する考え方**のこと。だと私は解釈しています。

# コンポーネント化するメリットとは
#####  再利用性が高く、コードが簡潔になる #####
ボタンなど、共通するパーツをコンポーネント化しておくことで、新しいボタンが必要になったときに記述の追加をする必要がなくなります。
        特に複数人での構築の場合は、何度も同じようなCSSを書く、というような不要な記述の回避ができます。
        
##### 保守性が高くなる #####
例えば、構築中にボタンのテキストのfont-weightを変えたい、となった場合、コンポーネント化していれば該当する箇所のみ修正すれば全てのボタンに適応されるというメリットがあります。

##### CSS設計のFLOCSS(フロックス)と相性がいい #####
[FLOCSS(フロックス)](https://github.com/hiloki/flocss)とはCSSの命名を細かくパーツごとに分割する設計で、
クラス名の重複を避けたり、保守性の高い設計にすることを可能にします。

以下、パーツごとの内容です。

<dl>
<dt>F(Foundation)</dt>
<dd>ブラウザのデフォルトスタイルの初期化や、プロジェクトにおける基本的なスタイルを定義。</dd>

<dt>L(Layout)</dt>
<dd>ページを構成するヘッダーやメインのコンテンツエリア、サイドバーやフッターといったプロジェクト共通のコンテナーブロックのスタイルを定義。</dd>

<dt>O(Object)</dt>
<dd>プロジェクトにおける繰り返されるビジュアルパターンをすべてObjectと定義。
Objectは、さらに次の3つのレイヤーに分けられる</dd>
<dt>-Component</dt>
<dd>再利用できるパターンとして、小さな単位のモジュールを定義。<br>
（出来る限り、最低限の機能を持ったものとして定義されるべき）</dd>
<dt>-Project</dt>
<dd>いくつかのComponentと、それに該当しない要素によって構成されるものを定義。<br>
例えば、記事一覧や、ユーザープロフィール、画像ギャラリーなど、コンテンツを構成する要素が該当される</dd>
<dt>-Utility</dt>
<dd>ComponentとObjectだけでは区別することが難しい場合や、わずかなスタイルの調整のための便利クラス</dd>
</dl>

上記のようにFLOCCSはコンポーネントすることを前提に作られた設計であるので、
組み合わせて使うことで更に保守性高く、クラス名の重複を避けた構築が可能になります。

# 注意点 #
ざっとメリットを挙げましたが、気をつけなければいけないこともあります。

##### 構築するチーム内でコンポーネントの粒度を揃える #####
例えば以下画像のようなボタンを作る場合、

![スクリーンショット 2023-12-17 15.42.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617643/641983fc-8273-5445-a3e4-83cd001bfcd8.png)

Aさんは矢印のアイコンもコンポーネントとしてボタンの共通パーツにしよう、
Bさんはアイコンはアイコンだけの1つのパーツ、残りのborder-radiusやfont-sizeで1つのパーツ、合計２つのパーツから成り立っている部品とする、
こういった事象が粒度がバラバラになっているということになり、チームで揃える必要がありますね。



##### 可変にするスタイルを見極める #####
先ほどの例でいうと、アイコンは複数のボタンで使用するものなのか、それとも１つのボタンでのみ使用するのか、
ボタンのサイズは可変なのか、など。
可変である場合はコンポーネント化にしないほうがいいですね。
どのパターンでも使えるような基本的な指定をするのが重要です。

##### デザイナーもコンポーネントを意識する #####
上記2つと重なるところがあるのですが、
デザイナー側もコンポーネントを意識してデザインすることが重要になります。
実装者とデザイナーの粒度も合わせておくことで綺麗にコンポーネント化を進めることができます。

##### コンポーネントは独立したパーツで働くようにする #####
上記3つは実装者やデザイナーの意識を合わせるようなポイントですが、
こちらはテクニック(？)としての注意点になります。

以下添付のようなフッターを実装したいとします。

![スクリーンショット 2023-12-17 18.01.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617643/012cc94d-f224-e140-98b7-0085ae1ca8f5.png)


SNSのアイコンが等間隔の余白で配置されていますが、この余白はコンポーネント化すべきではありません。

もし余白をつけたままコンポーネントしてしまって、他の箇所で同じアイコンを使用したい場合、
不要な余白の指定が付与されていることになりますので、[こちら（可変にするスタイルを見極める）](#5-可変にするスタイルを見極める)に反することになります。
なので　レイアウトで使われるスタイルは指定しない方がいいということになります。


# おわりに
ざっくりとまとめてしまいましたが、実装者1人のときよりも、
複数人で構築していくときのほうがコンポーネントの恩恵を受けるような気がしました。

冒頭にも書いたように他言語にもコンポーネント指向は出てくるところだと思いますので、
これからも意識しながら構築していきたいなと思いました。