Skip to content

Latest commit

 

History

History
317 lines (208 loc) · 8.19 KB

class_design.md

File metadata and controls

317 lines (208 loc) · 8.19 KB
<style type="text/css"> .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { text-transform: none; } </style>

Class設計とかオブジェクト指向とか

yamap55


アジェンダ

  • はじめに
  • Class とは?
  • オブジェクト指向とは?
  • オブジェクト指向のメリット
  • オブジェクト指向の3要素
  • Class と関数の違い
  • まとめ

はじめに

--

Class 作ってますか?

Class 設計していますか?

Class のこと知っていますか?

--

オブジェクト指向って何?

  • 人クラスとインスタンスの太郎君
  • 動物クラスとサブクラスのライオン

--

  • なんとなくわかっている(けど使えない)
  • どういう時に使うの?
  • 関数ではだめなの?
  • 別に使わなくてもよくない?

--

うまく使うと色々楽になる

  • 細かな所まで知らなくても使用可能
  • 同じ事を何度も書く必要がない
  • 変更箇所を特定
  • 拡張の影響範囲を少なく

--

楽になるように使う

  • 自分
  • 未来の自分
  • チームメンバー
  • 顧客

--

楽にならなければ使う必要はない

  • 1秒でも早く解決する必要がある場合
  • 使い捨てのコード

Class とは?

--

オブジェクトを生成するための設計図あるいはひな形に相当するものである。

クラスには、クラス自身またはクラスのインスタンスが保持するデータと、データに関連したオブジェクトの振る舞いを記述できる。 wikipedia

--

オブジェクト?

その名の通りモノ。特定の何かを表すモノ。

--

Class とは?

  • 特定のモノを表す
  • そのモノに関連するデータと、モノが行う振る舞いを持つ

--

例(datetime.datetime クラス)

  • 日時を表す
  • 日時の振る舞いを持つ
    • 今の日時を取得
    • 特定のフォーマットに日時を変換

オブジェクト指向とは?

--

ソフトウェア設計とプログラム記述の際に用いられる考え方 wikipedia

--

オブジェクト指向とは?

  • 考え方
  • 概念

--

  • だから、難しい
  • だから、正解がない

--

どのようなもの?

プログラムを手順ではなくて、モノの作成と操作として見る考え方

--

プログラム上でモノをどのように表現するか

--

Class

オブジェクトを生成するための設計図あるいはひな形に相当するものである。

--

良いClass設計とは

--

オブジェクト指向に沿ったクラスの設計がされている事


オブジェクト指向のメリット

--

  • 可読性
  • 保守性
  • 再利用性

--

変更に対して柔軟に対応可能

--

3要素

  • カプセル化
  • 継承
  • ポリモーフィズム

カプセル化

オブジェクト指向プログラミングにおけるオブジェクトは、クラスによる情報のカプセル化を行うことで作られる。

公開すべきものはプログラムやモジュールの仕様であって、その実現手段ではない wikipedia

--

つまり?

  • カプセル化とは実装を隠蔽すること
  • 実装を知らなくて良い
  • 使い方がわかれば良い

--

例( datetime.datetime クラス)

  • datetime.datetime クラスの実装を知る必要はない
  • 日時を表わす事がわかっていればそれで良い

--

datetime.datetime

  • 日時を表わす
  • → 今の日時を取得できそう
    • データが不要なのでクラスメソッド
  • → 規定のフォーマットで出力できそう
    • 日時データを保持している必要があるのでインスタンスメソッド

--

クラスの役割は一つ

  • 「クラスAはxxxである。」と簡潔に説明できる必要がある

--

そのクラスを表す名前

  • 「クラスAはxxxである。」と一目で分かる必要がある

継承

--

あるオブジェクトが他のオブジェクトの特性を引き継ぐ場合、両者の間に「継承関係」があると言われる。 wikipedia

--

継承は特性、機能を引き継ぐ

特性を引き継ぐ という点が強調されて、乱用される傾向があるが、機能をまとめる事を目的に使用するものではない

--

継承したクラスは継承元のクラスである必要がある。

AがBを継承している場合、AはBである必要がある。(Is-a関係)

--

継承ではなくコンポジションを使用する

他のクラスを内部で保持することで機能を表現する(Has-a)

--

イメージ

super().hoge() ではなく self.piyo.hoge()


ポリモーフィズム

  • 多態性、多相性、多様性

--

本質的な概念に対して処理を書く

本質的(抽象的)な概念に対して処理を書くべきで、実体に対しての処理を書くべきではない (実体が変更されても動作する)

--

汎用的に作れという事

--

多言語だとinterfaceがあるが、Pythonは動的型付け言語なので型に縛られることなくダッグタイピングでポリモーフィズムを実現可能。

--

尚、ABCモジュールを使用する事でinterface的な事を実現することが可能です


Class と関数の違い

--

Class とは?(再掲)

  • 特定のモノを表す
  • そのモノに関連するデータと、モノが行う振る舞いを持つ

--

違い

  • 特定のモノに関連しない処理
    • (明示的に関連していない)
  • データを保持できない
    • 厳密にはできる(クロージャ)

--

使い分け

  • 明示的に関連付けする事でわかりやすくなるか
  • データを保持すると楽になるか

--

簡潔に

  • システムだと必須
  • 単一のスクリプト、ノートブックでは無理に使用する必要はない
  • が、検討する価値は十分にある

まとめ

--

  • オブジェクト指向は概念
  • 手順ではなくて、モノの作成と操作として見る
  • 可読性、保守性、再利用性がメリット
  • 楽にならない場合には使用する必要はない
    • が、検討してみる

--

参考


ご清聴ありがとうございました