「家事」も「仕事」も、タスクを細かく分割できる人が、オブジェクト指向も上手く行く


# 元ネタと目的

https://qiita.com/haihaikazuma/items/cadbf00a1f848a8e20a6

興味深いトピックですね。記事では、分割という視点から述べられていますが、これは目的の明確化や分析につながる話題だと感じます。

例えば、オブジェクト指向プログラミングにおいても、クラス構造を設計する際には分析が重要な要素となります。記事で提示された分解前後のタスクを利用して、オブジェクト指向の例題に応用してみたいと思います。

洗濯という日常のタスクとオブジェクト指向との関係性が分かりにくいかもしれませんが、まずはアンチパターンの例題を通して、このアプローチの方向性を理解していただけるといいですね。

# アンチパターン: 浅い分析で抽象化しちゃう

分解前のタスクを引用します。

:::note info
・洗濯をする。
・洗濯物を干す。
・洗濯物を取り込む。
・洗濯物をたたむ。
・洗濯物を片付ける。
:::

タスクの分割が不十分であり、各タスクが抽象的で具体性を欠いています。洗濯という家事には、これらのステップが存在することしかわかりません。実際の作業とはかけ離れた単純化されたイメージが生まれ、理解のずれの原因となってしまいました。このような状況では、分析の視点でも情報が不足しすぎると言え、抽象化してもあまり有用なクラスが得られません。


```java 
class 洗濯 {
  する()
  干す()
  取り込む()
  たたむ()
  片付ける()
}
```


このクラスは微妙に心当たりがある感じに仕上がってないでしょうか？

一連の処理を単純に表現していますが、これでは微妙な感じがしますね。情報の不足により、処理を単純なステップ構造としてのみ捉えてしまっています。その結果、抽象化が処理構造に偏ってしまい、このようなクラスが生成されてしまいます。

肥大化の対策として抽象化を導入するケースでは、処理を単純なステップとして捉えたまま抽象化することがよくあります。このようなクラスは、しばしば曖昧な名前が付けられ、「ほげほげロジック」といった悲しい名前のクラスになりがちです。さらに、共通化の目的が追加されると、テンプレートメソッドパターンが導入され、より悲しいクラスが誕生することもあります。

この悲しみを克服するためにも、分割されたタスクがある場合、それがどのように影響するか見ていきましょう。


# 分割後のタスクを眺める

分解後のタスクの中心となる部分に絞って引用します。

ステップ内の細かい作業と判断の多さが、物量となり、`洗濯を侮るなかれ`と戒めを込めて襲い掛かってきますが、負けずに眺めましょう。

:::note info
...

・洗濯物を集める
　・部屋中をチェックし、脱ぎ捨てられた物がないか確認する。
　　・ソファの下やベッドの下など。
　　・脱衣所の洗濯機の裏も確認。
　　（投げたときに入らなかったもののケア）
　・部屋中のタオルを集める
　　・キッチン、洗面所、トイレなど。
　・カバーやシーツ系を集める
　　・トイレマットと便座カバー
　　・枕カバーと布団のシーツ（敷布団・掛け布団）
　・その他の確認
　　・カーテン
　　・玄関マット
　　・リビングやキッチンの敷物
　　・お弁当箱入れ、鍋掴み、鍋敷き、布巾
　　（これらを洗うべきかの判断もここで行う）

・洗濯物を精査
　・何回の洗濯が必要か確認する。
　・1回目の洗濯で洗うものと、2回目のものを分ける。
　（大きな衣類は細かいものと混ぜない）
　・すぐに洗う必要があるものを優先する。
　・干す場所が十分にあるか確認する。
　・手洗いが必要なものを分ける。
　（洗濯機が使えない or 特に汚れがひどいものが対象）

・洗濯機を動かす
　・Yシャツの黄ばみを取るために、別の洗剤を塗っておく。
　・洗濯物によって洗剤を分ける。
　・洗濯物によって柔軟剤を分ける。
　・必要に応じて洗濯機の設定を変更する。
　（脱水や乾燥で傷んでしまう服のケア）　
　・おしゃれ着や高価な服は裏返す。
　・下着はネットに包む。

・手洗いが必要なものの対応
　・<さらに細かいタスク群になるため省略>

・洗濯物を乾かす
　・しわにならないよう細部まで伸ばす。
　・服の大きさによってハンガーを選択する。
　・ワイドハンガーには限りがあるので、考えて使う。
　・風で飛ばされそうなものは洗濯バサミを使う。
　・シーツなどを干す場合は、先に干し竿を拭いておく。
　（前日の雨や、黄砂などの汚れをケア）

・洗濯物を取りこむ・たたむ（セット）
　・花粉や虫を落とすため、はたいてから取りこむ。
　・取り入れる場所は綺麗か確認する。
　（髪の毛やほこりが洗濯物につかないか？）
　・洗濯物はすぐにたたむ。
　（たためない場合、シワになるだけなので取り込まない）
　・そもそも「たたまないもの」もあるので分けておく
　・アイロンが必要なものを分けておく

...
:::

ステップに閉じていない共通的な事柄の存在に気が付きましたでしょうか？
それは服など`衣類`についての言及です。

これらは、ステップを超えて言及されていることが分かります。少し抜粋してみましょう。

```
服,タオル,カーテン
手洗いが必要なものを分ける。
おしゃれ着や高価な服は裏返す。
下着はネットに包む。
シーツなどを干す場合は、先に干し竿を拭いておく。
アイロンが必要なものを分けておく
```

衣類に関する情報は、洗濯タスクの各ステップに影響を与えていることが分かります。

これらの情報は、ステップを超えた共通的な事柄として捉えることができます。衣類の性質に応じて行うべき処理や注意点があり、それが洗濯作業全体に影響を与えていることが分かります。このような発見は、分析的に言えば概念の候補を見つけたことになります。


## "衣類"視点で各ステップを整理する

概念の候補である`衣類`を使って、各ステップとの関係を整理してみましょう。

:::note info
* 洗濯物を集める
    * -> `衣類`毎に使用場所とちらばる傾向がり、そこから`汚れモノ`を集めてる
* 洗濯物を精査
    *  -> `衣類`と`汚れ`の傾向から、`組み合わせ`を作り1度に回す洗濯物を決めてる
* 洗濯機を動かす
    *  -> `組み合わせ`によって、洗濯機の設定を変え動かす
* 洗濯物を乾かす
    *  -> `衣類`毎に乾かし方を変えている
* ... 省略
:::

`衣類`は、各ステップ内の作業に大きな影響を与えていることが分かります。さらに、`衣類`と共に`汚れモノ`の状況も考慮されることがわかりました。また、衣類単体ではなく、洗濯をする際の`組み合わせ`も、`衣類`と共に出現することが分かります。

`衣類`を中心捉えるることで、洗濯という作業を上手く整理できそうですね。整理は分析にとって極めて重要であり、人によっては分析（そしてそれに関連するオブジェクト指向）を整理術と捉えることもあります。

## ※実行環境のケアも大切らしいです

衣類を中心にフォーカスしていますが、元々の分割された作業には、洗濯する環境さえもケアされていることが分かりますね。`洗濯できる天気/干す場所がある/取込先が汚れてない`など。この辺りも含めてみると面白いかもしれません。
※ 実際にとても大切な考慮であり作業です。おつかれさまです。

# 概念をモデルとして記述する

分析して得られた概念の候補をモデルとして記述してみましょう。

🐶 関係性

```
衣類  -  汚れモノ*n  -  組み合わせ
```

🐶 属性
```
衣類
* 種別
* ..

汚れモノ
* 衣類
* 汚れ度合

組み合わせ
* 汚れモノ * n
```

いかがでしょうか。シンプルになっているかと思われます。

※ 実際は属性を含めたオブジェクト図などにしてみるとより理解が深まるかもしれませんね～

# 導き出したモデルを使ってみる

せっかくモデルを作ったので、そのモデルが有用か検証してみたいと思います。モデルを使用して各ステップを説明してみましょう。

:::note info
* 洗濯物を集める
    * `衣類`毎に、ちらばった`汚れモノ`を集める
    * in `衣類` -> out `汚れモノ`
* 洗濯物を精査
    *  `汚れモノ`の程度や`衣類`の種別を確認して、適切な`組み合わせ`を行う
    *  in `汚れモノ` -> out `組み合わせ`
* 洗濯機を動かす
    *  `組み合わせ`に基づき、ネットを使用したり洗濯機の設定を行い、洗濯を行う
    *  in `組み合わせ` -> out `組み合わせ※1`
* 洗濯物を乾かす
    *  `組み合わせ`に含まれる`衣類`ごと、適切な干し方を行って乾かす
    *  in `組み合わせ`
* ... 省略
:::


各ステップに対して、どのような作業が行われるのか、説明できそうです。なかなか有用なモデルになっていると言えそうです。

※1  `組み合わせ`は、洗濯前後で分けてみるのも良いかもしれませんね。汚れ物ときれいな物を分けることで、気持ち的にも作業が捗るかもしれません。

# ほんの少しだけコードで検証

オブジェクト指向って言ってしまったので、コードっぽいので検証しても面白いですね。

```

List<汚れモノ> = 集める( List<衣類種別> )

List<組み合わせ> = 確認( List<汚れモノ> )

List<組み合わせ>.for 
    洗濯機.設定( 組み合わせ.統計, 本日の洗濯環境 )
    洗濯機.稼働( 組み合わせ.衣類 )
```

などなどなど

# モデルで要約もできる

コードで遊ぶの楽しいですが、元記事の視点に戻って少し振り返り役に立ってみましょう。
良いモデルは、過不足なく対象を説明できるものです。このモデルがもし良いモデルなら、洗濯を過不足なく要約できるかもしれません。比較のために分割前のタスクも使って要約してみましょう。

:::note info
🐶 分割前の要約
「洗濯って、洗濯機を回す以外も、干すなどのステップがあるんだね。」
「あたりまえやん」
:::


:::note info
🐶 分割後の要約
「洗濯って、洗濯機を回す以外も、干すなどのステップがあるんだね。`衣類`と`汚れ`によって、各ステップでの考慮や作業が変わって大変だね。洗濯機を動かすためにも、`汚れモノ`から`組み合わせ`を作って、ネットに入れたり、設定を変えたりするんだね。」
「その通りよくわかってるじゃん！」
:::

※かえしは勝手な想像です。そうなるといいね！

不足がちだった洗濯という家事への理解が、モデルによって十分に説明されました、少しは寄り添えた感じがするのではないでしょうか。

# おわりに


クラス構造を考える際に、抽象化という言葉をよく使います。しかし、この抽象化という言葉のニュアンスをそのまま捉えて、目の前にある対象をただ薄くして定義しなおしてしまいがちです。

元記事の洗濯タスクのような詳細化された知識があると、対象への洞察を深めることができます。洞察の際に、全体を俯瞰して見渡すことで、共通性や結びつきの強い概念を見つけることができます。これこそが、分析と呼ばれるものの本質です。これにより、対象を十分に説明できる必要最低限な概念を見つけることができます。

対象をよく観察して細かく分割する。これこそが大切な一歩となるんだなーという気付きを得られました。元記事様ありがとうございましたｗ