Slide 1

Slide 1 text

#javado 〈オンライン〉
 Javaを始めた&これから使う人向け
 モブプログラミング会 Javaエンジニアグループ北海道(Java Do) Java Do でしょう #18 1

Slide 2

Slide 2 text

#javado Hiroto YAMAKAWA, @gishi_yama 2 公立千歳科学技術大学 情報システム工学科 専任講師
 R&D: Experimental Development of ICT Systems (ex: City-Bus Tacking System) 
 Computer in Education, Programming and Programmer's Learning 
 
 Communities:

Slide 3

Slide 3 text

#javado 今日のポイント
 Javaを使ってプログラムを
 クラスに分ける練習をする
 3

Slide 4

Slide 4 text

#javado 最近のJavaの流れ・使われどころ 4 ͍Ζ;ʢʣ τϨϯυ͔Βߟ͑ΔϑϦʔϥϯε+BWBΤϯδχΞͷੜଘઓུ
 IUUQTP⒎FSTKQNFEJBTJEFKPCXPSLTUZMFB@ 流れの1つとして、多言語のシステムをJavaへ
 - 後方互換性、実行基盤(JVM)... ドメイン駆動開発などでの利用
 - 静的な型による問題領域とのマッピング
 - ソフトウェア仕様の記述 ૿ాږ ʢʣ ΦϒδΣΫτࢦ޲ϓϩάϥϛϯάͷݱࡏɾաڈɾະདྷ 
 ιϑτ΢ΣΞ։ൃͷ΍Γํͷվળ 
 IUUQTXXXTMJEFTIBSFOFUNBTVEBTT
 IUUQTXXXTMJEFTIBSFOFUNBTVEBTT

Slide 5

Slide 5 text

#javado 後方互換性(長い間継続的に使われる・改良される)の高いソフトウェアだからこそ
 問題領域やソフトウェア記述を表しやすい言語だからこそ  ⇒どんな構造・仕様なのかがプログラム上も分かりやすことが大事
   暗号的なプログラムではなく、構造的・仕様を反映した見通しの良いプログラムへ  ⇒要件や仕様の変更などにあわせてプログラム構造も変更しやすいことが大事
   コンポーネント化、デザインパターン・ドメイン駆動開発パターンなども踏まえた
   変更しやすいプログラムへ 実現するためには色々な手法があるが、
 プログラムで取り扱う対象や処理を 型:クラス に分ける ことが基本のひとつになる
 これがなかなか、知識・経験をため込む段階の駆け出しの頃には難しい...
 Javaの特徴や良いところに合わせたプログラミング方法 5 今日のポイント:Javaでプログラムをクラスに分ける練習をする

Slide 6

Slide 6 text

#javado フィールド  : データを管理する部分 コンストラクタ: データを初期化する部分 メソッド   : フィールドなども使った
          処理を書く部分 基本的には、クラスは「インスタンス化」をすることで
 他のプログラムからも利用可能になる。
 ( new クラス名(); )
 
 インスタンスはそれぞれ別物としてメモリ上展開されており、
 フィールドの状態を管理する。 クラスの基本 6 フィールド フィールド コンストラクタ メソッド メソッド クラス

Slide 7

Slide 7 text

#javado クラスの切り分けで意識する
 Javaの特別なクラスや手法 7

Slide 8

Slide 8 text

#javado 何らかの範囲や共通の種別の中での定義を表すためのクラス。 何かを区別・判断するための定数やバリエーションを表す(例:種類、処理パターンなど)。 enumをうまく扱うための独自の仕組みなどもある。
 (例:EnumSet, Switch文) class 識別子の変わりに enum 識別子を使う。
 列挙型(enum) public enum Season { SPRING, 
 SUMMER,
 FALL,
 WINTER; } Season.SPRING
 で「春」を定数として
 使える  public enum Exchange { USD(106), 
 EUR(125),
 NZD(68); private nal int rate; private Exchange(int rate) {
 this.rate = rate;
 }  public int getRate() {
 return rate;
 } } 定義ごとに、
 付属する値を定義し、
 外部から利用できる Exchange.USD.getRate();
 ⇒ 106が返る

Slide 9

Slide 9 text

#javado イミュータブルオブジェクト:
 インスタンス化の後、フィールドの値や参照先を変更できない仕組みのインスタンス ミュータブルオブジェクト:
 インスタンス化の後、フィールドの値や参照先を変更できる仕組みのインスタンス 通常、意識せずにクラスを作ると、ミュータブルオブジェクトを作るクラスになる。
 イミュータブルにすると、フィールドの状態の管理やインスタンス同士の比較が楽になる。 イミュータブルとミュータブル Field Field 変更 × 変更 × イミュータブル Field Field 変更 変更 ミュータブル 不可 不可 可 可 検索や表示のみの用途のもの
 (利用期間内に)内容が変更されないもの
 ⇒ イミュータブル が向いていることが多い
  例:商品やそのリスト、注文履歴 入力や編集する用途のもの
 (利用期間内に)内容が変更されるもの
 ⇒ ミュータブル が向いていることが多い
  例:プロフィール編集画面、購入カート インスタンス化された後は
 フィールドの内容(参照)を変更不可 インスタンス化された後も
 フィールドの内容(参照)を変更可

Slide 10

Slide 10 text

#javado (フィールドやメソッドの状況に応じて)final 識別子を使い外部や継承クラスからの変更を防ぐ ⇒フィールドをfinalにする       :インスタンス化するときだけ設定可能にする
 ⇒クラスや設定用メソッドをfinalにする :継承したサブクラスからの変更を防ぐ ※両方が必ず必要ではなく、どちらか一方で十分な時もある フィールドの値を外に渡すときに、渡した先で値(の一部)が変更されないようにする ⇒フィールドの値もイミュータブルにしておく
 ⇒フィールドの値のコピーを新たに作って渡す(防御的コピ−) ※両方が必ず必要ではなく、どちらか一方で十分な時もある 
 イミュータブルにしなくても、できるだけフィールドを変更できる機会は最低限にしておくと、 ソースコードの上の見通しは良くなる。 イミュータブルオブジェクトのためのクラス作成方法

Slide 11

Slide 11 text

#javado 外部連係クラス
 (インスタンス) 共通処理クラス
 (インスタンス) 例えば、複数の対象(クラスやインスタンス、処理対象)をまたぐような部分は
 別のクラスやインスタンスになるように役割を切り分ける。 別のクラス/インスタンスに役割を切り分けるきっかけを見つける A, B両方に共通
 するような処理 システム外や
 別の仕組みと
 関わるような処理 A B 役割を切り分けたクラスは、
 利用しているパターンや技術、
 処理の内容や使われ方等に
 あわせて呼び方がかわる 例) サービス、リポジトリ、
    コンポーネント... データベースやファイル 部品クラス
 (インスタンス) 一部だけを書き換え て使い回せる処理

Slide 12

Slide 12 text

#javado クラスを分ける練習 12

Slide 13

Slide 13 text

#javado カードゲームのプログラムをクラスにわけてみよう ① ♠, ♥, ♦, ♣, Joker の5枚がシャッフルされたカードの山がある ② Player1がカードの山から
   n枚目を指定して1枚引く ③ Player2がカードの山から
   n枚目を指定して1枚引く ④ 引いたカードを比べて、
   強いカードを引いた方が勝ち ルール)5枚の山から引く ルール)4枚の山から引く ルール)♠, ♥, ♦, ♣, Joker の順に強い。ただし、♠ は Jokerに勝てる。 vs

Slide 14

Slide 14 text

#javado 14 120行程度の手続き型的なプログラムでも実装可能 けれども....   ゲームの勝敗のルールを変える(強さを逆にする)   カードの内容を変える(トランプにする)   プレイヤーにもっと情報を増やす としたら?  ⇒ そもそもゲームをどうやって実現しているのか?
  ⇒ ルールを変えたいときにどこを変えれば良い? をプログラムを全部読んで、頭にいれないといけない。
 実際に変えてみると、プログラムの中でいろいろなものが
 連動している。(暗号的強度が高い) カード、マーク、カードの山プレイヤー、ルールなど、
 前ページの図の中にもあった観点を手がかりに、
 わかりやすい・変更しやすい構造(クラス)にわけられないか?

Slide 15

Slide 15 text

#javado 例えば、実際に以下のような変更作業にチャレンジしてみてください。 ⇒ ゲームの勝敗のルールを変える(強さを逆にする) ⇒ カードの内容を変える(トランプにする) ⇒ プレイヤーにもっと情報を増やす ⇒  etc... ○○を変えたいならこのクラスの内容だ!とすぐに探せましたか?
 プログラムの限定的な部分だけを変更して、うまく変更作業ができましたか? もしクラスに分けることができたら 15

Slide 16

Slide 16 text

#javado モブプログラミング 16

Slide 17

Slide 17 text

#javado モブプログラミング 17 マーク・パール (著)、長尾高弘(訳)、
 及部敬雄(解説):
 モブプログラミング・ベストプラクティス ? モブプログラミング: 
  複数人の質疑や議論の結果で進み、
  フロー効率の向上やチームの成長に
  寄与する ○ 難しい課題に複数人の知識、
    スキル、ノウハウを総動員し取り組める
 ○ 相互に知識・スキルを共有・継承できる
 ○ 開発と改善(レビュー・リファクタリング)
    を兼ねられる ! ひとつのプログラミング課題に、複数人のチームメンバーが、
 同じ場所で、ひとつのパソコンを使って、解決方法を議論しながら
 開発を進める手法 参考文献:

Slide 18

Slide 18 text

#javado モブプログラミングの流れ 18 1. 3名以上で一カ所に集まる 2. タイピスト(1名)とモブ(そのほか)に分かれる。タイピストは、パソコンの前に座る。 3. 活動する時間と、時間内に到達を目指すゴール、タイピストの交代のタイミング(5〜15分ごと)を決める
 〈モブ〉
 ・ ディスプレイに表示される画面を全員で見ながら、
   解決すべき課題や問題点に集中し、問題解決のための方法を考え・推測・提案する
 ・ わからないことはわかるまで質問して、学ぶ
 〈タイピスト〉
 ・モブ全員の合意がとれた操作やコードの入力をする 4. タイミングがきたら、タイピストを交代する。 5. ゴールが達成できたら、みんなで喜ぶ(ハイタッチ!) 6. モブ終了の時間がきたら、次回のモブにむけてふりかえりを行う モブ タイピスト モブ モブ モブ モブ

Slide 19

Slide 19 text

#javado 今日のモブプログラミングの体制 19 Zoomミーティング AWS Workspaces 遠隔タイピストPC Zoomで画面共有 Workspaceクライアントで
 接続・タイピスト操作 タイピスト役 音声・カメラ
 共有 音声・カメラ共有 モブ役たち IntelliJ IDEA,
 Zoom を起動
 ブラウザも利用可 10分程度で交代
 モブ役→タイピスト役は
  Workspacesクライアントを起動
 タイピスト役→モブ役は
 Workspacesクライアントを終了 Zoomを起動 遠隔タイピストPCの画面を
 Zoom画面共有で確認しながら
 モブ役達でディスカッションし、
 タイピストへ操作依頼

Slide 20

Slide 20 text

#studyhacklt モブプログラミングでの勉強会事例(JetBrains Educational IDE の Kotlin入門) 20 モブ モブ モブ タイピスト • モブは問題解決にむけて積極的に議論する • モブ間の合意がとれた操作依頼をタイピストが反映する
 (誰か一人の独断では操作しない) • ゴールに到達したらみんなで喜ぶ • 分からないことや疑問を残さず確認する • 終了時には、次回にむけた振り返りをする • ※映像では割愛しているが、タイピストは
 一定時間(10分前後)で交代する 画面共有 (ゴール)
 Javaのオーバーロード 相当をKotlinでやる (議論)
 引数の型の後ろに
 デフォルト値を設定できる (議論)
 numberと toUpperCaseに
 デフォルト値を与える? (タイピストへ依頼)
 Intの後ろに=42, 
 Booleanの後ろに=false ゴール達成!
 みんなで喜ぶ (質疑)
 実際の開発環境は
 どんなコードに? (回答)
 使いどころやノウハウ、
 実例の共有 (ふりかえり)
 一連のモブや
 課題への振り返り

Slide 21

Slide 21 text

#javado モブプログラミングタイマー(画面右下 Mob Ticker で起動) 21 1)参加者の名前をいれて Add (全員分) 1)最初の⼈を選んでタイマースタート(最初はスタッフが良いかも) 3)みんなで調べるときなどはポーズ 4)中断するときはストップ(休憩など) 時間がくると、英語のダイアログで交代する⼈を教えてくれます。

Slide 22

Slide 22 text

#javado 自分のタイピストの番が来たら、
 WorkspaceクライアントでタイピストPCのWorkspaceに接続する タイピストの切り替え 22 直前までのタイピスト役 次のタイピスト役 × 後からのログインが、
 既存のログインセッションをカットして そのまま移り変わる Zoomへの画面共有サイズが
 変わってしまったら、
 タイピスト端末で画面共有し直す
 (コンピューターの音声の共有はOFF)

Slide 23

Slide 23 text

#javado • 内職はやめましょう!
 通知がきたのでつい...は休み時間までグッと堪える。
  ⇒どうしても緊急のときは、一旦モブの活動から抜けて、終了させてから戻ってくる。
 進行に必要な調べものも、タイピストに指示をしてみんなで同じ画面で調べる。
  ⇒調べる時は一時的にタイマーをポーズしても良い。 • できるだけビデオもONにしましょう
 メンバーがどんな表情で参加しているかも、チームに重要な情報です。
 差し支えのない範囲で、カメラをONにして参加しましょう。 • タイピストへ指示するときは、Zoomのコメント機能をうまく使おう!
 オプションを表示>コメントをつける で、画面共有に色々描ける
  ⇒レーザーポインタのつもりで「絵を描く」「スターをつける」で指し示す
  ⇒削除で消す • 細かくゴールを設定して、達成したら万歳しよう!
 「何分ぐらいで○○をしよう」と目標を決めてから作業をする
 目標が達成できたら、全員で万歳をして喜ぶ(少し大げさに) モブプログラミングの注意点(1) 23

Slide 24

Slide 24 text

#javado • 参加者の人へ
 どんなことでも「わからない」「不安」「こういうことかな?と確認したい」ことが
 1つも残らないようにどんどん質問・確認しましょう。
 もちろん、プログラムのこと以外でも構いません。
 あなたが質問すれことで、同じ事を思っている・実は勘違いしている他の人も助かります。 • 経験者の方へ
 参加者(初心者)の方が発言しやすい雰囲気造りや、確認の促しをしてあげてください。
 どんな細かいことでも共有された知識・スキルがチームの財産や蓄積になります。
 あながた教えることで、チームがどんどん円滑に、ゴールに進めるようになります。 • Java Do スタッフへ
 原則経験者と同じ振る舞いですが、タイピストの暴走(モブの合議や指示のない操作)や
 モブの暴走(一人の意見で質疑や合議無しに進んでしまう)を防いでください。
 ゴールに到達したら率先して喜んでください。チームの良い雰囲気が作れます。 モブプログラミングの注意点(2) 24

Slide 25

Slide 25 text

#javado 以下のような書籍を読んでみると良いと思います。 ひきつづき、どういう考え方やテクニックがあるか? 25

Slide 26

Slide 26 text

#javado 補足 26

Slide 27

Slide 27 text

#javado 補足)List / ArrayList 27 容量が自動的に変化する配列として使うことができる。 ArrayListの中に格納されるインスタンスを要素と呼ぶ。 Fooインスタンスを要素として格納する予定の
 ArrayListをインスタンス化し、listという変数で参照する Foo Foo Foo list ArrayListΠϯελϯε List list = new ArrayList<>(); List list = new ArrayList<>(); Foo foo1 = new Foo(); list.add(foo1); Fooインスタンスを生成し、ArrayListに要素として参照を格納する Foo Foo Foo list ArrayListインスタンス Foo 0 0番目の要素として格納される。この番号を インデックス と呼ぶ。

Slide 28

Slide 28 text

#javado 補足)List / ArrayList 28 Foo foo0 = list.get(0); Foo Foo Foo ArrayListΠϯελϯε Foo 0 1 2 Foo Foo Foo foo0 ArrayListの0番目に格納されている要素の参照を返す
 (foo0変数が要素0と同じインスタンスを参照する) Foo get(0) 返した要素は
 ArrayListから取り除かれない
 ※要素も返値も同じインスタンスを
  参照している状態になる list.remove(0); 要素自体をArrayListから取り除きたい場合は、
 removeメソッドを使う。
 ArrayListの要素の0番目に格納されている要素の参照を削除する。 Listの順序をランダムに並べ替える
 (下は実⾏例であり、実⾏結果は毎回変化する) List list = new ArrayList<>(); list.add(8); list.add(1); list.add(5); list.add(10); System.out.println(list.toString()); 
 Collections.shuffle(list); System.out.println(list.toString()); ⇒[8, 1, 5, 10] ⇒[5, 1, 10, 8]