Back To Main

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ ◆Javaで珈琲ブレイク vol.016 ◆
┃……………………………………………………………………………………………
┃ [不定期] まぐまぐ ID=0000088576 Melma! ID=m00061296
┃……………………………………………………………………………………………
┃ 今回からご覧になる方は、バックナンバーご活用下さい
┃ http://javacafebreak.tripod.com
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

◆目次◆

■8月の予定・感想を聞かせてください
■あなたはJavaで珈琲ブレイクを読んでいますか?内容の難易度はどうですか?
■Question 11-3
■Psuedo Code (スード・コード、疑似コード)
■checkPassword()メソッドのスード・コード
■Question 14


皆さん、こんにちは。


Mr.Hackです。いやー、なかなか、でませんね。JBuilder 7 Personalの日本語版。ローカライズだけだから、基本的には、時間かからないと思うのですけどねー。それとも、ビジネス上の戦略なのですかね。(先ほど確認したら、雑誌の付録には付いているそうです。)。ぜひ、米国ならって、興味持っている方にダウンロードさせてほしいですね。待っている間に、Sun Oneとかほかのソフトにいくひともいるかもしれませんし。7は、6とそれほど変わっていないのですが(むしろ、Unit Test機能を省略されたり、Personal版は退化?)、すこーしだけ、便利になっています。読者の皆さんの中には、新しいものじゃないとヤダーという方もいらっしゃるでしょうから、もう少し待ちましょう。9月まででなければ、Borlandに愛想を尽かして、ほかのプロダクトを使おうか、6を使おうか考えています。6でも基本的には十分なんですが。もう少し様子をうかがってみましょう。

その間に、今月8月の予定を少し。

■8月の予定・感想を聞かせてください
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

JBuilerを使う前に、パスワードをチェックするプログラムを完成させます。それが完成したら、staticキーワードのお勉強と、JUnitというUnitテストツールを使えるようになりましょう。それから、リファクタリングについて学びます。単体テストとリファクタリングは密接な関係なので、8月中か9月頭ぐらいまでに学べればいいなと思っています。

それから、皆さんがどうやって勉強しているか、感想を聞かせてください(javacafebreak@hotmail.com)。1000部数ぐらい発行しているのですが、僕が思うに、ちゃんと読んで勉強されている方は10%ぐらいじゃないのかな、と思っています。その熱心な方のために、理解しやすい内容を心がけていきたいなと思っています。もちろん内容を優しくすることはできますが、わからないことがあるからこそ勉強する意味があると、僕は思っています。一読して理解できたから、Javaの理解が深まったとはおもっていません。それは、むしろ自分が理解している知識の確認にすぎない面も多々あるからです。一読してわかる内容に気を配っておりますが、わからない、これ、どうやって調べればいいの?とか、ここ、前にもどこかでみかけたな、とおもって参考書を調べるきっかけになればいいなと思っている面もあります。スタンスは今までと同じようにいこうと思っていますが、もっと高度な内容にしろ、とか、90%は言っていることがわからないからもっと優しくしろ、とか、シリーズものではなく単発ものにしろとか、ご感想がありましたら、是非聞かせてください。多忙のためお返事はすぐにはできないかもしれませんが、必ずメールをいただいた方にはお返事しております。ご感想お待ちしております。

また今回は、その第一段として、Javaで珈琲ブレイクを読んでいるか教えてください。皆さんが、メールを活用していただいているのか、また、難しすぎないかどうかとても気になります。皆様の意見次第では、コンテンツも変更していこうと思っていますので、どうぞアンケートにご協力ください。投票はもちろん匿名です。皆さんが思ったことに一番近い文の下をクリックしてください(ダイアルアップでインターネット接続されている方は、インターネットサーフィンしているときに、クリックしていただけると助かります。)

例えば、

◆購読したとき以来、目を通したことがない。
┗< http://clickanketo.com/cgi-bin/a.cgi?r00011580a83 >

『購読したとき以来、目を通したことがない。』というコメントに一番近いと思いましたら、その下のリンク┗< http://clickanketo.com/cgi-bin/a.cgi?r00011580a83 >をクリック(メールソフトによってはダブルクリック)してください。

それでは、質問です。

■あなたは、Javaで珈琲ブレイクを読んでいますか?内容の難易度はどうですか?━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

◆必ず目を通すが、ほぼ理解している。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580aa1 >

◆必ず目を通すが、たまに分からないことがある。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580a12 >

◆必ず目を通すが、難しくとばし読みである。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580a83 >

◆殆ど目を通すが、ほぼ理解している。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580af4 >

◆殆ど目を通すが、たまに分からないことがある。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580a65 >

◆殆ど目を通すが、難しくとばし読みである。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580ad6 >

◆気が向いたら目を通すが、ほぼ理解している。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580a47 >

◆気が向いたら目を通すが、分からないことがある。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580ab8 >

◆気が向いたら目を通すが、難しくとばし読みである。
┗< http://clickanketo.com/cgi-bin/a.cgi?q00011580a29 >

◆今は忙しくて、ほとんど目を通さない。
┗< http://clickanketo.com/cgi-bin/a.cgi?r00011580aa1 >

◆無料購読しているだけで、ほとんど目を通さない。
┗< http://clickanketo.com/cgi-bin/a.cgi?r00011580a12 >

◆購読したとき以来、目を通したことがない。
┗< http://clickanketo.com/cgi-bin/a.cgi?r00011580a83 >

☆締切:2002年08月09日18時00分
★協力:メールマガジンをおもしろくする《クリックアンケート》
→→ [ http://clickanketo.com/ ]

アンケートにご協力ありがとうございました。途中経過・最終結果はこちらからごらんいただけます。

http://clickanketo.com/cgi-bin/a.cgi?q00011580a30

クリック一つするのもめんどくさいんですよね。僕もとばしちゃうクチです。でも、皆さんとインタラクティブにメールマガジンを発行できればいいなと思っていますので、皆様のクリックする10秒の時間をお貸しください。どうもありがとうございました。

さて、雑談はこの辺にして、本題に戻しましょう。前回は、Question 11のNo.2、アカウントIDの仕様をプログラムしました。今回は、パスワードの仕様をプログラムしていきます。

■Question 11-3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

3. パスワードの仕様は以下の通り

(a) パスワードはアルファベットの大文字か小文字、または、数字のみ
(b) パスワードは最低アルファベットの大文字、小文字、数字をそれぞれ一字づ つ含む
(c) 最低5文字以上の文字列から構成されなければならない
(例) mRha9

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

(a)は、checkAccountId()メソッドで使った方法とほぼ同じですね。それに加えて、数字の場合を考えなければなりません。

(b)は、ちょっと複雑です。大文字・小文字・数字がそれぞれ一字ずつ含まなければなりません。どうやってチェックすればいいでしょうか?

(c)は、字数以外はcheckAccountId()メソッドと同じですね。

まずは、(c)、そして、(a)、(b)という順番でみていきましょう。

パスワードをチェックするメソッドの定義を

┌──────────────────────────────────┐
boolean checkPassword(String password)
└──────────────────────────────────┘

としましょう。パスワードである文字列passwordを引数としてcheckPassword()メソッドに渡して、その文字列passwordが上記の(a)、(b)、(c)を満たしていなければboolean型のfalseを、全ての条件を満たしていれば、trueを返すようにしましょう。

■Psuedo Code (スード・コード、疑似コード)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
前回も、実際にJavaでプログラムを書く前に、大まかな概要を日本語を使って表記しプログラムのロジックの流れを考えました。これは、紙に自分の考えをスケッチするように全体の流れを考える上で非常に有効な方法です。このロジックの流れをJavaのような実際のプログラムコードに頼らずに表記する方法をPsuedo Code(擬似コード)といいます。実際英語で発音するときはPは発音せずにスード・コードと発音します。このPsuedo Codeの長所は、各プログラミングコードに依存しない表記(ここでは、日本語や簡単な記号を駆使してロジックを考える)なので、各プログラム言語固有のシンタックスを考える必要がなく、ロジックに専念できることです。では、Psuedo Codeはどうやって表記するのかと言いますと、実は明確な定義がないのです。僕がならったDiscrete Mathのクラスでは、Visual Basicのようなシンタックスを使いました。アルゴリズムのクラスでは、一つの本の最初に大まかなシンタックスを定義しそれに沿ってアルゴリズムを勉強しました。つまり、シンタックスや表記の仕方は何でもいいのです。一番重要なことは、

┌──────────────────────────────────┐
プログラム言語のシンタックスにとらわれず、ロジックに集中できるようにする
└──────────────────────────────────┘

ことが、Psuedo Codeで大事なことなのです。僕は日本語とJavaのシンタックスをおりまぜてPsuedo Codeを表記していきます。

では、実際にPsuedo CodeでcheckPassword()メソッドを表記してみましょう。

前回もお話ししましたように、String型は参照型(Reference Type)なのでnullである可能性がありますね。そして、nullでない場合、空文字(Empty String)である可能性もあります。それをまずチェックしましょう。また、(C)のように文字列が5文字以上という制限も空文字の条件(String#length()が0)と併せてチェックできました。それらをまとめると下記のようになります。

┌──────────────────────────────────┐
boolean checkPassword(String password) {

if (passwordがnull、OR password.length() < 5の場合) {
return false;
}
....
}
└──────────────────────────────────┘

ここまでクリアーした文字列passwordは、nullでもなく、文字列の長さが5未満でもありませんね。次は、passwordがアルファベットの大文字か小文字か、数字であるように条件を絞り込みましょう。前回のcheckAccountId()メソッドのように、『大文字か小文字か、または数字』でない場合は、falseを返すようにしましょう。passwordの文字列の一つ一つの文字が、『大文字か小文字か、または数字』である場合は、trueを返せばいいので、それでは『ない』場合はfalseを返すでいいですね。

boolean checkPassword(String password)メソッドの続き
┌──────────────────────────────────┐
...
for (index 0 to password.length() - 1) {
if(それぞれのchracterが『大文字か小文字か、または数字』でない場合){
return false;
}
}
...
└──────────────────────────────────┘

さて、ここまでクリアーできた文字列passwordはnullでもなく、長さが5文字未満でもなく、大文字か小文字、または、数字である文字列ですね。ここまでクリアーすればあとは、trueを返していいですか?確認しますが、checkPassword()メソッドがtrueを返すと言うことは、パスワードの仕様(a)、(b)、(c)の条件を全て満たしていることを意味しています。それでは、こんな文字列はどうですか?"Mr.Hack"これは、'.'が入っているので先ほどのfor ループのところでチェックされ、falseが返されるべきですね。つまり、ここの段階まできている文字列passwordには、'."は入っていませんね。それでは、これはどうでしょう?"MRHACK"これは、全ての文字がアルファベットの大文字ですね。for ループでは単にそれぞれの文字が大文字か小文字、または数字であればいいのでこの文字列がfor ループをクリアーしていますね。しかし、パスワードの仕様(b)の

┌──────────────────────────────────┐
(b) パスワードは最低アルファベットの大文字、小文字、数字をそれぞれ
一字づ つ含む
└──────────────────────────────────┘

は満たしていません。(b)を満たしていない状態でtrueを返してしまうのでは、checkPassword()メソッドはちゃんと機能していませんね。それでは、どうすればいいでしょうか?

一つは、先ほどのfor ループのなかで大文字・小文字・数字が文字として含まれていた場合をチェックするフラグ(boolean型の変数)をおいて、全てのフラグがtrueならcheckPasswordがtrueを返すようにする方法です。これは、checkPassword()メソッドがコンパクトに書けると思います。この方法は、後のリファクタリングの勉強の時にみてみましょう。

もう一つの方法は、せっかくcheckAccountId()メソッドで大文字か小文字をチェックするロジックを書いたのですから、それを数字まで拡張した(単に数字をチェックする分をcheckAccountId()のロジックに付け加えるだけ。つまり、上記のforループのロジック)ものを使います。そして、ここまでで、文字列passwordは大文字か小文字、または、数字からなる文字列が保証されているわけですから、今度は、その大文字、小文字、数字が一文字ずつ含まれいるかをチェックすればいいと思います。

たとえば、大文字をチェックするboolean hasUpperLetter(String stringValue)というようなサブメソッドを作ります。同じように、boolean hasLowerLetter(String stringvalue)、boolean hasNumber(String stringValue)をつくります。hasUpperLetter()メソッドで、ある文字列stringValueに大文字(Upper Case)が一つでも含まれれば、trueを返し、全く含まれなければ、falseを返すようなメソッドにします。hasLowerLetter()(小文字、Lower Case)、hasNumber(数字、Number)も同じようにします。そうしますと、

┌──────────────────────────────────┐
if (hasUpperLetter() == true, AND hasLowerLetter() == true, AND
hasNumber() == trueの場合) {
//大文字・小文字・数字をそれぞれ少なくとも一つ含む
return true;
}
└──────────────────────────────────┘


とできますね。しかし、ここで、事前条件の一部としてこのif節も作りたい(trueを戻り値として返すのは、全てのif節等の条件をクリアーして最後の最後だけ。それ以外は全て条件が満たされなかったしてfalseを返すようにしたい)ので、上記のif節の条件の否定をとって(ド・モルガンの法則を適用)、

┌──────────────────────────────────┐
if (hasUpperLetter() != true, OR hasLowerLetter() != true, OR
hasNumber() != trueの場合)
//大文字・小文字・数字全てを含まない
return false;
}
└──────────────────────────────────┘

とします。さて、ここまでクリアーした文字列passwordはパスワードの仕様(a)、(b)、(c)すべてを満たします。故に、最後の最後で、

┌──────────────────────────────────┐
return true;
└──────────────────────────────────┘

を返します。つまり、最後までたどり着いた場合は、return trueを返すわけですね。

すこし、もどりまして、hasUpperLetter(String stringValue)はまず、nullと空文字をチェックします。

┌──────────────────────────────────┐
boolean hasUpperLetter(String stringValue) {

if (stringValueがnull、OR 空文字) {
return false;
}
...
└──────────────────────────────────┘


そして今度は、一つでもアルファベットの大文字が含まれていればいいので一文字一文字チェックするforループの中では、大文字が含まれていたときにtrueを返すようにしましょう。

boolean hasUpperLetter(String stringValue) の続き
┌──────────────────────────────────┐
...
for (index 0 to stringValue.length() - 1) {
if (characterがアルファベットの大文字) {
return true;
}
}
return false;
└──────────────────────────────────┘

そして、forループの中でtrueを返さずに抜けた場合は、アルファベットの大文字が一つも含まれなかったので、stringValueには大文字が含まれないのでfalseを返します。これと同じロジックで、hasLowerLetter()とhasNumber()も書けますね。

もう一度Psuedo Codeで全体を確認してみましょう。

■checkPassword()メソッドのスード・コード
┌──────────────────────────────────┐
boolean checkPassword(String password) {

if (passwordがnull、OR password.length() < 5の場合) {
return false;
}

for (index 0 to password.length() - 1) {
if(それぞれのchracterが『大文字か小文字かまたは数字』でない場合){
return false;
}
}

if (hasUpperLetter() != true, OR hasLowerLetter() != true, OR
hasNumber() != trueの場合)
//大文字・小文字・数字全てを含まない
return false;
}

return true;

}
└──────────────────────────────────┘

それでは、今週の宿題に言ってみましょう。今週は、擬似コードをJavaで書き直してみましょう。ロジックの流れがつかめれば後は、実際の言語に直してあげるだけです。

■Question 14
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1.上記のPsuedo Code(疑似コード)をJavaで書き直しなさい。


2.下記のメソッドをBankAccountクラスに付け加えなさい。

void setAccountId(String accountId)
String getAccountId()
void setPassword(String password)
boolean equalsToPassword(String userPassword);

3ー1.BankAccountクラスに、以下のコンストラクタを付け加えなさい。

BankAccount(String accountId, String password, double amount)
BankAccount(String accountId, String password)

3−2.それに伴い、BankAccount()、BankAccount(double amount)の
コンストラクタを『推奨されない』コンストラクタとしなさい
(Javadocの@deprecatedタグ)。


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

ヒント

1.はすでにロジック部分ができているので後はJavaのシンタックスに従えばいいですね。


2.は、インスタンスを生成した後、のちに、パスワードの変更をするかもしれません。アカウントIDは一度作ると基本的には変更不可にする場合もありますが、ここでは、変更可能を許容したいと思いますので、setAccountId(String accountId)も作ります。getPassword()メソッドがないのは、パスワードを取り出せないようにした方がセキュリティー上よろしいのではないかという配慮からです。ユーザーが入力したパスワードとインスタンス生成時に作成したパスワードとの比較は、equalsToPassword(String userPassword)というメソッドで比較します。

3.は、いままで使っていた二つのコンストラクタ、BankAccount()、BankAccount(double amount)はaccountIdとpassword設置に伴い、推奨されないコンストラクタにします。といいますのも、インスタンス生成時(新しく口座を開設する時)、accountIdとpasswordは忘れずに設定したいですね。passwordはともかく、accountIdは口座番号ですので、アカウントを決める重要なキーになります。

それでは、みなさん、またあいましょう。

Mr.Hack


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

© 2002 MR.HACK ALL RIGHTS RESERVED