Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java初心者が知っておくべきプログラミングのこと - JJUG CCC 2022 Spring

Java初心者が知っておくべきプログラミングのこと - JJUG CCC 2022 Spring

2022年6月19日に開催されたJJUG CCC 2022 Springでの登壇資料です

Avatar for Naoki Kishida

Naoki Kishida

June 10, 2022
Tweet

More Decks by Naoki Kishida

Other Decks in Programming

Transcript

  1. JJUG CCC 2022 Spring 自己紹介 • きしだ なおき (@kis) •

    LINE Fukuoka • 「プロになるJava」デテマス • 今日の話の具体的なコードのせてます
  2. JJUG CCC 2022 Spring プログラミング技術 • プログラミング技術は大きくわけて2つ • プログラムを動かすための技術 •

    計算論 • アルゴリズム • プログラムを作るための技術 • Javaの文法 • 標準ライブラリ • オブジェクト指向 • テスト
  3. JJUG CCC 2022 Spring プログラミング技術 • プログラミング技術は大きくわけて2つ • プログラムを動かすための技術 •

    計算論 • アルゴリズム • プログラムを作るための技術 • Javaの文法 • 標準ライブラリ • オブジェクト指向 • テスト 知らないと動かせない 知らないと書けない
  4. JJUG CCC 2022 Spring プログラミング技術 • プログラミング技術は大きくわけて2つ • プログラムを動かすための技術 •

    計算論 • アルゴリズム • プログラムを作るための技術 • Javaの文法 • 標準ライブラリ • オブジェクト指向 • テスト 入門書がない 入門書がある
  5. JJUG CCC 2022 Spring プログラミング技術 • プログラミング技術は大きくわけて2つ • プログラムを動かすための技術 •

    計算論 • アルゴリズム • プログラムを作るための技術 • Javaの文法 • 標準ライブラリ • オブジェクト指向 • テスト 入門書がない 入門書がある 入門書を読んでも 動くプログラムが書けない
  6. JJUG CCC 2022 Spring プログラミング技術 • プログラミング技術は大きくわけて2つ • プログラムを動かすための技術 •

    計算論 • アルゴリズム • プログラムを作るための技術 • Javaの文法 • 標準ライブラリ • オブジェクト指向 • テスト 入門書がない 入門書がある プログラムを動かせないと意味がないのに 入門書にある プログラムを動かすのに必要っぽく 書いてあったりする 入門書を読んでも 動くプログラムが書けない
  7. JJUG CCC 2022 Spring プログラミング技術 • プログラミング技術は大きくわけて2つ • プログラムを動かすための技術 •

    計算論 • アルゴリズム • プログラムを作るための技術 • Javaの文法 • 標準ライブラリ • オブジェクト指向 • テスト おおまかに載ってます
  8. JJUG CCC 2022 Spring 話すこと • プログラムを動かすための技術 • プログラムの処理がなぜ難しいか •

    処理の難しさの分類 • プログラムを作るための技術 • オブジェクト指向がなぜ難しいか • オブジェクト指向をうまく使うには
  9. JJUG CCC 2022 Spring 話すこと • プログラムを動かすための技術 • プログラムの処理がなぜ難しいか •

    処理の難しさの分類 • プログラムを作るための技術 • オブジェクト指向がなぜ難しいか • オブジェクト指向をうまく使うには
  10. JJUG CCC 2022 Spring 状態遷移の理解 • プログラムの処理では状態が変わっていく • 通常の文章は状態一定 •

    推理小説でも「犯人はヤス」という状態を徐々に記述している • 途中を飛ばしたり、読む順番を入れ替えても、表現される状態は変わらない • プログラムは途中を飛ばしたり実行する順番を入れ替えると保持する 状態が変わる • 状態が変わっていくこと=状態遷移を理解する必要がある
  11. JJUG CCC 2022 Spring 計算の複雑さ • 計算自体に複雑さがある • 複雑さには階層がある •

    組み合わせ論理 • 有限オートマトン • プッシュダウンオートマトン • チューリングマシン
  12. JJUG CCC 2022 Spring 計算の複雑さ • 計算自体に複雑さがある • 複雑さには階層がある •

    組み合わせ論理(状態がない) • 有限オートマトン(状態がある) • プッシュダウンオートマトン(スタックが必要) • チューリングマシン (スタックが二つ必要=なにかデータ構造が必要)
  13. JJUG CCC 2022 Spring 計算の複雑さ • 計算自体に複雑さがある • 複雑さには階層がある •

    組み合わせ論理(論理素子の結線で実装可) • 有限オートマトン(クロックとレジスタが必要) • プッシュダウンオートマトン(FIFOが必要) • チューリングマシン (自由にアクセスできるメモリが必要)
  14. JJUG CCC 2022 Spring 話すこと • プログラムを動かすための技術 • プログラムの処理がなぜ難しいか •

    処理の難しさの分類 • プログラムを作るための技術 • オブジェクト指向がなぜ難しいか • オブジェクト指向をうまく使うには
  15. JJUG CCC 2022 Spring 処理の難しさ • 計算複雑さは理論的で実感とは異なる • 逐次処理はどこを実行しているかの状態をもつ •

    有限オートマトン以上の複雑さになる • 多くの処理ではスタックは不要 • プッシュダウンオートマトンよりは単純
  16. JJUG CCC 2022 Spring 処理の難しさの分類 • ループがない • ループの各処理が独立 •

    集計が必要 • 他のデータを利用 • 隠れた状態を扱う • 状態を明示的に管理する • スタックが必要
  17. JJUG CCC 2022 Spring 隠れた状態を扱う • 隠れた状態をみつける必要がある • 変数で管理する必要がある •

    例:ランレングス圧縮 カッコが対応しているか検査 https://nowokay.hatenablog.com/entry/2022/04/26/183544
  18. JJUG CCC 2022 Spring 状態を明示的に管理する • 状態の遷移が複雑で管理が必要 • 状態遷移図を書く •

    各状態の処理は単純なので難しさに 気づかずたくさんのフラグを導入してしまう ことがある • 例:文字列が実数として妥当か判定 受注・入金・発注などの管理
  19. JJUG CCC 2022 Spring スタックを使う • 入れ子のある処理 • 再帰を使って書ける •

    例:深さ優先探索 カッコ付数式処理 種類のあるカッコの対応を判定
  20. JJUG CCC 2022 Spring 話すこと • プログラムを動かすための技術 • プログラムの処理がなぜ難しいか •

    処理の難しさの分類 • プログラムを作るための技術 • オブジェクト指向がなぜ難しいか • オブジェクト指向をうまく使うには
  21. JJUG CCC 2022 Spring オブジェクト指向がハマるところは? • GUIフレームワークを作るとき • 作る機会はめったにない •

    つまりオブジェクト指向がハマる機会はめったにない • オブジェクト指向が流行ったタイミングでGUIプログラミングが流行り 始めたので、いろいろなプログラミングにオブジェクト指向がハマる と勘違いしたのではと思っている
  22. JJUG CCC 2022 Spring オブジェクト指向とはなにか • 「データ構造と振る舞いが一体となったオブジェクトの集まりと してソフトウェアを組織化すること」 ~「オブジェクト指向方法論OMT」ジェームズ・ランボー~ •

    OMTは「オブジェクト指向」の重要な源流のひとつ • ジェームズ・ランボー • 1980年代のオブジェクト指向ブームの中心人物のひとり • ブーチ、ヤコブソンと共に「スリーアミーゴズ」と呼ばれた • OMT、ブーチ法、OOSEを統合するときの統一記法がUML
  23. JJUG CCC 2022 Spring オブジェクト指向とはなにか • オブジェクト指向の基準 (「オブジェクト指向入門」~バートランド・メイヤー) • 「支援する方法論も含めて、オブジェクト指向言語および環境は、ラ

    イフサイクル全体に適用され、作業段階の間の隔たりを最小限にする ものでなければならない」 • 「クラスが唯一のモジュールでなければならない」 • 「すべての型はクラスに基づいていなければならない」 • モジュールと型が一致する
  24. JJUG CCC 2022 Spring オブジェクト指向の特徴 • カプセル化 • データの一部を外部からみえなくする •

    データとデータに対する操作をまとめることで実現する • 多態(ポリモーフィズム) • 同じメソッド呼び出しが、操作対象によって振る舞いを変えること • 継承 • クラスの機能を再利用して拡張する • 型理論の部分型(サブタイピング)を実現する
  25. JJUG CCC 2022 Spring オブジェクト指向の特徴の実際 • カプセル化 • 抽象データ型としてオブジェクト指向以前から存在した •

    カプセル化をクラスとして実現するのがオブジェクト指向、といえる • 多態(ポリモーフィズム) • 関数を値としてもつことでオブジェクト指向以外でも実現化 • Javaの場合はラムダ式 • 継承 • 機能を再利用するというコンセプトはオブジェクト指向に固有といえ そうだけど、あまり機能の再利用としては使われなくなっている • 型理論の部分型として考えるほうが整理されている
  26. JJUG CCC 2022 Spring オブジェクト指向の特徴の実際 • カプセル化 • 抽象型としてオブジェクト指向以前から存在した •

    カプセル化をクラスとして実現するのがオブジェクト指向、といえる • 多態(ポリモーフィズム) • 関数を値としてもつことでオブジェクト指向以外でも実現化 • Javaの場合はラムダ式 • 継承 • 機能を再利用するというコンセプトはオブジェクト指向に固有といえ そうだけど、あまり機能の再利用としては使われなくなっている • 型理論の部分型として考えるほうが整理されている オブジェクト指向に こだわらなくていいのでは
  27. JJUG CCC 2022 Spring 「パラダイム」にだまされているのでは • イメージ:パラダイムはアプリケーション実装方針の枠組み • 実現するためにそのパラダイムの言語を使う •

    実際:パラダイムは言語機能の枠組み • 言語はいろいろなパラダイムの言語機能を独自の方針で組み込む • アプリケーション実装方針は言語次第 要求 アプリケーション オブジェクト指向 Java オブジェクト指向言語なら 同じ実装方針のまま代替可 イメージ 要求 アプリケーション Java オブジェクト指向 関数型 構造化 実際 言語が変わると 実装方針も変わる
  28. JJUG CCC 2022 Spring 「パラダイム」にだまされているのでは • 言語非依存な「オブジェクト指向プログラミング」なんてない • パラダイムに沿ったオブジェクト機能がある •

    言語によって「オブジェクト機能」の実現方法が違う • 言語によって「オブジェクト機能」以外の機能との関係も違う • 結局、言語ごとに言語機能を活かしてプログラミングする オブジェクト指向に こだわらなくていいのでは
  29. JJUG CCC 2022 Spring 話すこと • プログラムを動かすための技術 • プログラムの処理がなぜ難しいか •

    処理の難しさの分類 • プログラムを作るための技術 • オブジェクト指向がなぜ難しいか • オブジェクト指向をうまく使うには
  30. JJUG CCC 2022 Spring 話すこと • プログラムを動かすための技術 • プログラムの処理がなぜ難しいか •

    処理の難しさの分類 • プログラムを作るための技術 • オブジェクト指向がなぜ難しいか • オブジェクト指向機能をうまく使うには
  31. JJUG CCC 2022 Spring アプリケーションのアーキテクチャ • アプリケーションの構造はレイヤー構造が主流 • レイヤーは関数的 •

    クラスは単なる関数置き場 • プログラム的には自由に統合分割できる • データはオブジェクト • 操作はデータの正規化、別表現の生成 • 他のデータと直接やりとりしない
  32. JJUG CCC 2022 Spring レイヤーを流れるデータはオブジェクト指向か • 「データ構造と振る舞いが一体」になっている • 「オブジェクトの集まりとしてソフトウェアを組織化」 してるほどではない

    • 「ライフサイクル全体に適用され」てるとは言えない • レイヤーが変わるときに詰め替えることがある オブジェクト指向と 言ってもいいかもしれないが 余分な話がついてくるので 抽象データ型と考えるのが いいんでは
  33. JJUG CCC 2022 Spring プログラムを作る技術のまとめ • プログラムを動かすための技術ではない • まずは動かせるようになろう •

    オブジェクト指向が適用できるところは限定的 • 現代のアプリケーション構造にあわせて利用方法を絞る • オブジェクト機能としてJava言語の機能に集中する
  34. JJUG CCC 2022 Spring まとめ • プログラミングは作り方だけじゃなく動かし方も勉強する 必要がある • JShellやデバッガで逐次実行を確認しよう

    • ループを分類して、難しいループも書けるようにしよう • 入門書を読んでるとオブジェクト指向に惑わされることがある けど、プログラムが動かせるようになってから考えよう • Javaの機能を使いこなすことを考える