天の月

ソフトウェア開発をしていく上での悩み, 考えたこと, 学びを書いてきます

JJUGナイトセミナー「オブジェクト指向プログラミング入門」に参加してきた

jjug.doorkeeper.jp

こちらのイベントに参加してきたので、会の様子と感想を書いていこうと思います。

イベント概要

今回のナイトセミナーでは「オブジェクト指向プログラミング」がテーマです。
Software Design 2021年3月号で「Javaでもう一度学び直すオブジェクト指向プログラミング」の特集を執筆された谷本さん、水島さん、増田さんによるセッション&座談会をお送りします。
座談会ではみなさんからの質問もお待ちしております。

せっかくオンラインで実施するので、気になるところや質問などを、チャットなどで書いてもらえると嬉しいです。オフラインではできないことをやりたいので、みなさまわいわいご参加ください!

gihyo.jp

イベントの様子

以下、時系列でイベントの様子を書いていきます。

なぜ設計を学ぶ必要があるのか by 谷本 心さん

システム設計していく際に必要な、"抽象化"にフォーカスを当てて設計をなぜ学ぶ必要があるのかを谷本さんが話してくれました。
過去の設計経験を抽象化して次の経験に活かしていくために、設計→実装→設計→実装→設計...という風に具体と抽象を行き来することが重要だという話や、抽象化することで人間の既成概念に近い状態に捉えるための道具の一つがオブジェクト指向設計だという話がありました。
オブジェクト指向設計が万人に受けるものではないけど、人間の既成概念に近い形で理解したい人は学ぶ価値があるという話は、納得感があり面白かったです。
分かりやすく、聴いていてすんなりと頭に入ってくる発表でした!

オブジェクト指向と関数型を組み合わせる by水島 宏太さん

オブジェクト指向*1と関数型*2は直交している(自由に組み合わせられる)という話から始まり、これによって関数型とオブジェクト指向の利点を両方享受することができることを話してくれました。
具体的にオブジェクト指向と関数型を組み合わせる例(BigIntegerなど)があったり、イミュータブルオブジェクトを現場で実践するための具体的な方法(Record)を発表してくれたのがありがたかったです。

クラス設計本格入門 by 増田 亨さん

Software Design 2021年3月号で書いたような考えに至った背景の話をしてくれました。
増田さんは良いクラスの設計を考え続けていった結果、クラスの設計はプログラムの分割(&ロジックとデータの集約)だという考えに至るようになり、小クラス分割主義(プログラムをなるべく小さく分割する)を主張するに至ったということでした。*3
その上で、具体的に増田さんがどのようにクラスを作っていくかという話をしてくれたのですが、ここで「分割する労力も分割する」*4という話があり、印象的でした。
増田さんが実際にどのようにプログラムを書いていくか、改善していくかという話を後半はしてくれたのですが、めちゃくちゃ実践的で分かりやすかったです。*5

座談会

増田さんの発表の流れで、座談会に進んでいきました。
超豪華な3人が座談会しているので面白いのは分かり切っていたのですが(笑)、幾つも面白いテーマがありました。
以下、話していたテーマをざっくりと書いていきます。

  • アジャイルを提唱している人は、データモデリングやデータベース、ハードウェア系の知識など、基礎的素養がある人達である。そのような人たちが実践主義だ、ドキュメントよりも実際に動くものだ、というのは分かるけど、プログラミング初心者にいきなり実際に動いて価値があるものを求めるというのは酷だし過程を踏めていないかもしれない。
  • 犬猫でオブジェクト指向プログラミングを教えるのはナンセンスだが、デザインの分類といった観点で説明するのはあり。ただ、コンテキストを丁寧に説明したりしないといけないので、あまりいい説明例ではない。(普通にintとlongとnumberで良いのでは...)
  • 初学者とたとえ話の相性には脆さがある。たとえ話しないといけない時点で初学者には難しいし、分かった気になるけど全然違う理解をしている、みたいなことも起こりやすい。
  • Java SE APIの設計についての意見(コレクション不変にして欲しい、String役割持ちすぎ(値になっていいかも)、ファイルIO系はクラスを分割しすぎている、ファイルIO系は分割に拘るあまりユースケースがあまり考えられていない、後方互換性があるため古いAPIが残っていて初学者は学びにくい、新しいクラスだけ覚えればいいわけではなく、古いクラスが未だに使われている所もある)
  • オブジェクト指向が必要ない、好きじゃないというスタンスをわざわざ表明する必要はないんじゃないかと思う。構造化プログラミングでできることを表明するのは良いと思う。
  • 谷本さんはstaticメソッドはもうあまり使わない。増田さんはオブジェクト生成する際はstatic使う。例えばstatic factory methodとか。
  • Utilityクラスが盲信的にstaticメソッドで作られるようになり、日付とか現在時刻を返すメソッドでモックが作り辛い問題が出てきた。
  • 継承はいつするか分からないものだと谷本さんは考えているので、継承を言語仕様レベルで制限するのはあまり好きではない。一方増田さんは、言語仕様レベルで継承は塞いだ方がいいと思っている。継承はうまく使えばいいけど副作用の方が大きい。

全体を通した感想

最初のプレゼンも座談会も大満足で、面白かったです。
特に座談会は、こういったオンラインイベントならではのお話が聞けた実感がありました。登壇者の3人だけではなく、コメントも玄人の方々が多く、楽しみどころが多数あって最高のイベントでした!
初めてのJJUGイベントでしたが、めちゃくちゃ楽しかったのでまた次回も参加しようと思います!

*1:オブジェクト指向プログラミングの略

*2:関数型プログラミングの略

*3:勿論どんな時も小さく分ければ分けるほどいいという訳ではないけど、小さくした時のメリットが大きいので、場面ごとに適切な大きさを考えるはもののできる限りクラスを小さくしているということでした

*4:まずはこれまで実証済みの形で分割し、そこから漸進的にリファクタリングを積み重ねていく

*5:クラスやメソッドを小さくしていって、その過程で例えばインスタンス変数を使っていないようなメソッド抽出が出てきたらクラスを分けてみる, 実際にこんなクラス名をつけることが多くて、そこからどんなパターンを増田さんは見つけたか, 基本用語+管理システムでググってドメインに関する語彙を増やす(例:在庫管理システム)という話など、かなり具体的かつ実践的な話が挙げられていて感動しました...!