パスタ作りもオブジェクト指向なのかも
先日パスタの記事を書いている時に、ふと思いました。「これってオブジェクト指向だなぁ」って。
まだお読みで無い方は、以下の記事↓から先に読むと話が分かりやすくなると思います。

「オブジェクト指向」…多くの方には聞き覚えのない言葉かも知れません。
ただそう意識せずとも、頭の中ではこの考え方を使っている人も多いと考えています。
IT屋さんは「繰り返される作業を自動化」することが仕事なので、この考え方が重要です。
端的に言うなら、複数のものの共通することと、違うことを分けて整理した上で、
繰り返される作業の流れを「ここは同じ」「ここは条件によって変える」と示すことです。
それをコンピュータに分かる言語で書いていくのがプログラミングというわけです。
- システムエンジニアの頭の中を知りたい方
- IT技術の裏側にある「考え方」に興味がある方
- プログラミングに1歩踏み出そうとしている方
そんな方々のお役に立てる記事になっています。
単に「世の中にはこういう考え方をする人もいるのね」と読み物としても面白いと思います◎
分かりやすいように、パスタ作りを例に説明していくね!

オブジェクト指向を構成するもの
オブジェクト指向では、親子関係にあるグループを「クラス」「インスタンス」と示します。
パスタで例えるなら「クラス」は、どんなソースでも共通する部分ですね。
・「パスタ」クラス:茹でた乾麺にソースをあえて食べるもの
パスタで例えるなら「インスタンス」は、どのソースのパスタかの違いですね。
・「オイルベース」インスタンス : オリーブオイル
・「トマトベース」インスタンス : オリーブオイル + トマト缶
・「クリームベース」インスタンス : バター + 生クリーム
さらに具材の違いで分けるなら、それは「子インスタンス」となります

更にそれぞれのインスタンスについて、「特徴」「動作」に分けて整理します。
パスタで例えるなら特徴(プロパティ)は以下の通り。
・オイルベース:「あっさり」「シンプルで食べやすい」
・トマトベース:「見た目が華やか」「子どもが服を汚しやすい」
・クリームベース:「味がマイルドで食べやすい」「カロリー高め」
そして同じく「動作」(メソッド)は以下の通り。
・オイルベース:「具材を入れた後、茹で汁と油を乳化させる」
・トマトベース:「具材を入れた後、トマトを加えて一煮立ちさせる」
・クリームベース:「オリーブオイル+バターを熱する」「具材を入れた後、生クリームを加えて一煮立ちさせる」
確かに、前回の記事ではソース別に作り方を整理していたね!

これは、上で説明した「特徴(プロパティ)」と「動作(メソッド)」が含まれる概念のことを指します。
「レシピ」のようなものだと考えて頂ければ良いです。
インスタンスは、このレシピを元に作られた「モノ」というわけです。
すなわち、オイルベースのパスタというインスタンスを作るにあたって、
オイルベースパスタのオブジェクト(レシピ)を使って作る、ということになります。
ふんわりしているけれど、オブジェクト(レシピ)は実体が無い、”概念”ということデス

オブジェクト指向のメリット
これは人がプログラミングをするにあたって、大事な要素ですね。
現実の物や事象をそのままプログラムに取り入れるので、人が理解しやすいという特徴があります。
たくさんの「レシピ」が体系的に整理されることで、管理が簡単になります。
パスタで共通する手順(パスタを茹でる工程など)、ソースごとに違う手順を分けて整理しておくことで
頭の省エネ、コンピュータのリソース節約に繋がります。
一度整理した「レシピ」は、他の場所でも使い回すことができます。
共通する手順は全メニューのページに書かなくて良くて、前ページ参照、と飛ばしておけば良いわけです。
重複も無駄もないプログラム、これをIT業界では「美しい」と表現します。笑

もしもパスタ作りをプログラムで書くなら・・・?
どんなふうになるのだろう??ということで、試しに生成AIに書いてもらいました。
まとめ方は上述の内容と違う部分(サブクラス使ってたり)もありますが、イメージとしてはこんな感じです。
- 興味のある方はどうぞ(クリックして展開)
-
# パスタの基本クラス class Pasta: def __init__(self, name): self.name = name def boil_water(self): """お湯を茹でる工程""" return "Boiling water." def prepare_ingredients(self): """具材を切る工程""" return "Preparing ingredients." def cook_pasta(self): """乾麺を茹でる工程""" return "Boiling pasta." def add_ingredients(self): """具材を加える工程(サブクラスで実装)""" raise NotImplementedError("Subclasses must implement this method") def mix_with_sauce(self): """パスタをソースと和える工程""" return f"Mixing pasta with sauce for {self.name}." def prepare(self): """全工程を順番に実行する""" steps = [ self.boil_water(), self.prepare_ingredients(), self.cook_pasta(), self.add_ingredients(), self.make_sauce(), self.mix_with_sauce() ] return " ".join(steps) def make_sauce(self): """ソース作り(サブクラスで具体的に実装)""" raise NotImplementedError("Subclasses must implement this method") # オイルベースのパスタ class OilBasedPasta(Pasta): def __init__(self, name, oil_type, ingredient): super().__init__(name) self.oil_type = oil_type self.ingredient = ingredient def add_ingredients(self): """具材を加える工程""" return f"Adding {self.ingredient} to the pan." def make_sauce(self): """オイルベースのソース作り""" return f"Making oil-based sauce with {self.oil_type}." # トマトベースのパスタ class TomatoBasedPasta(Pasta): def __init__(self, name, tomato_type, ingredient): super().__init__(name) self.tomato_type = tomato_type self.ingredient = ingredient def add_ingredients(self): """具材を加える工程""" return f"Adding {self.ingredient} to the pan." def make_sauce(self): """トマトベースのソース作り""" return "Making tomato-based sauce." def add_tomato(self): """トマトを加える工程""" return f"Adding {self.tomato_type} tomatoes to the pan." def prepare(self): """トマトベースのパスタに特有の調理手順を実行""" steps = [ self.boil_water(), self.prepare_ingredients(), self.cook_pasta(), self.add_ingredients(), self.add_tomato(), self.make_sauce(), self.mix_with_sauce() ] return " ".join(steps) # クリームベースのパスタ class CreamBasedPasta(Pasta): def __init__(self, name, cream_type, ingredient): super().__init__(name) self.cream_type = cream_type self.ingredient = ingredient def add_ingredients(self): """具材を加える工程""" return f"Adding {self.ingredient} to the pan." def add_butter(self): """バターを加える工程""" return "Adding butter to the pan." def add_cream(self): """生クリームを加える工程""" return f"Adding {self.cream_type} cream to the pan." def make_sauce(self): """クリームベースのソース作り""" return "Making cream-based sauce." def prepare(self): """クリームベースのパスタに特有の調理手順を実行""" steps = [ self.boil_water(), self.prepare_ingredients(), self.cook_pasta(), self.add_butter(), self.add_ingredients(), self.add_cream(), self.make_sauce(), self.mix_with_sauce() ] return " ".join(steps) # パスタ工場クラス class PastaFactory: @staticmethod def create_pasta(pasta_type, name, base_ingredient, extra_ingredient=None): """指定されたパスタの種類に応じてインスタンスを生成""" if pasta_type == 'oil': return OilBasedPasta(name, base_ingredient, extra_ingredient) elif pasta_type == 'tomato': return TomatoBasedPasta(name, base_ingredient, extra_ingredient) elif pasta_type == 'cream': return CreamBasedPasta(name, base_ingredient, extra_ingredient) else: raise ValueError("Unknown pasta type") # パスタのインスタンスを生成して調理する def main(): # 各パスタのインスタンスを生成 oil_pasta = PastaFactory.create_pasta('oil', "Aglio e Olio", "extra virgin olive oil", "garlic") tomato_pasta = PastaFactory.create_pasta('tomato', "Marinara", "San Marzano tomatoes", "garlic") cream_pasta = PastaFactory.create_pasta('cream', "Alfredo", "heavy cream", "mushrooms") # 各パスタの調理方法を表示 print(oil_pasta.prepare()) print(tomato_pasta.prepare()) print(cream_pasta.prepare()) if __name__ == "__main__": main()
こりゃ目が回る~

- オブジェクト指向は、物事を特徴・動作と紐づけて整理する考え方
- 一連の作業について、共通する部分・特有の部分を分けて考えることで、共通部分の記憶負担を減らせる
- 実はITに関わらない人も頭の中ではきっと、こんな脳内整理をしているハズ・・・?
IT業界に入って、勉強を始めると、このオブジェクト指向で躓く人が多い印象です。
でもプログラム特有の話というのではなくて、思考整理術の一つとして考えてもらうと、
「そう言われれば、無意識でそういう考え方してるかも…」と気づくと思うんです。
脳が記憶容量を節約するために、アレコレやってくれているんですよね。
ITで実現する自動化というのは、人の頭で何を考えているか?を明文化することでもあるので、
私のように文系だけど情報の仕事をやっている人がいるのも、納得できる気がします。
最後までお読み頂きありがとうございました!
