投稿

11月, 2020の投稿を表示しています

11月26日(木)1、2コマ目

イメージ
今日、やったこと ラムダ式+HashMapの確認テスト 関数型インタフェース 今日の確認テスト 正10角形の面積を求める計算式が間違ってました。ごめんなさい。 とりあえず、ソースコードを公開しておきます。 IFigureAreaインタフェース 図形の面積計算クラスたちの共通インタフェース。 図形毎にこのインタフェースを実装して・・ではなく、実装メソッドが1つだけなので、ラムダ式を使って実装からインスタンス生成までできる。 Serviceクラス IFigureAreaインタフェースをラムダ式で実装、インスタンス生成を行う。 生成したインスタンスはHashMapでキーとともに管理する。 あと、サーブレット等もありますが、大したことはないので公開しません。 今日のホワイトボード 関数型インタフェース 実装すべきメソッドが1つだけのインタフェース を「 関数型インタフェース 」と呼びます。 図 関数型インタフェース 標準関数型インタフェース 結局、関数型インタフェースは 引数 戻り値 の違いしかありません。 ラムダ式で実装、インスタンス生成をすることを考えると、インタフェース名やメソッド名はなんでもいい ことになります。 そこで、ありがちな引数、戻り値の組み合わせであらかじめ関数型インタフェースをjava.util.functionパッケージに用意してくれています。これを 標準関数型インタフェース と呼びます。 図 標準関数型インタフェース 時間のフォーマット変換器に標準関数型インタフェースを使う 図のようなIConverterインタフェースを作りましたが、このインタフェースのメソッドは 引数・・int型1つ 戻り値・・String型 です。標準関数型インタフェースのなかから、この引数・戻り値の組み合わせとおなじインタフェースを探すと、IntFu...

11月19日(木)1、2コマ目

イメージ
今日の予習 イニシャライザ、コンストラクタ Javaで初期化といえばコンストラクタですが、実はコンストラクタ以外にも初期化を行う手段があります。 初期化処理の順番 以下の順に実行されます。 クラスロード時にスタティックイニシャライザ実行 。クラス変数の初期化実行。 クラスのフィールドを規定値(0とかnullとか)で初期化。 インスタンス生成時にインスタンスイニシャライザ実行 。 コンストラクタ実行 。 スタティックイニシャライザ クラスロード時に1回だけ実行される。 クラス変数(staticが付いた変数)を初期化するために利用。 public class xxx { static { 初期化処理 }                 ・                 ・ } もし、スタティックイニシャライザ実行中にエラーが発生した場合、例外がスローされずにExceptionInInitializerErrorが発生、プログラムを強制終了する。 インスタンスイニシャライザ インスタンス生成時に実行される。 インスタンス変数(ようはフィールド)を初期化するために利用 。 クラスを継承してコンストラクタをオーバーロードした場合、スーパークラス、サブクラスのコンストラクタで同じフィールドを初期化するような場合には、インスタンスイニシャライザでまとめて初期化すると効果的。 public class xxxx     {          {             初期化処理         }                 ・             ...

11月17日(火)1、2コマ目

イメージ
今日、やったこと 検索アプリ改造 その2「匿名クラスを使う」 検索アプリ改造 その3「ラムダ式を使う」 今日のホワイトボード 検索アプリ改造 その2「匿名クラス」をつかう 改造その1の「オブジェクト指向プログラミング」で検索パターンが増えても、ICheckerインタフェース実装クラスを追加するだけで対応可能になりました。 が、IChecker実装クラスは大した内容ではないのに、クラスを1つ作らなければならず、作ったクラスもバンバン使われることもなく1回しか使われません。 クラスを作る労力と効果に疑問を感じます。 そこで、検索したいときに匿名クラスでIChecker実装クラスを作成しさらにインスタンス生成まですれば省力化+コンパクトなプログラムになります。 図 匿名クラスを導入する 匿名クラスを使って スーパークラスを継承したクラス作成、インスタンス生成 インタフェースを実装したクラス作成、インスタンス生成 は以下のように行います。 図 匿名クラス作成、インスタンス生成まで Javaの条件式は 条件式を評価するとtrueまたはfalseを得ることができます。 そのため、  return 条件式 で条件式の評価結果(trueまたはfalse)を返すことができます。 図 Javaの条件式 40歳以上で検索するようにコーディングすると以下のようになります。 // [匿名クラスを使う]40歳以上で検索 // check()は条件式の評価結果を返す => 1行になる System.out.println("40歳以上で検索"); UserFinder.find(list, new IChecker() { @Override public boolean check(User user) { return user.getAge() >= 40; } } ); Java8がリリースされる2014年ころまでならこの辺がベストプラクティス。 しかしなが、Javaも進化を続けたため、もっと簡単にコーディングができるようになった。 検索アプリ改造 その3「ラムダ式」をつかう ラムダ式とは 実装しなければいけないメソッドが1つだけのインタフェースに対して、 実装クラスを新たに作成することなく、 1つの式で 匿名クラスの実装およびインスタン...

11月12日(木)1、2コマ目

イメージ
今日、やったこと 確認テスト 新ネタへの導入 今日の確認テスト 一応、正解例を公開しておきます。 〇Resultクラス 結果受け渡しに使うクラス。 〇時刻フォーマット変換クラス(Enum) この課題のメイン。 出力フォーマットごとに列挙定数を定義。 各列挙定数は変換クラスのインスタンスを参照する。 変換クラスは出力フォーマットが異なるため、この列挙型のサブクラスとして作成。 ただ、出力フォーマット毎にサブクラスを作るのはあほらしい(せいぜい、1行程度なので)ので、匿名クラスとして作る。 結局、前回の授業とほぼ同じ。 〇サーブレット すいません、Serviceクラスを作らずに、サーブレットで列挙型からインスタンス取得して変換してしまいました。 〇index.jsp とくにこれと言ってなにもないかと。 今日のホワイトボード サンプルアプリケーションについて ユーザー一覧から条件に合う人だけ表示するアプリケーションです。 おそらく、検索条件が今後増えることになりそうで、楽に対応できるようにしておきたいです。 そこでよく使われるのが、「オブジェクト指向プログラミング」です。 図 仕様変更(検索条件の追加)に備えて オブジェクト指向プログラミング導入 下図のようなクラス構成になります。 図 「オブジェクト指向プログラミング」導入 今後、検索条件が増えても、ICheckerインタフェースを実装したクラスを作るだけでOKです。 なお、今までやってきた「動的インスタンス生成」や「enumを使ってインスタンス取得」はICheckerインタフェース実装クラスのインスタンス生成の際に条件分岐をさせないためのテクニックでした。 この授業では、このICheckerインタフェース実装クラスの作成を楽にするテクニックを紹介していきます。

11月10日(火)1、2コマ目

イメージ
今日の予習 前回に引き続き、具象クラス名を書かずにインスタンス生成を行うテクニックの続きです。 前回の動的インスタンス生成は「実際にはあまり使われない、存在だけ知っておいてください」でしたが、今日のネタは現実的なテクニックです。 テクニック その2「enum」 enumとは列挙型のこと。通常は定数をひとまとめしたいときに使われる。 が、メソッドを実装することもできる。 〇列挙定数で標準体重を計算する(Ver.1) 標準体重の計算方法名を列挙定数にして、計算用メソッド(execute())と計算方法名取得用メソッド(toString())を用意。 各メソッドでは、どの列挙定数かで処理を条件分岐。 結局、ここに条件分岐が移ってきただけ。 〇列挙型の計算部分の条件分岐を駆逐する(Ver.2) Javaの列挙型はEnumクラス継承クラス。 よって、フィールドやメソッドも作れる。 そこで、 標準体重計算を抽象メソッドにする 列挙定数別に標準体重計算メソッド(抽象メソッド)を実装する とすれば、計算部分の条件分岐がなくなるはず。 ただし、列挙定数別に標準体重計算メソッド(抽象メソッド)を実装するにはサブクラスを作成する必要がある。 が、ここは匿名クラスで簡単に実装することにする。 〇列挙型のtoString()メソッド内の条件分岐を駆逐する(Ver.3) toString()にも条件分岐が残っている。 解決策として、 計算方法名をセットするフィールドを用意 フィールドには各列挙定数のインスタンス生成時に計算方法名をセットする toString()はこのフィールドの値を返すだけ でいきます。 今日のホワイトボード 古典的な列挙型(enum)の使い方 定数のセット集としてつかう。 図 古典的な列挙型 実はenumはクラス Javaの列挙型はjava.lang.Enumクラスを継承したクラスになる。 図 列挙型はj...

11月5日(木)1、2コマ目

イメージ
今日の予習 このシリーズのゴール if文撲滅! 仕様変更、機能追加等でif文はどんどん育っていくから。 ソフトウェアのライフサイクル 作ってから本当のお付き合いが始まる  作る=>完成 で終わりではない。 完成してからが本当のお付き合い。 仕様変更や機能追加がまちがいなくある。 変更・追加でソースをいじる=> テストするのはいじったところだけではない。 仕様変更、追加は必ずある 変更・追加のありそうなところは、簡単に対応できるようにしておいた方が自分を助けることになる。 標準体重計算方法はきっと追加される 特定の計算方法ではなく、漠然と「計算する」にしておけば、計算方法が増えても対応しやすい。 特定の計算方法(BMI方式とか)ではなく、ただ計算するにしておく。 要は計算方法(BMIとかローレルとか)をぼやかす=> 抽象化する 抽象化したら、if文はいらなくなる(かも)。 〇抽象化前(イメージ)   if( 選択計算方法 == BMI)       BMI方式で計算する   else if( 選択計算方法 == ローレル )        ローレル方式で計算する   else if( 選択計算方法 == 簡易 )         簡易方式で計算する 〇抽象化後(イメージ)   標準体重計算実行 抽象化するには Javaにしても.Netにしても、「抽象クラス」や「インタフェース」が用意されてあり、これらがプログラムを抽象化するときの最高のお助けツールになる。 「標準体重計算」を抽象化すると BMIとかローレルとかを抽象化する「標準体重計算」クラスを用意する。 「標準体重計算」クラスのサブクラスとして、各計算方法(BMIとかローレルとか)に特化した(具象)クラスを用意する。 =>これで各具象クラスのインスタンスは「標準体重計算」クラス型として扱うことができる。 ...

10月29日(木)1、2コマ目

イメージ
今日、やったこと 課題(UMLマスタ2) 標準体重計算アプリ作成 課題(UMLマスタ2) ソースコードを置いときます。 Resultクラス 計算結果を受け渡す際に利用するクラス。 dtoパッケージ。 StandardWeightクラス 標準体重を計算するクラス。 bllパッケージ。 IndexSrvクラス サーブレット。 presentationパッケージ。 index.jsp JSP。身長、体重の入力、計算方法の選択や計算結果の表示を行う。 WEB-INF/以下に配備すること。 標準体重計算アプリ クラス設計やエラー処理等は一切考えず、正常系が動くだけで結構です。 ただし、以下のルールを守ってください。 JSPファイルはWEB-INF/以下に クラスの機能別にパッケージ分け 図 JSPはWEB-INF/以下に、クラスはパッケージ分け 小数点の切り捨てについて 配布した資料には古い情報が書かれていました。 java.math.BigDecimal.ROUND_DOWNは非推奨です。 代わりにjava.math.RoundingMode.DOWNを使ってください。 図 java.math.RoundingMode.DOWNを使う