Object)とマッピングさせる際に少しハマったので整理しました。クラスがあったとします。}}UserクラスがUserNameを保持します。他にUserNameとRegisterDateというクラスも保持しています。registerDate;}schema.sqlにDB定義を書きます。DATE);テスト用のデータ挿入用のdata.sqlです。'2020-02-03');UserRepositoryにIDからUserを取得するためのメソッドfindByIdを定義します。以下のような内容になります。値をselect内で使用できませんでした。コンストラクタに値をマップさせるためにconstructorを使用するargのオプションnameで、引数名を指定する以下の部分です。</constructor></association>結果テストコードを書いてブレークさせた結果は以下のように。インスタンスも生成されて、値もマップされています。開発案件に携わることになりそうなので、勉強中です。開発環境向けのインストーラーが公開されていることを知りました。code.visualstudio.comインストールしてみて、使えるようであれば現場でも薦めて見ようかなと思います。Installer」からインストーラーをDLします。手順通りに進めていきます。上記の画面のあとでエラーが発生。JDKのインストールでエラーが発生したようです。良かった!インストーラー出来ました。拡張機能に、Java関連の機能が一式インストールされた状態になっています。Webアプリケーションを開発したい場合は、以下の拡張機能もインストールしておきます。呼び出せるようになります。表示されるようになります。すればもうアプリケーションが起動します。アプリケーションを起動すればブレークできます。eclipse同様、パッケージのエラーも表示して自動修正してくれます。方がしっくりくる感じがします。関連の記事もアップしていきたいと思います。料金ルールを実装してみよう」にチャレンジ(その4)Tech前置き以下シリーズ化してきているDDD練習の第4回です。通常期の指定席特急券より530円を引いた金額で年間固定。実装まずは変動費(-200円、+200円)を表現する値オブジェクトを実装します。}季節(Season)をインターフェイスで実装します。}続いて、Seasonインターフェイスを実装した季節ごとクラスを作成します。通常期(regular)閑散期(off-peak)繁忙期(peak)季節の期間は毎年変動すると見越して、DBで定義された値から取得する形が良いかもしれません。今回は取り急ぎ定数的に実装します。}そして、出発日(BoardingDate)から季節を判定するクラスSeasonTypeです。}季節ごとの変動は指定席の特急料金だけに対してなので、実装済み(第1回)の指定席(ReservedSeat)クラスに渡せばよいだけです。サービスクラスの差分は以下のようになりました。振り返り今回の練習課題は業務アプリケーションの開発の実戦に近く、非常に有意義なものであったと思います。数人でモブプロやライブコーディングしながらやったら面白そうです。ベテラン+初学者のグループでやったりすると、いろいろな気付きが出てきたりしそうです。第2回まではクラスの表現に結構悩んだところもあったのですが、第3回、4回では慣れてきたのかスムーズにクラスの表現が出来たと思いました。間を開けて実装してしまっているので、表現方法に若干統一感がないのと、クラスをもっと集約しても良いのかな、とも思います。この辺りは今後リファクタリングにも取り組んでみたいです。料金ルールを実装してみよう」にチャレンジ(その3)Tech前置き以下シリーズ化してきているDDD練習の第3回です。discount)8人以上が同一行程で旅行する場合に適用されます。15%31人以上の割引31〜50人の普通団体は、1人分の運賃と特急料金が無料になります51人以上の場合は、50人増えるごとに、1人ずつ運賃・特急料金が無料になります。年末年始の期間は団体割引の率が下がります。そもそも適用期間内かどうかを判定するために計算に出発日(BoardingDate)が必要だったことがわかりました。出発日(BoardingDate)を値オブジェクト(ValueObject)で表現し、「12月21日〜1月10日」の期間を「NewYearHolidaysPeriod」と表現しました。「NewYearHolidaysPeriod」は、もしかしたら毎年日付が変わるかもしれないので、年ごとに履歴管理するべきかもしれません。実戦においてはこうした要件だけから読み取れない部分は、ヒアリングする必要があると思います。今回はとりあえず定数的に管理することにします。}続いて、料金計算には人数が必要だったことも判明したので、利用人数をNumberOfPeopleクラスで表現します。団体人数の区分をこのクラスで判定します。LargeScaleGroupと定義。団体割引の適用可否の判定も実装しました。}続いて団体割引額を表現するクラスGroupDiscountを実装。引数のTripクラスはその1〜2で実装した運賃、特急料金と片道/往復など各割引を計算するクラスです。割引率は値オブジェクトGroupDiscountRateで定義しました。」時の無料になる人数の計算の実装になります。インターフェイスGroupTypeに団体の区分クラスを生成するstaticメソッドを実装。NumberOfPeopleで実装した判定メソッドから、区分クラスを生成します。無料となる人数が発生しない区分(30名以下)を、小規模団体SmallScaleGroupと表現しました。}最後に、ここまでで定義してきたクラスを利用する計算処理ですが、新たにTicket(きっぷ)クラスを定義。その中に実装することにしました。ここに来てようやく出てきたTicketという概念。そもそもこのクラスが今回の集約ルートになりそうな気もします・・・。}サービスクラスの前回からの差分は以下になります。サービスクラスから見ると、既存の他クラスを修正せずに団体割引を追加できたことがよくわかります。安全に要件追加を出来たことになるのではないかと思います。まとめ団体割引の要件を文章にするとたった7行ですが、そこから抽出されたクラスは10クラスになりました。短い要件のなかから、如何にドメインを抽出していけるかを考える。ソフトウェア設計の面白いところだと思いました。残る要件は季節(season)による特急指定席料金の変動のみです。次回でラストにしたいです。料金ルールを実装してみよう」にチャレンジ(その2)Tech前置き前回からの続きです。〜変更を楽で安全にするオブジェクト指向の実践技法』の著者の増田さんから、リアクションいただけました。チャレンジして、こうやって公開してもらえると、嬉しいですね。discount)片道の営業キロが601km以上あれば、「ゆき」と「かえり」の運賃がそれぞれ1割引になります。18,000円2,020円の割引になるまずは「営業キロ(RailWayDistance)」を値オブジェクトとして実装。「601km以上の場合に割引になる」要件をisDiscountDistance関数で表現しました。}往復割引の要件から、運賃(BasicFare)は割引が存在することが判明しました。割引後の運賃を表現するRoundTripDiscountedOnewayBasicFareクラスを実装。元になる運賃(BasicFare)と、割引のロジックを実装したクラスです。}割引が適用されない運賃は「片道運賃(OnewayBasicFare)」としました。BasicFareを内包するだけのクラスです。}実装クラスの説明が先になりましたが、運賃と特急料金から料金を計算するFareクラスから両者を扱うために、BasicFareWithTripTypeインターフェイスを定義しました。RoundTrip(往復)」の判定と、往復だった場合は営業キロが割引適用かを判定し、割引適用後の運賃クラスを生成する「運賃種別(BasicFareType)」クラスを実装しました。表現するクラスを実装します。型はTripとし、「片道OnewayTrip」「往復RoundTrip」クラスとして表現しました。「往復」は「行き(departingFare)」と「帰り(returningFare)」の金額を合計した額を返します。}割引運賃と同じく、区分オブジェクトでTripTypeクラスを表現しました。}ここまで実装し、最終的にServiceクラスでの前回からの差分は以下のようになりました。運賃BasicFareクラスを参照していたFareインターフェイスおよびFareの実装クラスは、BasicFareWithTripTypeを参照するように修正が必要となりました。今のところ、ほぼ区分オブジェクトだけで要件を実現できているような形です。以下のスクショはデバッグでブレークしたところですが、このように保持しているクラスの型で要件をそのまま表現できているかと思います。見ていて思ったのですが、value(金額)はyen(円)という値オブジェクトで表現してもよいかもですね。牛歩で最後まで頑張りたいと思います。料金ルールを実装してみよう」というサンプルコードをGitHubで公開されておりました。2nd」のワークショップで使う、サンプルコードです。新幹線の運賃と特急料金の計算ルールを、値オブジェクトで表現してみよう、という内容。イベントに参加されない方も、ぜひ、チャレンジしてみてください。今回、この課題に実装例を見ないでチャレンジしてみたいと思います。JR新幹線の料金の要件は以下のようになっています。(child)自分はここから、ルールには以下3つの「区分」があると読み取りました。割引き、という要件から「大人・子供」の「料金」区分を抽出しました。「Fare(料金)」インターフェイス、「運賃(BasicFare)」クラス、「特急料金(SuperExpressSurcharge)」インターフェイスを実装しました。「Fare」を実装した「大人料金(AdultFare)」「子供料金(ChildFare)」の具象クラスを実装しました。「子供料金(ChildFare)」は、「運賃」と「特急料金」を割引するロジックが実装されています。続いて「席種(SeatType)」の実装です。「席種(SeatType)」インターフェイスから「指定席(ReservedSeatCharge)」クラスと、「自由席(FreeSeatCharge)」クラスを実装。「自由席割引(FreeSeatDiscount)」クラスを実装。「自由席(FreeSeat)」クラスは、「ひかり料金(HikariCharge)」クラスと「自由席割引(FreeSeatDiscount)」クラスを内包したクラスとして表しました。「指定席」は「ひかり」の料金そのままなので、「ひかり料金(HikariCharge)」を内包しただけのクラスとなります。続いて、特急料金を表すSuperExpressSurchargeインターフェイスから、「ひかり(Hikari)」クラス、「のぞみ(Nozomi)」クラスを実装しました。それぞれ、「席種(SeatCharge)」を内包させています。「席種(SeatCharge)」が「ひかりの料金(HikariCharge)」を内包しているためです。「のぞみ」の料金は、以下の要件から「ひかり」の「料金」に割増するモノなので、「のぞみ(Nozomi)」は「席種(SeatCharge)」クラスと、「のぞみ割増料金(NozomiAddtionalCharge)」クラスを内包したクラスとしました。charge)ひかりの特急料金に、以下の金額を加算する。自由席」といった条件から各クラスのインスタンスを作成するとなった場合、ここまでの実装だけだとIf文を使って分岐することになってしまいそうです。そこで各クラスの生成を「区分オブジェクト」にやらせることでコードをもっと分かりやすくしたいと思います。}ポイントはvalueOfメソッドです。各区分オブジェクトクラスに、インスタンスを生成する関数を実装。.GetMethodにより文字列で対象のクラスを指定し、インスタンスを生成している箇所です。上記の手法を用いることで、IF文を使って分岐する必要がなくなります。Fare、SuperExpressSurcharge、SeatTypeを抽象化した実装もここで効果が出ていると感じます。料金を計算するサービスクラス「FareSystemService」です。各料金は出発地・目的地ごとに異なるため、これらはDBなどで定義されていると仮定し、「FaresRepository」というリポジトリークラスを実装。出発地(Departure)、目的地(Destination)ごとの運賃、特急料金等を保持した「FareByrRoute」オブジェクトを、「FaresRepository」から取得する形にしました。※自由席割引額(FreeSeatDiscount)もマスターテーブルのような場所で定義するのがよさそうですが、例では省略してハードコーディングしてしまっています。}まとめ前半戦の実装は以上です。残りは後日「その2」で公開できればと思います。(discount)季節(season)による特急指定席料金の変動です。今回の練習の結果は以下GitHubリポジトリに公開しています。料金ルールを実装してみよう」にチャレンジ(その1)Tweet広告を非表示にするもっと読むコメントを書く2019-12-262019年の振り返りdiary今日で仕事納めでした。今年、取り組んできたことを振り返って来年の行動に繋げていきたいと思います。新しく始めたことこのブログアウトプットの一環として、技術系の情報と読書感想をまとめた本ブログをはじめました。本記事を入れて29投稿できたので、だいたい月2ぐらいのペースで投稿し続けることができました。スターを頂いたり、Qiita上の記事からリンクを貼っていただいたり、リアクションをもらえるようになってきたのがとても嬉しかったです。来年も引き続きアップし続けられるように頑張りたいと思います。以下、リンクしていただいた元記事。社内で有志を募って社内勉強会「ハンガーフライト」を開催し、現場で実践してきたことなどを発表しました。継続的に開催していければと考えています。「ハンガーフライト」については書籍「カイゼン・ジャーニー」からインスパイアを受けました。www.asakara.net資格取得(AZ-900)初めてベンダー系の資格取得に挑戦しました。rikupapa-shima.hatenablog.comまだ現場で活かす機会はないのですが、引き続きAzureの知識はインプットしていけたらと思います。取れていないので、その辺りが課題です。有料のオンライン学習サイトも、今年はじめて体験しました。DockerとJenkins、AZ-900の試験対策についてのレッスンを受講しました。1つの動画が長くても15分程度なので、コツコツ勉強するのにも向いているなと思いました。今年読んだ本は以下の記事でまとめました。rikupapa-shima.hatenablog.comまとめ2018年の10月に転職して今の会社に入社。自社パッケージソフトの開発エンジニアからSESのエンジニアに転身。2019年1月に参画した現場で引き続き働いています。新しい環境、新しいシステムに触れることで自分の得意なこと、課題や今後やりたいことがまた見えてきたように思えます。来年もより成長できるよう、引き続きインプット・アウトプットを続けていきたいと思います。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。