SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Downloaden Sie, um offline zu lesen
オブジェクト指向とは何ですか?
@sumim
slideshare.net/sumim
2019/6/29
とちぎRuby会議08
オブジェクト指向とは何ですか?
オブジェクト指向とは何ですか?
• カプセル化、継承、ポリモーフィズム?
• オブジェクトにメッセージを送る?
オブジェクト指向とは何ですか?
• カプセル化、継承、ポリモーフィズム?
• オブジェクトにメッセージを送る?
• デザパタこそその本質?
• SOLIDという原則?
• OOUX/UI?
• OOO?
オブジェクト指向とは何ですか?
• カプセル化、継承、ポリモーフィズム?(OOP)
• オブジェクトにメッセージを送る?(OOP)
• デザパタこそその本質?(OOD)
• SOLIDという原則?(OOD)
• OOUX/UI?
• OOO?
オブジェクト指向プログラミングとは何ですか?
• カプセル化、継承、ポリモーフィズム?(OOP)
• オブジェクトにメッセージを送る?(OOP)
• デザパタこそその本質?(OOD)
• SOLIDという原則?(OOD)
• OOUX/UI?
• OOO?
節子、それ別のOOPや!
• カプセル化、継承、ポリモーフィズム(OOP)
• オブジェクトにメッセージを送る(OOP)
同じ「OOP」と名付けられた2つのアイデアの要約
“カプセル化、継承、ポリモーフィズム”
= ビアルネ・ストラウストラップらのOOP
“オブジェクトにメッセージを送る”
= アラン・ケイのOOP
同じ「OOP」と名付けられた2つのアイデアの要約
“カプセル化、継承、ポリモーフィズム”
= ビアルネ・ストラウストラップらのOOP
C++の設計者
“オブジェクトにメッセージを送る”
= アラン・ケイのOOP
「パソコンの父」(ダイナブックの発案者)
Smalltalkの設計者(考案者)
こちらも要注意!
“カプセル化、継承、ポリモーフィズム”
= ストラウストラップらのOOP ≠ C++の言語仕様
C++の設計者
“オブジェクトにメッセージを送る”
= ケイのOOP ≠ Smalltalkの言語仕様
Smalltalkの設計者(考案者)
qr.ae/TWTiEu
Quora「オブジェクト指向とは何ですか?」への回答
TL;DR
始めに「クラス」と「オブジェクト」ありき
─「オブジェクト指向プログラミング」のアイデア以前─
Simula 67 (オルヨハン・ダール&クリステン・ニガード)
前身の SimulaⅠ はシミュレーション言語 → コルーチンでブロック延命
Simula 67では、ALGOLの拡張案の「レコード・クラス」をヒントに
「オブジェクト・クラス」とそのインスタンスの「オブジェクト」を考案
→ 関連する手続きをクラスに内包(メンバープロシージャ)
継承による差分プログラミング等ほとんどのOOPLの特徴を有した
…が、
• カプセル化は不完全で情報隠蔽はナシ
• メッセージという考え方はナシ
ビアルネ・ストラウストラップらのOOP
「What is “Object-Oriented Programming”?」 [1987, 1991改訂]
→ what-is stroustrup で検索!
抽象データ型およびその部分型の定義に「クラス」とその継承機構
を使うアイデア(ただし前後して複数のグループが独自に発案)
※「抽象データ型」は「ユーザー定義型」と読み替えて良い
具象データ型(int, float, string等、言語組み込みの型)に対する
「抽象」の、つまりユーザー定義のデータ型ということ
• カプセル化 = 抽象データ型の特徴
• 継承 = クラスの特徴
• ポリモーフィズム = 継承を使った部分型定義
キモ: 多くを早期に決定し、確実・安全を目指す
(差分プログラミング)
(抽象データ型のスーパーセット)
アラン・ケイのOOP
「Is “Software Engineering” an Oxymoron?」 [2002]が比較的よい
→ oxymoron kay で検索!
「オブジェクト」と“メッセージ”を使ってインターネットを模倣したプロ
グラミングを実践するアイデア(厳密にはSimula 67以前から着想)
• オブジェクト = 小さなコンピューター
• メッセージ = 高速なLAN接続を介して伝えられる情報
コンピューターを「データ型」や「手続き」「関数」といった、無機的な
部品に分解してしまうのではなく、「コンピューター」のまま活用
コンピューター(つまりオブジェクト)を組み合わせてより高度な機能
を持つコンピューター(同オブジェクト)を再帰的に作る
キモ: 極力、決定を遅延し、予測不能な変化にも対応可能に
Smalltalkの系譜
• Smalltalk-72 … タートル描画が使えるスクリプト言語
• Smalltalk-74 … -74+高速描画ルーチン(BitBLT)→GUI
• Smalltalk-76 … -72とは別物。“省コスト版”メッセージング発明
• Smalltalk-78 … 8086でも動かせるコンパクト版-76
• Smalltalk-80 … 実験色を排除し商用言語処理系(IDE)へ
Smalltalk-72 Smalltalk-74 Smalltalk-76 Smalltalk-80
Reenskaug, Jobs, ..
Beck, Cunningham,
Armstrong, D.Thomas...
3 に + 4 を送ると 7 を返す!
MVC!
・クラスはJavaScriptのような関数(if式のネスト) → メソッドはパターン記述の一
・継承はない → 無いとつらいと気がついて-76ではSimulaタイプのクラス導入へ
条件 ⇒(非false時の処理) false時の処理,条件分岐式 … ? キーで入力
∢(アイボール),パターンマッチ … 同、%
☺(スマイリー),タートル(クラス turtle のインスタンス) … 同、@
☞(指さし矢印)+文字列,シンボルリテラル表現(主に変数) … 同、"
:(コロン),解釈中メッセージ内の次のオブジェクトの読み込み
・メッセージはメソッド呼び出しではなくトークン列 → ただし非同期ではない
Smalltalk-72
Smalltalk-72 エミュレーター bit.ly/st72emu
Joe the box デモ … box クラスを定義し、メッセージを送って操作
Webで気軽に動かせるSmalltalk処理系と言えば…
SquakJS(squeak.js.org)の動作例のひとつ → Mini Squeak 2.2
Squeak 2.2 (1998年ごろリリース)を
Smalltalk-80として動作するギリギリ
まで色々そぎ落とした処理系・環境
「決定の遅延」をどこまでサポートするか? vs Ruby
例1: オープンクラス
Rubyも同様の機能を有するが、
Smalltalkでは、インタラクティブ、インクリメンタルな開発スタイルの
ためにより積極的に活用。
クラス定義 → メソッドを追加
LISP処理系に似た、エラーからの復旧の機構も。
実行中に中断 → メソッド等を追加して続行
「決定の遅延」をどこまでサポートするか?
「決定の遅延」をどこまでサポートするか? vs Ruby
例2: インスタンス変数の追加
RubyはHashライク(インスタンスベース)な機構なので不要。
"Smalltalk"
Object subclass: #C
instanceVariableNames: 'foo bar ' ...
TEMP ← C new.
Object subclass: #C
instanceVariableNames: 'foo bar baz ' ...
TEMP inspect
「決定の遅延」をどこまでサポートするか? vs Ruby
例3: スーパークラスのすげ替え
Rubyでは不可。
#Ruby
class B1; end
class B2; end
class C < B1; end
class C < B2; end #TypeError (superclass mismatch for class C)
"Smalltalk"
Object subclass: #B1...
Object subclass: #B2...
B1 subclass: #C...
B2 subclass: #C...
C superclass "=> B2 "
「決定の遅延」をどこまでサポートするか? vs Ruby
例4: オブジェクトのすり替え(become:)
Rubyではstring限定、かつ、置き換えのみ。
#Ruby
str1 = "string1"
str2 = str3 = "string2"
str2.replace(str1)
p str3 #=> "string1"
"Smalltalk"
| string float |
string := 'string'.
float := 1.0.
string become: float.
{string. float} "=> (1.0 'string' ) "
「決定の遅延」をどこまでサポートするか? vs Ruby
例5: 永続化
そもそも、決定を遅延するためには、オブジェクトが永続的に存在し
ないと効果が薄い。
Smalltalkではすべてのオブジェクトが永続化を前提としている。
スナップショット(save) → 「仮想イメージ」
文字通り“時空”を超えてオブジェクトを永続させられる。
• プラットフォームとしてのアルトが死んでもSmalltalkは生き残った
• マシンを変えて開発・運用を続行可能
「決定の遅延」をどこまでサポートするか? vs Ruby
例6: 文法の拡張
Rubyで試験導入されたパイプライン演算子(|>)もどきを追加。
#Ruby
(1 .. 10).select{ |x| x % 2 == 1 }.collect{ |x| x * 3 } #=> [3, 9, 15, 21, 27]
1 .. 10 |> select{ |x} x % 2 == 1 } |> collect{ |x| x * 3 } #=> [3, 9, 15, 21, 27]
"Smalltalk"
((1 to: 10) select: [:x | x ¥¥ 2 = 1]) collect: [:x | x * 3]
3 + 4 + 5 "=> 12 "
3 + 4; + 5 "=> 8 " ← カスケード糖衣構文 ←
1 to: 10; select: [:x | x ¥¥ 2 = 1]; collect: [:x | x * 3] "=> ? "
もう少しまじめにてんてん
1 to: 10 :> select: [:x | x ¥¥ 2 = 1] :> collect: [:x | x * 3] "=> ? "
| temp |
temp := 3.
temp + 4.
temp + 5.
これを流用
まとめ
• オブジェクト指向には大きく分けて2つのアイデアがある
✓ クラスをデータ型として活用する地に足つけたプログラミング
✓ インターネットや生命を模した“未来を作る”プログラミング
• 混ぜてはダメだが、よく理解し背反しない良いとこ取りはアリ?
✓ 現状を“混乱”ととるとネガだが、すりあわせ・現実解とも
✓ この2つの混ぜ物でOODA等の「OO~」を読み解くと面白い
• 何も知らずに処理系からの類推は危険→まず発案者の著作を!
その上で…
• Smalltalkで遊んでおくと、“最新”技術にも耐性ができる…かも?
MVCのすばらしいまとめ!
scrapbox.io/tasuwo/ソフトウェアアーキテクチャの歴史

Weitere ähnliche Inhalte

Was ist angesagt?

設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
 

Was ist angesagt? (20)

強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
 
高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!
 
MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編MySQL勉強会 クエリチューニング編
MySQL勉強会 クエリチューニング編
 
SSMSでSQL Serverの実行計画を見てSQLチューニング
SSMSでSQL Serverの実行計画を見てSQLチューニングSSMSでSQL Serverの実行計画を見てSQLチューニング
SSMSでSQL Serverの実行計画を見てSQLチューニング
 
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くかDDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
DDDはオブジェクト指向を利用してどのようにメンテナブルなコードを書くか
 
アジャイル開発のストーリーをGherkin記法で作成
アジャイル開発のストーリーをGherkin記法で作成アジャイル開発のストーリーをGherkin記法で作成
アジャイル開発のストーリーをGherkin記法で作成
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
階層的決定性ウォレットを理解しよう
階層的決定性ウォレットを理解しよう階層的決定性ウォレットを理解しよう
階層的決定性ウォレットを理解しよう
 
ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
5分でわかるGoのポインタ
5分でわかるGoのポインタ5分でわかるGoのポインタ
5分でわかるGoのポインタ
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 

Ähnlich wie オブジェクト指向とは何ですか? (7)

オブジェクト指向っぽい話
オブジェクト指向っぽい話オブジェクト指向っぽい話
オブジェクト指向っぽい話
 
第2回勉強会 オブジェクト指向
第2回勉強会 オブジェクト指向第2回勉強会 オブジェクト指向
第2回勉強会 オブジェクト指向
 
マルチスレッド学習のミッシングリンク
マルチスレッド学習のミッシングリンクマルチスレッド学習のミッシングリンク
マルチスレッド学習のミッシングリンク
 
オブジェクト指向勉強会(基礎)
オブジェクト指向勉強会(基礎)オブジェクト指向勉強会(基礎)
オブジェクト指向勉強会(基礎)
 
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフトobjc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
objc2swift 〜 Objective-C から Swift への「コード&パラダイム」シフト
 
CVPR2018 参加報告(速報版)2日目
CVPR2018 参加報告(速報版)2日目CVPR2018 参加報告(速報版)2日目
CVPR2018 参加報告(速報版)2日目
 
TypeScript でオブジェクト指向プログラミング
TypeScript でオブジェクト指向プログラミングTypeScript でオブジェクト指向プログラミング
TypeScript でオブジェクト指向プログラミング
 

Mehr von sumim (6)

Smalltalk ~ ユーザーイリュージョンの黎明
Smalltalk ~ ユーザーイリュージョンの黎明Smalltalk ~ ユーザーイリュージョンの黎明
Smalltalk ~ ユーザーイリュージョンの黎明
 
アラン・ケイ氏の未来の創り方
アラン・ケイ氏の未来の創り方アラン・ケイ氏の未来の創り方
アラン・ケイ氏の未来の創り方
 
20200504 Smalltalkを学ぶ会 (リモート開催) - Smalltalkについて
20200504 Smalltalkを学ぶ会 (リモート開催) - Smalltalkについて20200504 Smalltalkを学ぶ会 (リモート開催) - Smalltalkについて
20200504 Smalltalkを学ぶ会 (リモート開催) - Smalltalkについて
 
アラン・ケイ氏の創ってきた未来 ~アルトを中心に~(参照資料リンク入り改訂版→青字の文字化けは引用元動画等へのリンクです^^;)
アラン・ケイ氏の創ってきた未来 ~アルトを中心に~(参照資料リンク入り改訂版→青字の文字化けは引用元動画等へのリンクです^^;)アラン・ケイ氏の創ってきた未来 ~アルトを中心に~(参照資料リンク入り改訂版→青字の文字化けは引用元動画等へのリンクです^^;)
アラン・ケイ氏の創ってきた未来 ~アルトを中心に~(参照資料リンク入り改訂版→青字の文字化けは引用元動画等へのリンクです^^;)
 
IT25・50ライブビューイング@札幌・前説
IT25・50ライブビューイング@札幌・前説IT25・50ライブビューイング@札幌・前説
IT25・50ライブビューイング@札幌・前説
 
20120916 ぬRubyKaigi RubyistのためのSqueak Smalltalk超入門
20120916 ぬRubyKaigi RubyistのためのSqueak Smalltalk超入門20120916 ぬRubyKaigi RubyistのためのSqueak Smalltalk超入門
20120916 ぬRubyKaigi RubyistのためのSqueak Smalltalk超入門
 

Kürzlich hochgeladen

Kürzlich hochgeladen (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

オブジェクト指向とは何ですか?