Assyのリベラル文学研究所もご覧ください。

Java応用

GUI

Swingとは

Swingは、Pure Javaで書かれたJavaGUIツールキット。
Javaは"Write once, run anywhere"というスローガンを売りにしている。これは、Javaで書かれたコードはどのOS・どのプラットフォームにおいても、一度書けばどこでも動く、というJavaの理念。
Swingは、そのようなJava仮想マシンで同じように動く「Pure Java」なGUIツールキットとして知られる。
OS依存のコードを使っていないため、OSのルック・フィールとは異なる見た目になる。これは、.NET FrameworkWindows.Formsとは異なる特徴で、たとえWindowsでもLinuxでも、Windows/Linuxネイティブなアプリケーションとは異なる見た目を持つ。
また、OS依存のコードを使っていないため、コードの見た目や開発の手法も異なる。リスナーと呼ばれる「メッセージループライクな継承システム」によって、イベントにメソッドを登録する形で開発する。GTK+VBよりも、Windows APIやXlibに近い開発方法である。
マルチテキストなどのコンポーネントも、一切OSの仕組みを使わず、Pure Javaで独自に実装されている。
こうした点は、デスクトップアプリケーションをどのOSでも動かせる、という点で優れている。たとえば、Swingで書かれたアプリケーションは、Windowsで動けばLinuxでも同じように動く。
また、もっと小型のモバイルなシステムでJava MEを使う場合でも、Swingが動くような環境がもしあるのであれば、WindowsでSwingで開発したアプリケーションをモバイル機器でも動かせる。

SWT

Eclipseによるウィジェットツールキット。SwingがPure Javaで書かれているのに対して、SWTはOSのコントロールと密接に結びついて作られている。そのため、ルック・フィールがOS標準のコントロールに近く、また動作も速く軽量である。IBMEclipseSWTで開発することで、EclipseNetBeansなどの同様のIDEよりも高速で安定した製品にした。
逆に、Pure Javaではないため、Java VMが動く環境全てのプラットフォームでは動かない。あらゆるプラットフォームで動く、というSunのJavaの理想から言えば後退と言える。

JavaFX

Java仮想マシンで動作するリッチインターネットアプリケーション向けGUIフレームワーク
Adobe FlexAdobe Flash Player上で動作する)や、Microsoft Silverlightと同様の技術である。
SwingはJavaFXによってリプレースされる予定だとか、らしい。

サーブレット

Javaサーブレットとは

Javaサーブレットとは、サーバー側で動作しHTMLを吐き出す、CGIPHPと同様のJavaによる技術。
Apacheのようなサーバーソフトウェアと、Tomcatのようなサーブレットコンテナ(アプリケーションサーバー)を使って構築する。
Perl/CGIPHPと異なる点は、プログラミング言語Javaであり、静的型付けの言語で使えるということや、IBMなどがメインフレームでもWebSphereなどをサポートしており、「高度なインフラシステムとしても利用できる」という点がある。
多くの場合PHPやWebフレームワーク技術のあるRubyなどで作られることの多いWebサーバーサイド技術だが、「Javaでもいける」という点では優れている。Javaの優れたクラスライブラリを使うことができ、JavaVMの高パフォーマンスでクロスプラットフォーム仮想マシンを使うこともできる。特にJSPを使うことで、PHPと同様にHTMLの中にJavaコードを埋め込むことができる。
ちなみに、ブラウザ上でプラグインによって動くJavaアプレットとは本質的に異なる技術であるため、混同しないように注意しよう。

HttpServletクラス

HTTP通信を行うサーブレットは、「HttpServlet」クラスを継承して作成する。

doGet()とdoPost()

HttpServletでは、リクエストをGETで受けた時はdoGet()、リクエストをPOSTで受けた時はdoPost()で処理を行う。

クロスプラットフォームバイトコード

Javaサーブレットは、クロスプラットフォームJavaの「バイトコード」の特徴を活かしている。
CGIプログラムは、C言語で書くこともできる。だが、この場合、再コンパイルしなければ動かない。サーバーマシンでわざわざ再コンパイルするのは、難しい。
サーバープログラムに、PerlPHPなどを用いると、スクリプトをアップロードすることで動くため、コンパイルしなくても良い。だが、この場合、C/C++よりも実行速度が遅くなる。
ここで出てくるのが、Javaサーブレットである。Javaバイトコードコンパイルされると同時にクロスプラットフォームなため、サーバーでできるだけ速度を犠牲にせず、その上でローカル環境で開発することができる。
Javaサーブレットはサーバー開発のある意味での理想である。

AltJava

Java代替言語とは

Java代替言語とは、Javaと同様にJava仮想マシン(JavaVM)上で動くようにコンパイルされ、Javaのクラスライブラリをそのまま利用でき、言語的な要素だけを簡素化あるいは機能追加した、「Javaに代わる言語」のこと。
Javaの優れたクラスライブラリをそのまま利用でき、Javaと同様のクロスプラットフォームJITコンパイル型の高パフォーマンスな性能を持ちながら、「言語・文法的な部分」だけをすげかえた、いわば「Javaの変種」である。
もともとは動的スクリプト言語のGroovyにはじまり、GroovyはJavaよりもスクリプト言語に近い文法で、Java代替言語を構築した。
最近では、ScalaとKotlinが広く使われている。Scalaは大型のデータセンターから小型のシステムまで使える「スケーラブル」な言語として有名で、前はRailsで作られていたツイッターのシステムも今はScalaで動いている。またKotlinはロシア製の言語であり、Androidの公式開発言語として採用されている。
Microsoft.NET Frameworkのような位置づけにも近い。.NETでは.NET Frameworkのクラスライブラリを用いながら、C#, VB.NET, Managed C++, F#などの言語を使ってプログラミングを行うことができる。だが、Oracle公式ではなく、サードパーティが自由に作っていることなどが異なる。.NET FrameworkでもIronPythonIronRubyなど「Python/Rubyを.NETで動かす」という試みがされているが、これに対してJavaではJythonJRubyなど「Python/RubyJavaで動かす」という試みがされている。Javaと.NETの永遠の「言語戦争」がここに表される。
ただし、思ったほど.NETやJavaの代替言語は普及していない。.NETではC#VBで記述するのが一般的であり、Javaも公式のJava言語を使うことが多い。これは実績や知名度がないなどの理由がある。ただし最先端のJava界ではKotlinが流行っており、「Kotlinを一度触るとJavaには戻れない」とまで言われている。KotlinはJavaでまだ正式に採用されていない最先端の機能を多数取り込み、JetBrains社(IntelliJ IDEAで有名)が作っていることもあって大流行している。

Kotlinは次の学ぶべき言語になる

ネットを見ていると、Kotlinがとても流行っています。「Kotlinを触るとJavaには戻れない」とも。
JetBrains社(IntelliJ IDEAで知られるとてもJava界では有名な会社)のロシアの研究所で生まれ、オープンソース化されたKotlinは、Androidの公式開発言語としても知られる。
行末がセミコロン無しとか型宣言を「変数名 : 型名」で行うとか、あるいは「静的なNull安全の保証」という出来るエンジニアには嬉しい機能があり、Javaの開発中の機能やScalaなどから取り入れた機能などを盛り込んでいる。
見ていると、本当に次に来るべき言語となることが分かる。「Railsを捨ててKotlinへ」と言う人も多い中、ハーウェイへのAurora OS提供などでも取り出さされる「ロシアのIT技術」に期待がかかる。

Android開発ならKotlin

最近のAndroidアプリ開発では、Android Studioを用いてKotlinでプログラミングを行うのが普通になりました。
Kotlinを作ったのも、Android StudioのベースになったIntelliJ IDEAも、JetBrains社の製品です。
言ってしまえば、今のIT業界は「JetBrains社の時代」であると言えます。
僕は、Androidアプリの開発を、XUL2ちゃんねる専用ブラウザとよく似ていると思います。それは「リッチなモバイルインターフェースからネットワークサーバーに接続してクライアントから利用する」からです。XUL2ch専用ブラウザがやっていたことを、再度真似しているように思えてしまいます。日本のガラパゴスインターネット界が昔歩んだ道を、アメリカやロシアも同じように歩んでいるのです。

Spring Framework

Spring Framework

JavaによるWebフレームワークの一つ。依存性の排除とアスペクト指向プログラミングで有名。
Javaフレームワークのめんどくさい点は、多くがフルスタックフレームワークではなく、専門用途のフレームワークを組み合わせて統合して使うこと。柔軟性はあるが面倒くさい。Springは複数のコンポーネントの集合体であり、その全体をフルスタックフレームワークとして使うことができる。
SpringではDI(依存性注入)という考え方を持ち、DIとAOPを柱とする大規模なフレームワークを利用する。
DIでは「コンポーネント間の依存関係をプログラムのソースコードから排除し、外部の設定ファイルなどで注入できるようにするソフトウェアパターン」という考え方をする。

依存性注入(DI: Dependency Injection)とは

また、LaravelやSpringなどで最近言われるようになった概念として、「依存性注入」というのがある。
これは、たとえばクラスの中にインスタンスが含まれていた場合、そのクラスはそのインスタンスである別のクラスに「依存」している。
それに対して、依存性注入では、クラスにインスタンスを「外部から、あとからぶち込む(注入する)」ことで、依存性の解決を図る。
外部の設定ファイルで「このクラスのオブジェクトを注入しなさい」と指示するやり方を「DIコンテナ」と呼ぶ。

デザインパターン

デザインパターンとは

デザインパターンは、Javaのようなオブジェクト指向と相性が良い。
特に、クラスライブラリを使うだけのプログラミングから、クラスとインスタンス、継承と実装、そしてスレッドを用いた、オブジェクト指向のプログラム設計が出来るようになる。
たくさんのパターンを知っておくことで、プログラム要件が来た時に、どのようにすれば実装出来るか、事前に準備しておくことが出来る。
いわば、「設計のネタ帳」である。

特におすすめなのはBuilderパターン

特におすすめなのはBuilderパターンです。

主なパターン

Java言語で学ぶデザインパターン入門より編集して引用。

  • Iterator
    • 1つ1つ数え上げる
    • 何かがたくさん集まっている時に、それを順番に指し示していき、全体をスキャンしていく
  • Adapter
    • 一皮かぶせて再利用
    • すでに提供されているものがそのまま使えない時、必要な形にラッピングしてから利用する
  • Template Method
    • 具体的な処理をサブクラスにまかせる
    • スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定める
  • Factory Method
  • Singleton
  • Prototype
  • Builder
    • 複雑なインスタンスを組み立てる
    • まず全体を構成している各部分を作り、段階を踏んで構造を持ったインスタンスを組み上げていく
  • Abstract Factory
    • 関連する部品を組み合わせて製品を作る
    • 抽象的な工場では、抽象的な部品(インターフェース・API)を組み合わせて抽象的な製品を作る
  • Bridge
    • 機能の階層と実装の階層を分ける
    • 「機能のクラス階層」と「実装のクラス階層」を2つの独立したクラス階層に分ける
  • Strategy
  • Composite
    • 容器と中身の同一視
    • 容器の中にさらに容器を入れたりして、容器と中身を同一視し、再帰的な構造を作る
  • Decorator
    • 飾り枠と中身の同一視
    • オブジェクトにどんどんデコレーション(飾り付け)をほどこしていく
  • Visitor
    • 構造を渡り歩きながら仕事をする
    • データ構造に対する処理が一種類ではないような状況で、データ構造と処理を分離し、データ構造の中を巡り歩く「訪問者」を表すクラスを用意し、そのクラスに処理を任せる
  • Chain of Responsibility
    • 責任のたらい回し
    • 複数のオブジェクトを鎖(チェーン)のように繋いておき、その鎖を順次渡り歩いて、目的のオブジェクトを決定する(次の人、次の人に要求をたらい回す)
  • Facade
    • シンプルな窓口
    • たくさんの複雑なクラスに対する窓口となるインターフェースを提供する
  • Mediator
    • 相手は相談役1人だけ
    • メンバーはみんな相談役だけに報告し、メンバーへの指示は相談役だけから来る
  • Observer
    • 状態の変化を通知する
    • 観察対象の状態が変化すると、観察者に対して通知する
  • Memento
  • State
    • 状態をクラスとして表現する
  • Flyweight
    • 同じものを共有して無駄をなくす
    • インスタンスをできるだけ共有させて、無駄にnewしない
  • Proxy
    • 必要になってから作る
    • 本人の代わり(代理)となる代理人を用意し、代理人ができる範囲を超えた仕事がやってきたら、本人に相談する
  • Command
    • 命令をクラスにする
    • 命令を1個の「もの」と表現し、イベントをインスタンスのような「もの」として扱う
  • Interpreter
    • 文法規則をクラスで表現する
    • プログラムが解決しようとしている問題を簡単な「ミニ言語」で表現する

主なパターン(マルチスレッド編)

Java言語で学ぶデザインパターン入門 マルチスレッド編より編集して引用。

  • Single Threaded Execution
    • この橋を渡れるのは、たった1人
    • 同時に1つのスレッドだけが処理を実行できるように制限を設ける
  • Immutable
    • 壊したくとも、壊せない
    • クラスを不変で変わらないことにすることで、スレッドの排他制御をする必要が無くする
  • Guarded Suspension
    • 用意できるまで、待っててね
    • 今、この処理を実行されては困るという時に、処理の手前でスレッドを待たせる
  • Balking
    • 必要なかったら、やめちゃおう
    • 今、この処理を実行されては困る、または実行する必要が無い時に、処理の手前で実行をやめて帰ってしまう
  • Producer-Consumer
    • わたしが作り、あなたが使う
    • 生産者は、消費者に、安全にデータを渡すが、生産者と消費者の間に「橋渡し役」が入る
  • Read-Write Lock
    • みんなで読んでもいいけれど、読んでいる間は書いちゃだめ
    • 複数個のスレッドが同時に読むのは構わないが、読んでいる間は書くことはできない
  • Thread-Per-Message
    • この仕事、やっといてね
    • 何らかの命令や要求ごとに新しく1つのスレッドが割り当てられ、そのスレッドが処理を行う
  • Worker Thread
    • 仕事がくるまで待ち、仕事がきたら働く
    • 「仕事をする人」「作業者」であるワーカースレッドが仕事を1つずつ取りにいき、処理を行う
    • 仕事が無かったら、ワーカースレッドは、新しい仕事が届くまで待つ
  • Future
    • 引換券を、お先にどうぞ
    • 実行結果を得るまで待つ代わりに「引換券」をもらう
  • Two-Phase Termination
    • あとかたづけしてから、おやすみなさい
    • 終了処理をきちんと行ってからスレッドを終了させる(2段階の終了)
  • Thread-Specific Storage
    • スレッドごとのコインロッカー
    • それぞれ、別々の記憶領域に固有の貯蔵庫を持つ
  • Active Object
    • 非同期メッセージを受け取る、能動的なオブジェクト
    • 個人が集まって法人を構成するように、非同期な能動的なオブジェクトを構成する

オブジェクト指向モデリング

以下はおうちで学べるプログラミングのきほんを参考に執筆・引用しました。

業務開発の手順

プログラムの業務開発の手順は以下のようになる。

  • 1.情報収集
    • まず、情報収集を行う。その業務で実際に何が行われているのか、誰が関わるのか、どのようなものや情報が行き来するのか。
  • 2.分析
    • 次に、そうした収集した情報を分析し、「何を作るのか」を決めていく。
  • 3.設計
    • いかにしてプログラムに落とし込むかを考える。
  • 4.実装
    • 実際にプログラムを開発する。
  • 5.運用
    • 出来上がったプログラムを動かして業務を遂行する。

大切なのは分析工程です。それ以降の全てのフェーズをここで決めるため、ここが甘いと、要求されているシステムとは別のシステムができてしまい、それ以下の手順をやり直さなければならなくなります。

オブジェクト指向モデリングとは

  • 静的分析1
    • オブジェクト指向モデリングでは、情報収集で得られた概念から中心的な役割を果たすものを「クラス」とし、付随する情報を「クラスの属性」とする。
  • 静的分析2
    • また、発見されたクラス同士の関連性を見つけ出し、各クラスがどのように組み合わさってシステムの構造を作り出しているかを考える。
  • 動的分析1
    • そして、システムの利用者が利用する機能を洗い出し、各機能でどのような処理を行うのか(ユースケース)を書き出す。
  • 動的分析2
    • 最後に、洗い出されたユースケースごとに、処理を実行するにあたって、オブジェクトがどのように連携しながら動作するのかを記述する。

UML

UMLオブジェクト指向モデリングにおける「共通言語」のようなもので、それぞれの担当者がどのようなシステムを開発するかにおけるビジョンを共有するために使う。
UMLには以下のような図が存在する。

  • クラス図(静的モデル)
    • システムの静的側面の分析結果として得られたクラス群を記述する。
    • 三段組あるいは二列の二段組に分かれた四角形でクラス名とともに属性・操作を記述する。
    • またクラスに属する個別のオブジェクトを表記することもできる。
    • オブジェクトは最上位に「オブジェクト名:クラス名」とし、属性は「商品番号=2586」のようにする。
  • クラス図の関連
    • クラスとクラスの関係をそれらの間を結ぶ実線で表記する。
    • 多重度には、関連する相手のクラスのオブジェクトが何個ありうるかを書く。
    • ロール名は関連において双方のクラスの役割を明示するための名前。
  • 集約とコンポジション
  • 汎化
    • クラスについてより一般的なものを表す。
    • 小学校や中学校を「学校」であるとするなど。
  • 依存
    • あるクラスのオブジェクトが一時的に別のクラスのオブジェクトを使用するといった短期的な関係を表す。
  • 実現
    • 操作のみを定義したクラスと、その操作を実際に実現したクラスの関係を表す。
  • ユースケース図(動的モデル)
    • システムを「利用のされ方」から見たもの。
    • 利用者を表すアクターを人型で表記し、アクターが利用する機能すなわち「ユースケース」を楕円で表記する。
  • シーケンス図(動的モデル)
    • オブジェクトがお互いを呼び出す様子を時系列にそって表現する。
    • 処理に関連するオブジェクトを横に並べ、上から下に向かって時間が進んでいくように表記する。

プログラムの設計

プログラムは、オブジェクト思考モデリングによって、作ろうとしているシステムについての明確なビジョンを得ることができる。
あとはそれを正しく作るだけであって、開発工程は「分析」から「設計」となる。
設計とは「分析結果を元に、特定のハードウェアおよびOSの上で、特定のプログラミング言語を用いたプログラムとしてシステムを実現する方法を明確にする作業」だと言える。
分析工程が「システムのありよう」を偏りなく正確に見据える作業だとするならば、設計工程は与えられた道具を用いて「システムを現実的に動作させる仕組み」を考えだす作業と言っても良い。

アスペクト指向

アスペクト指向とは

アスペクト指向とは、複数のクラスを横断する「横断的関心事」と呼ばれる処理を、ひとつの「アスペクト」と呼ばれるモジュールに記述することのできるプログラミングパラダイム
従来のオブジェクト指向では、複数のクラスで同一の処理を行う場合、処理を「実行する場所」に書かなければならない。
そのため、たとえば「全てのメソッドでログをとりたい(ロギング)」と言った場合に、それぞれのメソッドにロギングのコードを記述することが必要になる。
これでは、「ロギングの処理を変えたい」といった時に、全てのコードの処理を書き換えなければならない。
アスペクト指向では、そうした処理をアスペクトと呼ばれる外部のモジュールにまとめ、アスペクトの側で「このクラスとこのクラスのメソッドが実行される時」といったように「時」を指定してやることで、コードをまとめて編集しやすくする。

簡単な説明

Java応用

Swing

SwingはPure Javaで書かれたJavaのツールキットであり、Javaの理想通り、どんな環境でも同じ見た目になる
その代わり、独自のフラットな魔術的な雰囲気のする見た目(ルック・フィール)になる
Windowsネイティブのルック・フィールがいいなら、IBMEclipse向けに開発したSWTJavaでネイティブGUIが開発できる)を使うか、VB.NETC#MicrosoftJavaという位置づけの.NET Framework向け言語)でWindows.Formsを使った方が良い

AltJava

AltJavaとは「Java代替言語」のことで、JavaVMの上で動き、Javaのクラスライブラリを使用しながら、動的型付けなど独自の文法でプログラミングができる

Scala

スケーラブルを重視したAltJavaで、Kotlinが登場する以前は「AltJavaの最前線」であるとみなされていた

Kotlin

IntelliJ IDEAで有名なJetBrains社のロシアの研究所が開発したロシア製のAltJava言語で、Androidアプリ開発の標準

サーブレット

Javaアプリケーションサーバで動かす
3階層型システムのWebサーバ、APサーバ、DBサーバで言えばAPサーバ
エンタープライズ開発ではJavaサーブレットは非常に普及している
単なるPHPの代替としても使える

Webフレームワーク

JavaのWebフレームワークはフルスタックフレームワークではなく、用途によってさまざまなシステムを組み合わせて使う
Strutsが標準だが、多くの人々から「オブジェクト指向Javaらしくない」と言って嫌われている

Eclipse

IBMによって開発されたオープンソースIDE

IntelliJ IDEA

JetBrainsによる有料IDE(機能制限されたオープンソース版もある)
Android Studioのベース

デザインパターン

23種類の設計のネタ帳
有名なものにBuilderパターンなど
イテレータやアダプタのような単純なパターンから、抽象ファクトリーや状態・記憶や代理人を扱ったりする設計上のデザイン、ミニ言語などの高度なパターンもあるので、一度目を通しておこう