PSP:Personal Software Process – Lesson2

Facebook にシェア
このエントリーをはてなブックマークに追加
[`livedoor` not found]
Delicious にシェア

前回に続いて、Lesson2を実施しました。
分析結果は特に載せていませんが、簡単なプログラムでもバグがあったり、結構時間を食ったりしました。
なお、PSPではコーディングに凝り過ぎる必要は無いと明記していますので、大まかな感じでOKです。
但し、コーディングフェーズを終了する際は要件が確実に含まれているか、コードエラーがないかなどのチェックを設けてる必要があります。

Lesson2: 「ソースファイルの行数、クラ数数、メソッド数をカウントする」
● プログラム仕様スクリプト
ASGKIT PROG2を参照のこと

● 実行結果

Part Name: Program3
Number of Items: 11
Part Size: 112
Total Size: 122

● ソースコード

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StreamTokenizer;
import java.util.ArrayList;

/**
 * PSP Lesson2: 
 * ソフトウェア開発プロセス特論 演習1 Date 2011/10/13 ソースファイルの行数、クラス数、メソッド数をカウントする
 */
public class Program2 extends StreamTokenizer {

	private Boolean wordBool = false;
	private String beforeWord = null;
	private String className = null;
	private int lineSize = 0;
	private int totalSize = 0;
	private int methodCnt = 0;
	ArrayList<String> classArray = new ArrayList<String>();
	ArrayList<String> methodArray = new ArrayList<String>();

	public Program2(Reader r) {
		super(r);

		this.eolIsSignificant(true); // 改行コードを検出する
		this.slashStarComments(true); // /* */ 型のコメント処理を有効にする
		this.slashSlashComments(true); // //型コメントの処理を有効にする
		this.wordChars('_', '_'); // 英数字の他に識別子に使える文字の定義
		this.parseNumbers(); // 数値リテラルを解析する

		classArray.add("class");
		classArray.add("interface");
		methodArray.add("void");
	}

	public static void main(String[] args) {

		Reader reader = null;

		try {
			reader = new BufferedReader(new FileReader(new File(args[0])));
			Program2 pg2 = new Program2(reader);
			pg2.checkCnt();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	void checkCnt() throws IOException {
		while (this.nextToken() != TT_EOF) {
			switch (this.ttype) {
			case TT_EOL: // 改行コードの検出
				if (this.wordBool == true) {
					this.lineSize++;
					this.wordBool = false;
				}
				this.beforeWord = "r";
				break;
			case TT_WORD: // 語の検出(キーワードを含む)
				this.wordBool = true;

				if (this.beforeWord != null) {
					// method件数をカウントする (コンストラクタは対応出来ていない)
					if (this.methodArray.contains(this.sval)
							|| this.beforeWord.equals("return")) {
						this.methodCnt++;
					}

					// class名を取得する, 複数class対応
					if (this.classArray.contains(this.beforeWord)) {
						this.className = this.sval;
						if (this.totalSize > 0) {
							this.print();
						}
						this.initialize();
					}
				}
				this.beforeWord = this.sval;

				break;
			default: // その他のトークン {}()[]+-=*/<>,;:
				this.wordBool = true;
				this.beforeWord = "symbol";
				break;
			}
		}

		// 最終行に改行が無いケースの対応
		if (this.beforeWord.equals("symbol")) {
			this.lineSize++;
		}

		this.totalSize += this.lineSize;

		this.print();
		System.out.println("Total Size: " + this.totalSize);

	}

	private void print() {

		System.out.println("Part Name: " + this.className);
		System.out.println("Number of Items: " + this.methodCnt);
		System.out.println("Part Size: " + this.lineSize);

	}

	private void initialize() {

		this.totalSize += this.lineSize;
		this.lineSize = 0;
		this.methodCnt = 0;

	}
}

コメントを残す

メールアドレスが公開されることはありません。