- PR -

日付の比較

投稿者投稿内容
Kiriko
常連さん
会議室デビュー日: 2003/09/25
投稿数: 25
投稿日時: 2003-10-03 03:37
変数名に"int_"のようなPrefixを付けるのは、
変数型宣言をする必要のないVBScriptなどのコードで
よく見かけますが、その習慣を引きずっているのでしょうね。
しかも、primitiveな型だけにこのような命名規則を設けているようですね。
※StringBuffer stringBufferFirstName; さすがにしない?^^

Java言語では、変数を定義する場合、変数型を指定する必要があります。
従って、そのような習慣を引き継ぐ必要はありませんね。

引用:

ここからは全然関係ない話です。
変数にint_のような型名を示すプレフィックスをつけるのは、
コードの可読性の低下(変数名が長くなる、似たような名前だが意味が異なる変数が増える)、
コーディング効率の低下(同じ文字から始まる変数が増えることで
エディタやIDEの入力補完機能が有効に機能しなくなる)などの弊害があります。
変数の型チェックや型変換の妥当性チェックをコンパイラやIDEに任せられる
環境があるのでしたら、プレフィックスをつけないコーディング規則をお薦めします。


私も基本的に同意見です。
ただ、
「変数名には役割がわかるように
意味のある名前を付けることが
、第3者がソースを理解する上で役に立つ。
そのために変数名が長くなることは問題ない。」
という考えです。
ただし、スコープの狭い変数(例.ループカウンタ)は
短い名前、簡略した名前にしています。

多言語からJava言語にシフトされる方や
自分の命名方法に不安がある方は、
オープンソースのソースコードや
何らかのコーディング規約を読んでみると
よいかもしれません。
公開されている有名なコーディング規約には
以下のものがあります。

http://objectclub.esm.co.jp/
「Javaコーディング標準」
roushi
常連さん
会議室デビュー日: 2003/07/18
投稿数: 28
投稿日時: 2003-10-03 06:58
Kirikoさん返信ありがとうございます。

----------------------- 引用 start -----------------------

何ら問題はないと思います。
その例外が発生した時に実行したいことをcatch節に記述すれば
いいのではないでしょうか。
逆に何故そのような疑問をお持ちになったのかお聞きしたいです。
おそらく、書籍などでは次のようなコードが多く、
それが影響しているのかとは想像しています。

try {

} catch (Exception e) {
// StackTraceを出力しているだけで大した処理は記述されていない。
e.printStackTrace();
throw e; // or return;
}

----------------------- 引用 end -------------------------

そうなんです!
もしくは
try {




} catch (Exception e) {
// エラーメッセージを出力しているだけで,大した処理はなし
System.out.println( "エラー内容: " + e );
throw e;
}

というような感じで,書籍にはよく記載されていたので
catch節の中身は,「どのようなエラーメッセージか」を出力することに
専念するものなのだと思い込んでいました。
そうだったのか・・・。


----------------------- 引用 start -----------------------
メモリ管理をしなくていいというのがJavaの売りの1つであると
思っているからです。
----------------------- 引用 end -------------------------

たしかにそうだと思います(書籍にも書いてありました)
なぜ私がそのようなことを考えたかというと
既存のプログラムの中で,そのようなコメント(例://ガベージコレクションを助ける)
が記述されていたからです。
私はこの意味は,使うことがないオブジェクトにはできるだけ早く
ガベージコレクションの対象とするようにnullを代入すると解釈しました

私の中での解釈
・ガベージコレクションはメモリが足りなくなった時に動作する
・オブジェクトにnullを参照させておけばできるだけ早く
 ガベージコレクションの対象にさせることができるということです。
 (※ガベージコレクションを強制的に動作させることを除いて)

書籍で見たことがあるのですが,ガベージコレクションを強制的に
起動させることができるんですよね。
でも使う時はくるのだろうか・・・。

仮にかなりのメモリを食い潰すプログラムがあった時には
不要になったものは,強制的にガベージコレクションを実行させて
メモリを開放するということをしなくても
Javaの売りなだけに,自動的にガベージコレクションを起動させて
くれる気がするのですが・・・。

一気にメモリを使用する場合は,ガベージコレクションとの
並列動作は無理なんでしょうか??

roushi
常連さん
会議室デビュー日: 2003/07/18
投稿数: 28
投稿日時: 2003-10-03 07:28
Kirikoさん
返信ありがとうございます。

「Javaコーディング標準」
参考にさせてもらいます/

koeさん
返信ありがとうございます。

230000と記述したのは誤りでした。
290000
300000
400000

引数に与えるものでcatchされる可能性があるものは
31aabb(31日のデータ) かつ システム時刻が2,4,6,9,11月
30aabb(30日のデータ) かつ システム時刻が2月
29aabb(29日のデータ) かつ システム時刻が2月(注1参照)
(※aabbは正しい時分)
です。

(注1:閏年でない場合)

前提条件として
あきらかに間違った日付(32日以上)が設定されてきた場合は
その時点でエラーを出力するような仕様でしたので
32日以上のデータが引数に設定されることはないという
前提でした。
言葉足らずで申し訳ありません


------------------------------------ 引用 start ---------------------------

解決策ですが、ユリウス暦は知りませんがグレゴリオ暦なら30日以下の月の後には
必ず31日の月があるので、1つ前の月に戻しても日が不正なら、
「さらなる訂正処理」をする、という方法でどうでしょうか。
どういう「さらなる訂正処理」が望ましいかは仕様によるので何ともいませんが。

------------------------------------- 引用 end ----------------------------

さらなる訂正処理・・・。
1.引数に誤った値が設定されることをふまえてプログラムを作成した方がよいのでしょうか。
2.また前述のように,引数に誤った値が設定されている時点で
エラーを出し,処理を行わないという風にした方がよいのでしょうか。

2の方が簡単な気がするのですが。
1.なら仕様次第ということになりそうですね。
誤った日付がきた場合は強制的に2ヶ月前の日付のMAX値に
日の部分だけ置き換える。みたいな・・・

経験がないのでどのような選択が一番最適なのかが
まだ掴みきれていない次第です(:_;)


ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-10-03 09:43
roushiさん、こんにちは。

引用:

roushiさんの書き込み (2003-10-03 06:58) より:

書籍で見たことがあるのですが,ガベージコレクションを強制的に
起動させることができるんですよね。


書籍にはどのように書いて有りましたか?
ガベージコレクションを強制的に起動させる事は出来ないはずですが・・・

[追記]
http://sunsite.tus.ac.jp/pub/sun-info/sun-jp/javaj/jtutorial/java/javaOO/garbagecollection.html
ガベージコレクションの「起動」は出来ましたね...
強制できないのは、「メモリの開放」ですね

[ メッセージ編集済み 編集者: ぽん 編集日時 2003-10-03 09:56 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-10-03 11:55
引用:

さらなる訂正処理・・・。
1.引数に誤った値が設定されることをふまえてプログラムを作成した方がよいのでしょうか。
2.また前述のように,引数に誤った値が設定されている時点で
エラーを出し,処理を行わないという風にした方がよいのでしょうか。



勝手に変な解釈で処理を先に進めてしまうのはどうかと思います。
「入力した日付が正しくありません」等のメッセージを表示し再入力を促した方が良いのではないでしょうか

# こんなとき、Javaにretryがないのが悔やまれる
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2003-10-03 13:32
こんにちわ。お世話になっております。

引用:

roushiさんの書き込み (2003-10-03 07:28) より:

さらなる訂正処理・・・。
1.引数に誤った値が設定されることをふまえてプログラムを作成した方がよいのでしょうか。
2.また前述のように,引数に誤った値が設定されている時点で
エラーを出し,処理を行わないという風にした方がよいのでしょうか。

2の方が簡単な気がするのですが。
1.なら仕様次第ということになりそうですね。
誤った日付がきた場合は強制的に2ヶ月前の日付のMAX値に
日の部分だけ置き換える。みたいな・・・

経験がないのでどのような選択が一番最適なのかが
まだ掴みきれていない次第です(:_;)



誤った日付が入力されたときに、強制的に二ヶ月前の末日に訂正する
というのが、どういった場合に必要になるのかいまいち掴めないのですが…。
私も現在、日付チェックを必要とするシステムに携わっています。
#JavaではなくPHP+JavaScriptですが…

日付のチェックに関しては細かい要求はありませんでしたが
年、月、日の妥当性のチェックを行い、存在しない日付が入力された場合には
誤っている旨と箇所をエラーメッセージとして出力しています。
そして、誤って入力されているテキストボックスにフォーカスを移します。

うちではかずくんさんのおっしゃるように、エラーの表示をして
再入力を促すようにしています

#これが正解というわけではないですけどね。

[ メッセージ編集済み 編集者: ゆう 編集日時 2003-10-03 13:53 ]
roushi
常連さん
会議室デビュー日: 2003/07/18
投稿数: 28
投稿日時: 2003-10-07 00:06
ぽんさん、かずくん、ゆうさん返信ありがとうございます。
確かにWebアプリケーションならクランアント側で
JavaScriptなどを使って、再入力を促した方が良いですね

今回は仕様上そうもいかなかったので^_^;

ぽんさんへ
java.lang.Systemのgcメソッドを使用すると
ガベージコレクションを強制的に実行することができる。
Java仮想マシンが使用しないオブジェクトのリサイクルを実行する。
と書いてありました。

これは不要になったオブジェクトのメモリを解放して
再利用するといった解釈をしていたのですが違うのでしょうか・・・

ホームページを見てみると
どうやら強制的にガベージコレクションを実行したとしても
きちんとメモリを解放してくれるとは限らないというニュアンスで
かかれているような気がするのですが。

じゃあなぜjava.lang.Systemのgcメソッドが
あるんだろう・・・
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-10-07 09:20
引用:

roushiさんの書き込み (2003-10-07 00:06) より:

java.lang.Systemのgcメソッドを使用すると
ガベージコレクションを強制的に実行することができる。
Java仮想マシンが使用しないオブジェクトのリサイクルを実行する。
と書いてありました。

これは不要になったオブジェクトのメモリを解放して
再利用するといった解釈をしていたのですが違うのでしょうか・・・

ホームページを見てみると
どうやら強制的にガベージコレクションを実行したとしても
きちんとメモリを解放してくれるとは限らないというニュアンスで
かかれているような気がするのですが。

じゃあなぜjava.lang.Systemのgcメソッドが
あるんだろう・・・


http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6148&forum=12
http://www.netgene.co.jp/java/technicalTerms.html#GCSystemGc
上記のページを読んでみてください。
疑問が解決すると思います。

スキルアップ/キャリアアップ(JOB@IT)