こんにちは、殿内(@tonoccho)です
現在、学校の宿題でチャットアプリを作っています。チャットの課題で求められた部分を作るだけなら30分なんですが、というか、このくらいでいいなら30分ですまでは作ったんですが、ちょこちょこと機能追加はしています。そうした方が成績いいらしいので。一応作るときに気をつけたことについていくつか書いて見ます。
宿題の概要
今回の課題はマルチスレッドとソケット通信をやることが目的でした。どちらも自分あまり得意じゃないですね。とは言え、世にチャットプログラムは山のようにありますし、参考にできるものはたくさんありますが、別に参考にしなくてもいいでしょう。
基本的に通信をする部分がデータを受け取ったらEventを発火する、という感じに作りました。Eventを処理するListenerはさらにFacadeとして動きます。Facadeは機能ごとに一つスレッドを立てて動かします。処理内容はRunnableで実装します。Strategyですね。Strategyの中で動く処理自体はFactoryで生成です。
Event Drivenにすることで、レイヤー間の結合がかなり弱くなったと思っていますので、そのうちTomcatでということもさっくりいけると思いました。やるかは別の話だけど。
Executorというのを使うことで、スレッドを立てるのがかなり簡単になってました。ただ、「一つ処理をしたら終わるスレッド」というのと、「ひたすらループして処理を待つスレッド」というのをきちんと分けないとこの辺ははまり込むかもしれませんね。スレッドは本来であればアプリケーションサーバがやるところだと思うんですが。今回はその辺も課題の範囲なので、簡易的に作りました。
デザインパターンの中でSingletonは、自分の性格上、全部Singletonにしてしまうことがあるくらいに自分を捉えて離さないある意味毒薬的なものだったんですが、使うたびに後悔していたのは「テストしにくい」という点でした。なので、今回はあえてSingleton使わないことにしました。使わないことでむしろ良かったと思います。Singleton使ったら殺すマンになろうと思いました(まぁ、インスタンスの管理とかを分離すればいいような気もするんだけどね)。Singletonは時としてAntipatternになっているようですし、使う必然性がないなら手を出さない方がいいでしょう。もうちょっというと「Singletonでよくね?」って思ったくらいの理由だったらやめましょう、ということで。
機能を追加して行く中でDBを使わなくてはならなくなったのですが、今回はH2DBを組み込みで使うことにしました。ドキュメントにセットアップ方法書かないといけないのがめんどかったので。で、コネクションの管理をHikariCPというのでやってみることにしました。単に新しかったので興味本位です。あと、Tomcatとか使うわけじゃなかったので、単体でなんか使いやすそうに見えたので。公式的には超絶高速なコネクションプールということを言いたいみたいです。
で、セットアップの中で「DB立ててこのSQL動かして・・・」とやるのもやっぱりめんどくさかったので、起動時にFlywayでマイグレートしちゃうことにしました。ものとしてはかなり乱暴だと思うんだけど、「サーバー起動すればいいから!」とか「アップデートしたらサーバー再起動すればいいから!」というくらいシンプルにしたかったというのもあります。
GUI周りはSwingで作りました。今後JavaFXが標準になるのは知っていたんですが、他の宿題も忙しかったので、Swingにしました。先生が幸い「Swing使っても殺さないマン」だったので、良かったです。あと15年若かったらJavaFXで頑張ったかもしれません。
こちらも今ならGradleだろうとか言われるかもしれないんですが、Mavenにしました。Gradleも自分が勉強しながら使うことになるので、ちと不可高いかなと。というか、Mavenでいいじゃん、とかも思ったりします。GradleはArchetypeいつになったらサポートするんでしょうか?Gradleもあと15年(ry