Back To Main

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ ◆Javaで珈琲ブレイク vol.009 後編◆
┃……………………………………………………………………………………………
┃ [不定期] まぐまぐ ID=0000088576 Melma! ID=m00061296
┃……………………………………………………………………………………………
┃ 今回からご覧になる方は、バックナンバーご活用下さい
┃ http://www.melma.com/mag/96/m00061296/
┃ http://backno.mag2.com/reader/Back?id=0000088576
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

◆目次◆

■バージョンの記述の仕方超入門
■@see、@linkタグ
■@deprecatedタグ
■JavaドキュメントはHTML
■javadocコマンドオプション
■Question 9


前編からの続きです。

■バージョンの記述の仕方超入門
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
バージョンの記入の仕方は一般的に、メイジャー・リリース・ナンバー(Major Release Number)、マイナー・リリース・ナンバー(Minor Release Number)そして、バグフィックス・リリース・ナンバー(Bugfix Release Number)の順に記述します。たとえば、Java SDK 1.3.2は

メイジャー・リリース・ナンバーが1
マイナー・リリース・ナンバーが3
バグフィックス・リリース・ナンバーが2

ということになります。Majorバージョンが変わるのは、前のバージョンともはや互換(compatible)を保てなくなった場合やデザインのし直し(redesign)した場合です。それだけ変化が劇的に変わった時に、Majorバージョンが変わります。Minorバージョンが変わるのは、新しい機能の追加があった場合や、機能の強化があった場合です。そして、Bugfixバージョンが変わるのは、新しい機能は追加していないが、その機能がちゃんと機能していないバグを修正した場合です。

これのメリットは、Major、Minor、Bugfixと種類のカテゴリーがあるので、バージョンの課程を厳密に区別することが出来ます。

しかしながら、逆に三種類のカテゴリーがあるので、バージョン管理になれていないと、どこでどうbug fixからminorへ、minorからmajorへ変わるのか定かでなかったり、前回のバージョンを記載し忘れたりした場合に誤ったバージョンを記載してしまう場合もあります。たとえば、1.3.1から1.3.4になってしまう場合などです。

それを補うように、ある意味オートメーションにしたのが、メイジャー・リリース・ナンバーの後に、日付ナンバーを記載する方法です。例えば、バージョンナンバーが1.0601とあれば、

メイジャー・リリースナンバーが1
日付なんばーが0601(そのリリースした日付)

ということになります。これは、手作業でバージョン情報を記入しなくてよく、
変更した日付を記載するだけでバージョン情報を記入できます。これは、とても、簡単にバージョン情報を管理できますね。

ただ、一つ問題があります。その問題とは、年に一度、必ずメイジャーバージョンを変えないといけないことです。そうしないと、来年の3月1日にアップデートすると1.0301となり、1.0601よりバージョンが古くなり矛盾が生じてしまいます。

このメルマガが何年にわたって続くとは思っていないので(つづくといいですが)Mr.Hackは後者のバージョン情報記述方法で記載していこうと思います。また、同じ号のメルマガで同じクラスで変更が生じた場合、サブナンバーを最後につけるかもしれません。この記述方法だと前回のメルマガに乗っているバージョンはいくつだったっけ?と確認する時間が省けとっても便利なのです。

皆さんも、プログラムに記述するバージョン情報で最初は一般的な記述方法はちょっとめんどくさいな、という場合は後者の日付式バージョン方法で記載してみてください。後から記述しようとおもって、記述し忘れるのが一番良くありませんからね。

■@see、@linkタグ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ドキュメントで他のメソッドやクラスの記述を参照してもらいたい場合はどうすればいいのでしょうか?クラスやメソッドの記述では、@seeタグを使います。記述方法は、

┌──────────────────────────────────┐

@see 参照先のクラス等 (その記述)

例:
@see BankAccount
@see BankAccount#deposit
@see BankAccount#deposit deposit(double)メソッド

└──────────────────────────────────┘

です。参照先にはクラス・インターフェイス・メソッド・フィールドを指定できます。メソッド・フィールドを指定するときはクラスの後に、『#』を入れます。また、その後、オプションでクラスで記述すると、その記述したコメントにリンクが張られます。上記がjavadocで実行されると、

┌──────────────────────────────────┐

関連項目:
BankAccount, BankAccount.deposit(double), deposit(double)メソッド

└──────────────────────────────────┘
となり、それぞれにリンクが張られます。ちなみに『関連項目:』は自動的に、
挿入されます。

@linkは、@seeタグと機能は同じですが、コメントの中でリンクを張りたいところにどこでも使うことが出来ます。記述方法は、

┌──────────────────────────────────┐

{@link 参照先のクラス等 (その記述)}

例:
/**
* {@link BankAccount}と
* {@link BankAccount#withdraw BankAccountのwithdraw()メソッド}
*/

└──────────────────────────────────┘

で、例では、『BankAccountとBankAccountのwithdraw()メソッド』と表示され、それぞれ、BankAccount、BankAccountのwithdraw()メソッド、にリンクが張られます。

■@deprecatedタグ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
BankAccountクラスの中にgetBlance()とgetBalance()メソッドがあります。その二つの機能性は全く同じです。違うのはメソッド名だけです。getBlance()メソッドを単に名前が不適切だというだけで消せない理由を以前述べました。それは、インターネット上に配布した以上、すでにダウンロードしてそのAPIを使用している人がいるだろうからですね。具体的にいえば、BankAccountクラスのクライアントであるBankAccountTestクラスがその例です。BankAccountTestクラスはすでにgetBlance()メソッドをテストするために、使用していましたね。もし、getBlance()メソッドを次期のバージョンアップで何の予告もなく消してしまったらどうなりますか?BankAccountTestクラスはコンパイル出来なくなりますね。なぜなら、getBlance()というメソッドがすでに存在しなくなるわけですから。これは、宜しくありませんね。かといって、getBlance()も残しておいて、Javaドキュメントに残してとユーザであるプログラマに混乱をあたえますね。もっとジェントルに対処する方法はないのでしょうか?

それの解決してくれるのが、@deprecatedタグです。使用方法は、

┌──────────────────────────────────┐

@deprecated 推奨されない理由等の記述


/**
* @deprecated メソッド名不適切のため、バージョン1.0518から
* {@link #getBalance}に切り替え。
*/
└──────────────────────────────────┘

です。そこに記述すべきことは、推奨されない理由、いつのバージョンから代替メソッドに切り替わったか、代替メソッド先へのリンク等です。

@deprecatedタグの特筆すべきことは、コンパイラーがコンパイル時にこのタグがあることをclassファイルに記述しておくことです。普通コンパイラーはコメントされたところは、全て無視してclassファイルに書き込むことはありません。このclassファイルにノートを書き込むことによって他のクラスがこの@deprecatedタグをもったクラスをコンパイル時に参照使用とすると、

┌──────────────────────────────────┐

推奨されない API を使用またはオーバーライドしています。

└──────────────────────────────────┘


というような、警告を発してくれるのです。もちろん警告なので、参照しているクラスはコンパイル出来ます。しかし、この警告を出すことによって、ユーザーに代替のメソッド等を使うことを促すことが出来ます。

実際に警告を見てみましょう。

まずは、前回vol.008のBankAccount.javaとBankAccountTest.javaをCPadをつかって開いて下さい。そして、メニューの『実行』→『エクスプローラーを起動』を選択し、エクスプローラーから、BankAccount.classとBankAccountTest.classが存在していれば、削除します。

次に、CPad上でBankAccount.javaのタグを選び、左から4番目の『make or コンパイル』アイコンを押して、BankAccount.javaだけコンパイルします。これで、このクラスファイルに@deprecatedのノートが書き込まれました。

次は、BankAccountTest.javaを同じようにコンパイルします。すると、

┌──────────────────────────────────┐

注: BankAccountTest.java は推奨されない API を使用またはオーバーライ
ドしています。
注: 詳細については、-deprecation オプションを指定して再コンパイルし
てください。

└──────────────────────────────────┘

と警告がでます。しかしながら、先ほど開いたエクスプローラでフォルダを見てみるとBankAccountTest.classが生成されていますので、コンパイルは出来ました。もちろん実行ボタンを押すとBankAccountTestクラスが実行されテスト結果がスクリーンに表示されます。

-deprecationオプションを使って、BankAccountTest.javaをもう一度コンパイルしてみましょう。CPad上のメニューの『実行』→『コマンドプロンプトを起動』
を選択し、コマンドプロンプト上で、

┌──────────────────────────────────┐
javac BankAccountTest.java -deprecation
└──────────────────────────────────┘

とタイプすると、

┌──────────────────────────────────┐

bankaccounttest.java:118: 警告: BankAccount の getBlance() は
推奨されません。
if (account.getBlance() == expectedAmount) {

bankaccounttest.java:120: 警告: BankAccount の getBlance() は
推奨されません。
account.getBlance());

bankaccounttest.java:124: 警告: BankAccount の getBlance() は
推奨されません。
expectedAmount + " Actual Balance ; " + account.getBlance());

bankaccounttest.java:133: 警告: BankAccount の getBlance() は
推奨されません。
if (account.getBlance() == expectedAmount) {

bankaccounttest.java:135: 警告: BankAccount の getBlance() は
推奨されません。
account.getBlance());

bankaccounttest.java:139: 警告: BankAccount の getBlance() は
推奨されません。
expectedAmount + " Actual Balance ; " + account.getBlance());

警告 6 個

└──────────────────────────────────┘

と警告が発せられます。これによって、getBlance()メソッドが推奨されないことをユーザーに知らせ、使うべきではないことをユーザーに暗に伝えることが出来るのです。

■JavaドキュメントはHTML
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Javadocで生成されるドキュメントはHTMLなので、基本的にはHTMLタグがつかえます。例えば、<I>は強調するときに、、<CODE>はクラス・メソッド等を記述するときに、<PRE>は複数行をインデント・スペースを含めて記述するときに、<P>は段落で区切る時に使います。

使用していて結構便利なのは、<PRE>だと思います。Javadocで生成されるコメントは、半角スペースがあっても、それを取り除かれてしまうのでコードを書くとみんな左寄りになってしまいます。それを<PRE>でくくってあげると、半角スペースを含めた、コードを生成してくれます。

┌──────────────────────────────────┐

/*
* <PRE>
* BankAccount account = new BankAccount(2000);
* try {
* account.deposit(1000);
* account.withdraw(500);
* }
* catch (Exception e) {
* Sytem.out.println("例外が発生しました:" + e.getMessage());
* }
* double currentBalance = account.getBalance();
* </PRE>
*/

は、

BankAccount account = new BankAccount(2000);
try {
account.deposit(1000);
account.withdraw(500);
}
catch (Exception e) {
Sytem.out.println("例外が発生しました:" + e.getMessage());
}
double currentBalance = account.getBalance();

と表示

└──────────────────────────────────┘

■javadocコマンドオプション
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
先ほど見ました@authorや@versionタグはデフォルトではHTMLに出力されません。HTMLのJavaドキュメントに含めたい場合は、javadocコマンドで

┌──────────────────────────────────┐
javadoc *.java -author -version
└──────────────────────────────────┘

とタイプします。そうすることで@author、@versionタグで記述した内容が出力去れいます。

今回は全てのコマンドオプションにはふれませんが、コマンドオプションにはどんなモノがあるかみたい場合は、

┌──────────────────────────────────┐
javadoc -help
└──────────────────────────────────┘

とタイプするとオプション群を見ることが出来ます。

今回は、Java ドキュメントについて見てきました。これで、皆さんはいつでもJavaドキュメントを作成できますね。これは、一義的にはあなたのプログラムを見るユーザーのためではありますが、あなた自身のためでもあることを常に念頭において、めんどくさがらず作成して下さいね。

さて最後に、今週の宿題です。今回は次回のユーザーインターフェイス作成のウォーミングアップをしましょう。

■Question 9
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

コンソールベースのメニューを扱うBankUserInterface.javaを作成しなさい。 ただし、BankAccount.javaのインスタンスを使用してはならない。
BankUserInterface.javaの仕様は下記の通り。

a)プログラムを起動した後に、銀行預金システムである旨をを表示する

b)現在の残高を表示する。

c)ユーザーに預金額を求める。
ユーザーがなにも預金しない場合は0を入力させる。

d)現在の残高を表示する。

e)ユーザーに引き出し額を求める。
ユーザーが何も預金しない場合は0を入力させる。

f)現在の残高を表示する。

g)もう一度b)からf)まで同じことを繰り返すかどうか、ユーザーに尋ねる。

h)そこで、qかQをタイプした場合のみ、プログラムを抜ける。

※b)からh)までは一連の作業である。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ヒント:

Mr.Hackコーポレーションの社員であるあなたは、この2ヶ月でJavaのプログラムの基礎を勉強し、いよいよ、配属が決まりました。配属先は、ユーザーインターフェイスを作る部署です。ここでは、バックエンドである、BankAccountクラスのようなAPIは作成しません。ユーザーがいかに使いやすくプログラムを使用できるかが、最大のテーマです。あなたは、目に見えるユーザインターフェイスの作成にわくわくです。

あなたは、BankAccountクラスを今現在では使えないことが分かりました。というのも、ここのプロジェクトチームとバックエンドのBankAccountクラスのようなAPIを作成するプロジェクトチームとのプログラムの実際の調整はまだ先なのです。バックエンドプロジェクトチームからは、BankAccountクラスのAPI仕様書しか渡されていません。あなたは、上司にどうやって、BankAccountクラスがないのにコンパイルするのだと尋ねました。BankAccount.classがなければ、一緒にコンパイルすることは出来ないからです。

上司は、バックエンドプロジェクトチームから、実際に使うところは、コメント//をつかって

// bankAccountOjbect.deposit(amount);

というようにダミーをプログラムに置くように指示がでていると教えてくれました。あなたは、はやく完成されたBankAccountクラスをわたしてくれー!とおもいながら、渋々プログラムにかかります・・・。

いよいよ来週はユーザーインターフェイスの部分の作成に取りかかります。しかしながら、プログラムの規模が大きくなるとプロジェクトチームベースで一つのアプリケーションに取りかかります。プロジェクトチームはユーザーインターフェイスを作るチーム、バックエンドのロジックをになうチーム、はなまた、データベースとのコネクションをになうチームというように、別々のチームが別々にプログラムをしていきます。そして、それぞれが完成したら、プロジェクトチームが一緒になって実際に運用します。そのため、その運用までは、仕様だけ渡され、その仕様に沿ってプログラムを作成します。初心者の方には、なんとも、全て完成しないようで歯がゆいところがあるのは事実ですが、今回は、練習もかねて、BankAccount.javaをBankUserinterface.javaと同じフォルダに置かないで、ユーインターフェイスの部分のみ作成して下さい。

宿題や、メルマガでわからないところがあれば、

http://fweb.midi.co.jp/~romanhikou/cafe_entrance.html

の掲示板から質問して下さい。今回のユーザーインターフェイスのヒントになるコードもおいてありますので、参考にしてみるといいかもしれません。


それでは、see you next week!

Mr.Hack


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆Javaで珈琲ブレイク◆
────────────────────────────────────
皆様からの激励・批判のメールをお待ちしております。
【発行者】 Mr.Hack - javacafebreak@hotmail.com
【掲示板】 http://fweb.midi.co.jp/~romanhikou/cafe_entrance.html
※質問は上記の掲示板からどうぞ。
【サイト】 http://mrhack.hoops.ne.jp/
【発行数】 まぐまぐ[885] Melma[134]
【解除】http://mrhack.hoops.ne.jp/
※解除は上記のサイトからいつでもできます。
────────────────────────────────────
(c)2002 MR.HACK ALL RIGHTS RESERVED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

© 2002 MR.HACK ALL RIGHTS RESERVED