見出し画像

 RustやGoにClassがない理由を考える。

要件

  • RustやGoにClassがない理由を考える

参考記事

RustやGoにclassがない理由を考えるために、まずはオブジェクト指向が何なのかを理解しておかないとです。
オブジェクト指向に関しては、この方がめちゃくちゃ丁寧に解説をしてくださっております。これは本当に感謝で、これはエンジニアなら見て損なしの動画です。 RustやGoには、Classがなくてオブジェクト指向なんて必要なんてないではないかと思うかもしれませんが、そんなことはなくて、RustでもGoでもオブジェクト指向的なことはできます。

じゃClassを残しておけばとおけば良いではないかと思うかもしれないのですがそうではなくて、Classがないことで、多くのエンジニアがオブジェクト指向のアンチパターンにハマって複雑なプログラムをつくらいように、多くのエンジニアが良いコードを書ける確率を高められるようにclassが廃止されたのです。この動画を見て頂いてオブジェクト指向の良さと難しさを理解して頂けると良いかもです!

▼単一責務の原則  「オープンクローズドの原則

▼リスコフの置換原則

▼依存関係逆転の原則とインタフェース分離の原則


学べること

  • Classの継承が駄目な理由を考える

  • goやrustにclassがない理由がわかる

ヒント

まずGoやRustにClassがない理由として継承をさせないためとあるが、それがもしっくりこなかったら、もしかしたら前提が違うかもしれないので、前提を2つ説明しておきたい。

1つ目にチーム開発のおいてClassと言うものは、アンチパターンになりやすい。一人で全て開発していているなら、問題にはならない可能性がある。複数人で開発を行なっている場合にClassがあると不都合なことが起こりやすい。
2つ目に全ての人がオブジェクト指向のアンチパターンに関して熟知していて開発できるなら、問題ないのだが、実際はそうではないということ。

そして、Classの問題点を2つ挙げるとしたら、以下の2つだ

(1) 継承をしたClassを呼び出す時に、そのClassの親のClass含めどういう構造で、どういうメソッドになるのかと考えないといけないこと

(2)Classのプロパティが違うだけで違う型になること。

1に関して問題を端的に書くとしたら、呼び出させるメソッドが一箇所にまとまってないことだ。たとえばClass大好きのAさんとあなたがいるとする。あなたはAさんが作っていたClassを使いながら開発を行うとする。AさんはClassが大好きなので、継承があるClassが10個以上あるとする。そんな場合どうだろうか。Class10個のメソッドを確認していかないといけないのか。そんなの大変だろう。一箇所に使用できるメソッドがまとまって欲しいし、もし多くのClassに継承されているClassを修正しないといけない時に全てのClassに影響を考えながら開発を行わない。

コードを書いているAさんからしたら、継承とかは同じ処理を書かないで良いのでコードを書いていて気持ち良いかもしれないがそのコードを使ってか開発する側は大変なのだ。

とどのまり、開発するにあったって自分たちは、結局それができるのが知りたい。使う側からしたら構造ではなくて、何ができるかが大事なのだ。それをちゃんと書いてあるのがInterfaceなのだ。

自分が働いている会社のスーパーエンジニア社長から重要なことを教えて頂いたので忘れないために記載しておきます!!

  • TraitやInterfaceは「構造ではなくて操作」、「構造ではなくて能力」に注目させたもの

2に関しても、上記の説明と被ってしまう所があるのですが、、
これはアンチコードを説明するより、具体的に良いコードの例を考えた方が良いので説明します。ゲームのカセットと本体とコントローラーを考えて欲しい。自分たち使う側は、AボタンをBボタンを押すだけしかできてないが、カセットが違うだけでAボタンを、Bボタンの振る舞いが変わると思う。

これはまさに、呼び出す側は同じことしかやっていないのに、挙動が変わるのだ。これがまさに良いコードで、前の説明に戻るがAさんとあなたがいて、あなたはAさんのコードを呼び出すだけでOKの状態であって欲しいと思うはずだ。

Classのプロパティが違うだけで違う型になることを別のイメージで書くとしたら、ゲームのカセットが違いごとにあなたはゲームのコントローラーが違ったら大変だろう。それと考え方は同じだ。

まとめ

  • Classは継承したプロパティが違うだけで、別のものとして捉えられる。これは大変

  • TraitやInterfaceは「構造ではなくて操作」、「構造ではなくて能力」に注目させたもの

  • 使う側からしたら構造ではなくて、何ができるかが大事なのだ


※メモ
▼interfaceとtraitの違い
interfaceは型しか持たない
traitは、defaultメソッドを設定できる

関連タグ

#Rust #Go #tTrait #Interface #Class #オブジェクト指向

この記事が気に入ったらサポートをしてみませんか?