countdownプログラムを作ってみよう3

   2012/05/05

まいど、管理人イガジーです。
プログラムを作っていく方法(開発手法)には、
(a)作る前に仕様を決めて、その通りに作っていく方法(ウォーターフォール)

(b)中核部分から作り、改良・機能追加・仕様変更してゆく方法(スパイラル)
の2通りがあります。

ソフトを請け負って開発する様な場合は、通常(a)のウォータフォールです。
そうしないと、何をもって開発完了なのかがあいまいになり、
ずるずると開発期間が伸びてしまうからです。

個人での(趣味)プログラミングは、(b)のスパイラルになる事が多いです。
作ってみると最初に考えた形では使い勝手が悪いとなると、改良しますし
使ってみるとこんな機能も欲しい、と欲が出てきます。

良い物になってゆく可能性はありますが、欠点としてはプログラム(コード)が
継ぎ足し、つぎはぎで汚く(分かりにくく)なったり、仕様の矛盾が起きたりします(※)。
しかし、管理人イガジーとしては、(b)を勧めます。途中で力尽きても、その時点で
動くものはできていますから。
(※もちろん(a)の手法でも、設計時には気づかなかった仕様矛盾が起きる可能性はあります)

さて、昨日の続きです。
カウトダウンプログラムの見栄えを良くした例を示しましょう。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Label;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class CountDown {
	final long MS2HOUR=1000*60*60;
	Calendar c,d;

	CountDown() { // constructor
		Frame f=new Frame();
		f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev) {
                System.exit(0);
            }
        });
		f.setSize(300,200);
		f.setTitle("CountDown");

		Font f1=new Font("SansSerif",Font.PLAIN,20);
		c=new GregorianCalendar();
		int cyy=c.get(Calendar.YEAR);
		int cmm =c.get(Calendar.MONTH);
		int cdd =c.get(Calendar.DAY_OF_MONTH);
		long ms=c.getTimeInMillis();
		String td=String.format("今日は %d年 %d月 %d日", cyy,cmm+1,cdd);
		Label today=new Label(td);

		today.setFont(f1);
		today.setAlignment(Label.CENTER);
		f.add(today, BorderLayout.SOUTH);

		Label target=new Label("今年は");
		target.setFont(f1);
		target.setAlignment(Label.CENTER);
		f.add(target, BorderLayout.NORTH);
		Label ll=new Label("あと");
		ll.setFont(f1);
		f.add(ll, BorderLayout.WEST);
		f.add(target, BorderLayout.NORTH);
		Label rr=new Label("日");
		rr.setFont(f1);
		f.add(rr, BorderLayout.EAST);

		d=new GregorianCalendar(cyy+1,0,1);
		long mst=d.getTimeInMillis()-ms;
		int hh=(int)(mst/MS2HOUR);
		int dd=hh/24;
		String rd=Integer.toString(dd);
		Label rest=new Label(rd);
		rest.setBackground(Color.YELLOW);
		rest.setFont(new Font("SansSerif",Font.PLAIN,72));
		rest.setAlignment(Label.CENTER);

		f.add(rest, BorderLayout.CENTER);
		f.setVisible(true);
	}

	public static void main(String[] args) {
		new CountDown();
	}
}

BorderLayout(辺配置)を使って、左辺(WEST)に「あと」
右辺(EAST)に「日」と表示しています。
日数は中央(CENTER)で背景(Background)を黄色(YELLOW)にしています。

一応これで、1年の残り日数を表示することはできるのですが
・月の残り日数も表示したい
とか
・指定の日にちまでの日数も表示したい
という欲が出てきます。

では、どうやってその指定をするか?
という仕様を決める必要が出ています。

(1)「設定」ボタンを置いて、クリックされたら設定画面(ダイヤログ)を出す
とか
(2)リストから選べるようにする
とか
(3)プログラム起動時に引数(アーギュメント)で指定する
など、色々な方法が考えられます。

作りやすさと使いやすさを考えて(好みもありますが)
(3)の引数で処理することにしましょう。

引数とは、起動の時にプログラム名の後ろにつけるパラメータです。
例えば、このプログラムをjarにして、countdown.jar という名称にした場合
$ java -jar countdown.jar -mとか
$ java -jar countdown.jar 20120123などと、”-m” や “20120123” をつけて起動すると
main(String [] args) において
args[0]が”-m” や “20120123” になるのです。

これを処理する例は、また明日。

countdownプログラムを作ってみよう1
countdownプログラムを作ってみよう2
countdownプログラムを作ってみよう3(この記事)
countdownプログラムを作ってみよう4
countdownプログラムを作ってみよう5
countdownプログラムを作ってみよう6

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)