駆け出しプログラマ向け、実務で使える「簡潔性」ってなに？

# 前置き
こちらの記事は筆者が備忘録的にまとめたものです。
せっかく来てくれた読者の皆様にとっても役に立つように意識して書いてみましたので、
是非最後まで読んでみてください。では、**Let us begin!**

# 簡潔性(Conciseness)
かんけつせい とは
## 辞書的な説明
### 日本語だと
> 簡略で要領よくまとまっていること。 短くてすっきりしているさま。

### 英語だと
> the quality of being short and clear, and expressing what needs to be said without unnecessary words

### IT用語的には
> 無駄な情報がないことを意味する。メモリ容量が限られている環境では重要である。また、コードの行数を削減することも様々な意味で重要である。同じ機能を実現するコードが繰り返し出現する箇所をサブルーチン[^1]化することで改善される。また、文書についても同様のことが言える。


## 簡単にまとめると
- 短くてわかりやすい
- 不要な説明なしに大事なことが表現できている状態やその質
- 同じコードが繰り返されていない

## つまり
:::note info
無駄がない
:::

IT用語的な説明としては、同じ機能を実現するコードが繰り返されている所をサブルーチン化することで改善できるとあります。
このサブルーチンという言葉は、私が実際に勤務している会社ではよく「共通化」という言葉で表現されます。

つまり、「処理が似てたいり同じ実装はいちいち新規に実装しないで、共通している部分を一つのコードとしてまとめて、あとはそれを呼び出すだけで良いようにしてくれ！」ということです。

ではこれをコードベースで見てみましょう。

# 簡潔性をコードに適用した例
３種類のたこ焼きを作って返す関数を例にしてみましょう。

## 適用前（簡潔性 改善前のコード）
:::note warn
ヒント: いきなり関数の中身を読まず、まずはコメントから確認しましょう。
全体像から入るとその後の理解がしやすいはずです。
チーム開発をしているときは特に、簡潔で正確なコメントを残すと静かに感謝されます。
:::

```javascript:javascript
// 引数に渡されたものを全てがっちゃっんこした最終形のたこ焼きを返す関数
function makeCompletedTakoyaki(takoyaki, sauce, topping){
  takoyaki.sauce = sauce;     // ソースを追加
  takoyaki.topping = topping; // トッピングを追加
  return takoyaki;            // 最終形のたこ焼きを返す
}

// ------ ここから３種類のたこ焼きを作って返す関数 ------
// 普通のたこ焼きを返す関数
function makeRegularTakoyaki(){
  const base = {
    outside: "crispy",  // 外側カリカリ
    inside: "creamy",   // 内側クリーミー
    hasTako: true,      // タコが入っているか
    sauce: null,        // ソースなし
    topping: null       // トッピングなし
  }
  const completedTakoyaki = makeCompletedTakoyaki(base, "うまソース", "かつお節");
  return completedTakoyaki;
}
// テリタマたこ焼きを返す関数
function makeTeritamaTakoyaki(){
  const base = {
    outside: "crispy",  // 外側カリカリ
    inside: "creamy",   // 内側クリーミー
    hasTako: true,      // タコが入っているか
    sauce: null,        // ソースなし
    topping: null       // トッピングなし
  }
  const completedTakoyaki = makeCompletedTakoyaki(base, "てりやきソース", "たまご");
  return completedTakoyaki;
}
// チーズ明太たこ焼きを返す関数
function makeCheeseMentaiTakoyaki(){
  const base = {
    outside: "crispy",  // 外側カリカリ
    inside: "creamy",   // 内側クリーミー
    hasTako: true,      // タコが入っているか
    sauce: null,        // ソースなし
    topping: null       // トッピングなし
  }
  const completedTakoyaki = makeCompletedTakoyaki(base, "ポン酢ソース", "チーズ明太子");
  return completedTakoyaki;
}
```

美味しそうなたこ焼きを作ってくれそうですが、無駄がありますね。
３種類のたこ焼きを作って返す各関数の始めにある、ベースとなるたこ焼きを用意する処理は全く一緒です。
さらに、完成系のたこ焼きを一度`completedTakoyaki`という変数に入れていますが、その後は何もせず return しているだけなのでこれも無駄と言えそうです。

簡潔性は、サブルーチン化することで改善されるらしいので、やってみましょう。

## 適用後（簡潔性 改善後のコード）

### やること
- 共通する処理（ベースのたこ焼き作成処理）を一つの関数にし、それを必要とする各関数で呼び出すだけにする。
- 完成系のたこ焼きをあえて変数に取らず、呼び出した関数の返り値をそのまま return してあげる。

```javascript:javascript
// 改善のために共通化した関数（本当はClassが良さそうだが便宜上、今回は関数で記述）
// ベースとなるたこ焼きを作成して返す
function makeBaseTakoyaki(){
  return {
    outside: "crispy",  // 外側カリカリ
    inside: "creamy",   // 内側クリーミー
    hasTako: true,      // タコが入っているか
    sauce: null,        // ソースなし
    topping: null       // トッピングなし
  }
}
// 引数に渡されたものを全てがっちゃっんこした最終形のたこ焼きを返す関数
function makeCompletedTakoyaki(takoyaki, sauce, topping){
  takoyaki.sauce = sauce;     // ソースを追加
  takoyaki.topping = topping; // トッピングを追加
  return takoyaki;            // 最終形のたこ焼きを返す
}

// ------ ここから３種類のたこ焼きを作って返す関数 ------
// 普通のたこ焼きを返す関数
function makeRegularTakoyaki(){
  const base = makeBaseTakoyaki(); // ベースのたこ焼きを取得
  return makeCompletedTakoyaki(base, "うまソース", "かつお節");
}
// テリタマたこ焼きを返す関数
function makeTeritamaTakoyaki(){
  const base = makeBaseTakoyaki(); // ベースのたこ焼きを取得
  return makeCompletedTakoyaki(base, "てりやきソース", "たまご");
}
// チーズ明太たこ焼きを返す関数
function makeCheeseMentaiTakoyaki(){
  const base = makeBaseTakoyaki(); // ベースのたこ焼きを取得
  return makeCompletedTakoyaki(base, "ポン酢ソース", "チーズ明太子");
}
```
いかがでしょうか。
各関数内でベースのたこ焼きを初めから定義する必要がなくなりました。
必要なときにサブルーチン化（共通化）した関数を呼ぶだけで良くなり、３種類のたこ焼きを作って返す関数がとてもスッキリしました。

また、無駄に変数に取るのもやめたので読むコードの量も減りましたね。

もしかしたら「base という変数に取るのも無駄じゃない？」と思うかもしれません。
変数に取らない場合は関数内の処理は１行でかけます。

```javascript:javascript
// 普通のたこ焼きを返す関数
function makeRegularTakoyaki(){
  return makeCompletedTakoyaki(makeBaseTakoyaki(), "うまソース", "かつお節");
}
```
ただ、引数の中で関数を呼び出すのは他のメンバーにとって果たして読みやすいのだろうか？、という問題が生まれます。
これは賛否両論ありそうですが、正解は、チーム開発ならチームの方針、個人開発なら自分の好み、と言えそうです。
（まだまだ改善できるかもしれませんが今回はここまで）

# 今回の簡潔性改善によるメリット
- 不要なコードが減りました（複雑さ DOWN） 
- コードが減り、各関数で何をしているかが見やすくなりました（可読性 UP）
- ベースのたこ焼き作成が共通化されたことで、新メニュー追加時にも使えそうです（柔軟性 UP）
- ベースのたこ焼き改修が楽になりました（保守性 UP）
    - もしベースのたこ焼にタコではなくイカを入れるという修正が入ると、
        - 改善前：修正箇所 x３（各関数内のベースたこ焼き作成全て）
        - 改善後：修正箇所 x１（共通化したベースたこ焼き作成のみ）

# まとめ
簡潔性とは一言で言うと「無駄がない」ということ。

同じ処理が散らばっていたり繰り返し使われている場合は、サブルーチン化（共通化）することで、簡潔性の改善が期待できます。

ちなみにエンジニア界隈ではDRY原則(Don't Repeat Yourself)とか、KISS(Keep It Simple, Stupid)なんて言葉があります。
今回の話と関連あるものなので、「聞いたことない！」な人は是非調べてみてください。

# 参考
- [wikipedia](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E5%93%81%E8%B3%AA#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E5%93%81%E8%B3%AA%E3%81%AE%E8%A6%81%E5%9B%A0)

- [IT用語辞典 e-Words]()

[^1]: 特定の機能や処理をひとまとめにして、他の場所から呼び出して実行できるようにしたもの。よく共通化なんて言ったりする