#ooltjp©2020 RAKUS Co., Ltd.オブジェクト指向を学んでから20年間でモヤッたことIsamu Suzuki2020.2.5
View Slide
#ooltjp鈴木 勇 / Isamu Suzuki@moomooya株式会社ラクス● 新卒採用イベントやったり● 技術選定したり● 社内傭兵やったり● 社内勉強会開いたり● OORC出まぁす!● Node.jsおじさん● Pythonおじさん AtCoderはまだ灰色● 勉強会レポ最速おじさん● MSA考えるの好きおじさん● アナログゲームデザイナー
#ooltjpまずは宣伝技術書典8 1日目(2/29)い05 浄瑠璃ソフト天遊団 さんにて委託販売予定です
#ooltjpオブジェクト指向との出会い
#ooltjp思い起こせば約20年前……● 高校1年生● 主にC言語● 「ほぉ……オブジェクト指向とな……」○ C++やりはじめて軽く挫折○ なぜかTurbo Pascalで学習■ 『ゲーム&&オブジェクト指向プログラミング』
#ooltjpオブジェクト指向プログラミング完全に理解した()
#ooltjpOOPについて友人と語り合った高校時代高校時代に議論してた内容(遠い記憶を掘り起こしながら)この頃Java1.2がリリースされたのでJava使い始めました。「多態性めっちゃ便利、でも同名メソッドはちゃんと同じ振る舞いさせないと」「インタフェースイケてる、実装の差し替え(DI)素晴らしい」「現実世界の射影だからコード設計わかりやすい」オブジェクト指向大好きマンになりました
#ooltjp大学時代もOOPゼミでオセロAIを組むときも「石とボードとプレイヤーと……」といった具合に素直にオブジェクト指向でクラス設計していました。
#ooltjpで、社会人
#ooltjpMoya1: プロダクトコードでのJava● あまり機能が使われていなかった○ 多態性○ 継承(Abstract, Interface)○ (思い出したら)● 実装者のレベルがばらつくため制限○ まあ分かる……わかる……けど○ 当時SIerで半分くらい派遣エンジニア、という環境でした
#ooltjpMoya2:多態性(というかオーバーロード)の履き違い↑大抵こんな感じになると思うたまに全然違う処理を実装し始める輩がいる……そんな地獄がありました。public class Polymorphism {void set(int a, int b, boolean c) {// ...}void set(int a) {this.set(a, 1, false); // ↑のメソッドをデフォルト値で補完して呼んでる}}
#ooltjpMoya3:DI=DIコンテナ?● 疎結合は正義● DIも好き● だがDIコンテナが好きとは限らない○ 「とりあえずSpring」……じゃねーですよ怒
#ooltjpDI的な実装public class App {private static final Dependency processor = new DependencyImpl();public static void main(String[] argv) {Client client = new Client(processor);client.run();}}public class AppTest {private static final Dependency processor = new DependencyMock();public static void main(String[] argv) {Client client = new Client(processor);client.run();}}
#ooltjpDI的な実装public class App {private static final Dependency processor = new DependencyImpl();public static void main(String[] argv) {Client client = new Client(processor);client.run();}}public class AppTest {private static final Dependency processor = new DependencyMock();public static void main(String[] argv) {Client client = new Client(processor);client.run();}}本番用実装モック実装←テストコード
#ooltjpDI的な実装public class App {private static final Dependency processor = new DependencyImpl();public static void main(String[] argv) {Client client = new Client(processor);client.run();}}public class AppTest {private static final Dependency processor = new DependencyMock();public static void main(String[] argv) {Client client = new Client(processor);client.run();}}本番用実装テスト用モック←テストコードDIでの切り替えケースが● モック利用● テストケースくらいならこれで十分より複雑な切り替えが必要→DIコンテナは有用そんな複雑なシステムどれだけある?(そしてそんな複雑なシステムだとリブートなしで切り替えたかったりもする)
#ooltjp何が言いたいかというと
#ooltjpSpark Frameworkを使え! #推しFW
#ooltjpMoya4:MVCはオブジェクト指向?続きはObject-Oriented Rejected Conference にて!
#ooltjpThank you