2/16に開催されオブジェクト指向に関するカンファレンスObject Oriented Conference(OOC)のレポートです。 私はYoutube配信でオンライン参加しました。
この記事では今回のカンファレンスに参加して面白かったセッションや勉強になったセッションについてご紹介します。
ちなみに最初に自己紹介をしますと、私は普段は主にRuby on Railsを使ってWebサービスを開発しています。未経験から新卒でサーバーワークスに入社して、プログラミング経験はそろそろ2年くらいになります。 オブジェクト指向については昨年まであまりよくわかっておらず、ググればググるほど難しいキーワードが出てきて諦めて放置していました。 昨年夏ごろにRubyによるオブジェクト指向を解説した『オブジェクト思考設計実践ガイド』を読み、その後Javaでデザイパターンの根底にある考え方を学ぶ『オブジェクト指向のこころ』を一通り読んで、オブジェクト指向についてわかった気になっていたところでした。 ちょうどオブジェクト指向に興味が出てきたところだったので、今回のOOCはとても楽しむことができました。
keynote: Object-Oriented Diversity
1つ目のセッションはつい先日『ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本』を出版された成瀬さんによるオブジェクト指向の多様性についてのお話でした。 スライド: OOC keynote: Object Oriented Diversity - Speaker Deck
このセッションについてはあまりピンとこなかったのですが、オブジェクト指向の「多様性」に関して後日調べてみたところ実はオブジェクト指向プログラミングの考え方は大きく2つに分かれることがわかりました(実装に関してもクラスベースの実装とプロトタイプベースの実装で分かれるようですが、少し調べたところ沼が深そうだったので一旦退却しました。)。
オブジェクト指向とは何ですか?に対するSUMI Mᵃˢᵃᵗᵒ (aka sumim)さんの回答 - Quora
1.「メッセージング(メッセージ送信)による決定の遅延の徹底」
2.「クラスによる抽象データ型の実現(カプセル化・継承・多態性)」
Rubyは2の考え方をベースにしつつも1の考え方も取り入れているようです。
実は上述のRubyで解説された『オブジェクト思考設計実践ガイド』の後に、Javaで解説された『オブジェクト指向のこころ』を読み始めた時、オブジェクト指向の捉え方に若干の違和感を覚えていましたが、単に静的型付けと動的型付けの考え方の違いかと思っていました。
改めて『オブジェクト思考設計実践ガイド』を読むとメッセージ
というキーワードが序盤からどんどん登場するので、こちらはメッセージ指向的な考え方を取り入れた解説の仕方がされていたようです。私の違和感の原因はこれだったのかもしれません。
デザインパターンの使い方を パタン・ランゲージとの比較から考える
次に参加したのはこちらのセッションです。 オブジェクト指向におけるデザインパターンは建築学におけるパターン・ランゲージから影響を受けていることはよく知られています。 この発表では、原典とも言える建築学におけるパターン・ランゲージとの比較からデザインパターンをどう使っていけば良いか考えるという内容で、ちょうど最近読んだ上述の『オブジェクト指向のこころ』とも近い内容でより理解が深まりました。 建築学の考案者であるクリストファー・アレグザンダーのデザインパターンへの評価などは説得力がありました。 また、この発表自体スライドを見ていただければわかる通り参考文献や出典が明記されているため、この内容を元にさらに深く学ぼうと思わせられる内容でした。
スライド: デザインパターンの使い方を パタン・ランゲージとの比較から考える / design-pattern-usage-inspired-by-pattern-language - Speaker Deck
契約による設計事始め
こちらはより具体的に、言語の機能や文法に踏み込んだ内容で、「契約による設計」がテーマでした。
「契約による設計」とは何かというと、あるクラス間の[使用する/ される]という関係をお客さんと提供者(店員?)のやりとりに見立てて、契約を行うようにするという考え方です。
具体的にどう契約を表現するかというと、例えば事前条件
を定義して、あるメソッドの引数に受け取れるデータに条件をつけたり、事後条件
を定義して、あるメソッドの返り値や実行後の状態を一定の範囲内に収めるようにします。
これによって、お客さん側も店員側も考慮する条件分岐が減ったり、責任の所在が明確になり簡潔な書き方でよくなるなどのメリットがあるということです。
スライドで紹介されていたScalaにはこの契約を表現するための文法が備わっているようです。
Rubyには無いようですが、Rubyで契約を表現するためのgemもあったので、今後触ってみたいと思います。
GitHub - egonSchiele/contracts.ruby: Contracts for Ruby.
スライド: https://speakerdeck.com/dnskimo/qi-yue-niyorushe-ji-shi-shi-me Youtube: OOC_D - YouTube
概念投影によるオブジェクト指向設計の考え方とその方法
タイトルからは難しい雰囲気が出ていますが、内容に関してはどちらかというと初心者向けなセッションだと感じました。 私はある程度オブジェクト指向について学んで基本的なパターンは理解して使えるようになった気がしているものの、実際1からアプリケーションを作っていくにはどうやってモデルを書いていけば良いかわからないという状態でした。 このセッションでは、アプリケーションは現実世界の営みを代行する場所であると捉えて、現実世界の知識や営みを投影するようにコードにする考え方が紹介されています。 ドメインモデリングについては全く知らない私ですが、当然現実世界の概念については知っているので、「モデリング全然わからん」から「とりあえずやってみよう!」と思えるようになりました。
スライド: 概念投影によるオブジェクト指向設計の考え方とその方法/Conceptual projection design - Speaker Deck
オブジェクト指向のその前に-凝集度と結合度
オブジェクト指向に限らず、プログラミングにおいて関数を分割する際の考え方としての凝集度と結合度という概念の紹介でした。 関数を分割するという日常的な行為についての内容だったため、今回のセッションの中で一番実践的ですぐに業務に活かせそうな内容です。 凝集度と結合度を意識すると、単機能かつ疎結合な関数やクラスを書けるようになれそうです。 具体例として紹介されていたReactのクラスコンポーネントと関数コンポーネントの比較では、関数コンポーネントの方が凝集度が高くなっている様子がビジュアルで伝わり感動しました。
スライド: オブジェクト指向のその前に-凝集度と結合度/Coheision-Coupling - Speaker Deck
OOC 2021に期待
今回ご紹介したもの以外にも、たくさんのセッションがありました。 スライドや配信は公開されているので、是非チェックして見てください。
今回初の開催、初のYoutube配信とのことでしたが、私が見ている範囲ではほぼトラブルなく、オンラインでもセッションに集中して楽しむことができました。 スタッフの皆さん本当にありがとうございました!
Youtube チャンネル: ObjectOrientedConference - YouTube タイムテーブル: タイムテーブル | Object-Oriented Conference #ooc_2020 - fortee.jp
丸山 礼 (記事一覧)
サービス開発課でCloud Automatorを開発しています。