atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
とりあえず雑記帳(跡地)
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
とりあえず雑記帳(跡地)
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
とりあえず雑記帳(跡地)
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • とりあえず雑記帳(跡地)
  • とりあえずインターフェース入門
  • じゃあ何が問題?

とりあえず雑記帳(跡地)

じゃあ何が問題?

最終更新:2011年11月15日 23:17

fujiyan

- view
管理者のみ編集可

演算を追加してみる

先に作成したプログラムに、新しい演算「累乗」を追加してみましょう。

/*
 * オブジェクト指向でない版
 * 累乗を追加
 */
package jp.fujiyan.binaryoperation2;
 
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStreamReader;
 
/**
 * 二項演算です。
 * 
 * @author fujiyan
 */
public class BinaryOperation {
	// 入力値の最小
	private static final int MIN_VALUE = -99999;
	// 入力値の最大
	private static final int MAX_VALUE = 99999;
 
	// 選択肢
	private static final int FINISH = 0;
	private static final int ADDITION = 1;
	private static final int SUBTRACTION = 2;
	private static final int MULTIPLICATION = 3;
	private static final int DIVISION = 4;
	private static final int POWER = 5;//$$$$$修正$$$$$
 
	/**
	 * ユーザ入力を返します。
	 * 
	 * @param prompt プロンプト文
	 * @return ユーザ入力文字列
	 */
	private static String input(String prompt) throws IOException {
		System.out.println(prompt);
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String str = in.readLine();
		if (str == null) {
			// Ctrl+Zによる中断
			throw new EOFException("中断されました。");
		}
		return str;
	}
 
	/**
	 * 整数値を問い合わせます。
	 * 
	 * @return 整数値
	 */
	private static int askValue(int seq) throws IOException {
		int value = 0;
		boolean invalid = true;
		while (invalid) {
			// 整数値が入力されるまで
			String ret = input(String.valueOf(seq) + "番目の数値を入力してください(" + MIN_VALUE + "~" + MAX_VALUE + "の整数)。");
			try {
				value = Integer.parseInt(ret);
			} catch (NumberFormatException e) {
				// 整数値として有効でない文字列
				System.out.println("入力された値は整数値ではありません。");
				continue;
			}
 
			invalid = (value < MIN_VALUE) || (value > MAX_VALUE);
			if (invalid) {
				// 無効な入力
				System.out.println("入力された数値が範囲を超えています。");
			}
		}
 
		return value;
	}
 
	/**
	 * 操作を問い合わせます。
	 * 
	 * @return 操作の選択肢
	 */
	private static int askOperation() throws IOException {
		String prompt = "操作を番号で選択してください。(" +
			FINISH + ":終了 " +
			ADDITION + ":加算 " +
			SUBTRACTION + ":減算 " +
			MULTIPLICATION + ":乗算 " +
			DIVISION + ":除算 " +
			POWER + ":累乗" +//$$$$$修正$$$$$
		")";
 
		int operation = 0;
		boolean invalid = true;
		while (invalid) {
			// 有効な選択肢が入力されるまで
			String ret = input(prompt);
 
			try {
				operation = Integer.parseInt(ret);
				invalid = (operation < 0) || (operation > POWER);//$$$$$修正$$$$$
			} catch (NumberFormatException e) {
				// 数値として有効でない文字列
			}
 
			if (invalid) {
				// 無効な入力
				System.out.println("正しい番号を選択してください。");
			}
		}
 
		return operation;
	}
 
	/**
	 * 演算を行います。
	 * 
	 * @param operation 操作の選択肢
	 * @param value1 値1
	 * @param value2 値2
	 */
	private static void execute(int operation, int value1, int value2) {
		String expression = null;
		String result = null;
 
		switch (operation) {
		case ADDITION:
			// 加算
			expression =  String.valueOf(value1) + " + " + String.valueOf(value2);
			result = String.valueOf(value1 + value2);
			break;
 
		case SUBTRACTION:
			// 減算
			expression = String.valueOf(value1) + " - " + String.valueOf(value2);
			result = String.valueOf(value1 - value2);
			break;
 
		case MULTIPLICATION:
			// 乗算
			expression = String.valueOf(value1) + " × " + String.valueOf(value2);
			result = String.valueOf((long) value1 * value2);
			break;
 
		case DIVISION:
			// 除算
			if (value2 == 0) {
				// 0除算
				System.out.println("0で割ることはできません。");
				return;
			}
			expression = String.valueOf(value1) + " ÷ " + String.valueOf(value2);
			result = String.valueOf(value1 / value2) + "(余り " + String.valueOf(value1 % value2) + ")";
			break;
 
		case POWER://$$$$$修正$$$$$
			// 累乗
			expression = String.valueOf(value1) + " ^ " + String.valueOf(value2);
			result = String.valueOf((long) Math.pow(value1, value2));
			break;
		}
 
		System.out.println(expression + " の答えは " + result + " です。");
	}
 
	/**
	 * メインメソッドです。
	 * 
	 * @param args コマンドライン引数
	 */
	public static void main(String[] args) {
		try {
			int operation = askOperation();
			while (operation != FINISH) {
				// "終了"が選択されるまで
				int val1 = askValue(1);
				int val2 = askValue(2);
 
				execute(operation, val1, val2);
 
				operation = askOperation();
			}
			System.out.println("終了します。");
		} catch (EOFException e) {
			// Ctrl+Zによる中断
			System.err.println(e.getMessage());
		} catch (Exception e) {
			// その他例外
			System.err.println("なんかまずいことが発生しました。");
			e.printStackTrace();
		}
	}
}
 
 

累乗を追加するに当たり、4箇所のプログラム修正を行っています。
この「プログラム修正」に問題が出てきます。

問題1、プログラム全体の解析が必要

そもそも、どこを修正すればいいか、プログラム全体を把握する必要があります。
特に、askOperation()メソッド内の、
invalid = (operation < 0) || (operation > POWER);//$$$$$修正$$$$$
 

の部分とか、本当に見落とします。実際、このサンプル作る際に見落としました(汗

今回みたいな単純なプログラムなら未だしも、
規模が大きくなるにつれ大変な作業になります。ましてや、自分が作ったわけではなく、他人が作ったプログラムになると…。

問題2、修正によって、動作実績のある既存の部分が動かなくなってしまう可能性がある

特にexecute()メソッドの修正ですが、既に存在する演算を実施する部分に手を加えています。
うまく修正できればイイですが、そこは人間、間違いもあります。特に、先にあげたプログラム全体の把握が出来ていないと、
問題ないと思っていた修正が、思わぬところに影響を及ぼすことも多々あります。

追加機能でバグがでるのはまだ許されますが、既に動いていた部分まで動かなくなるのは、
既存ユーザーからお叱りを受けます。

次→じゃあオブジェクト指向ならどうする?
「じゃあ何が問題?」をウィキ内検索
LINE
シェア
Tweet
とりあえず雑記帳(跡地)
記事メニュー

メニュー

  • トップページ
  • コメント
  • とりあえずインターフェース入門
  • Yesod
  • Haskell
  • Slim3
  • JavaScript
  • Google App Engine
  • Android
  • Facebook
  • GWT
  • OpenSocial
  • Struts 2
  • Subversion
  • Apache
  • JSONIC
  • Flex

  • WebコミックLibraryについて

公式サイト

  • Yesod
  • Haskell
  • Slim3
  • JavaScript - MDN
  • App Engine for Java
  • Android Developers
  • Google Web Toolkit
  • Struts
  • OpenSocial
  • OSDE

  • ToDo

ここを編集
記事メニュー2
間違いの御指摘は
コメントまでm(_ _)m

更新履歴

取得中です。


ここを編集

総数: -
本日: -
昨日: -
人気記事ランキング
  1. Struts 2
もっと見る
最近更新されたページ
  • 4407日前

    Haskell
  • 4407日前

    Yesod
  • 4407日前

    トップページ
  • 4517日前

    メニュー
  • 4518日前

    Struts 2
  • 4544日前

    コメント
  • 4713日前

    Google App Engine
  • 4750日前

    Slim3/環境構築とプロジェクト作成
  • 4775日前

    Google App Engine/キャッシュの計画
  • 4785日前

    Slim3/文字列の部分一致検索とページング
もっと見る
人気記事ランキング
  1. Struts 2
もっと見る
最近更新されたページ
  • 4407日前

    Haskell
  • 4407日前

    Yesod
  • 4407日前

    トップページ
  • 4517日前

    メニュー
  • 4518日前

    Struts 2
  • 4544日前

    コメント
  • 4713日前

    Google App Engine
  • 4750日前

    Slim3/環境構築とプロジェクト作成
  • 4775日前

    Google App Engine/キャッシュの計画
  • 4785日前

    Slim3/文字列の部分一致検索とページング
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  2. MadTown GTA (Beta) まとめウィキ
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. ソードランページ @ 非公式wiki
  6. AviUtl2のWiki
  7. Dark War Survival攻略
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. ありふれた職業で世界最強 リベリオンソウル @ ウィキ
  10. 星飼いの詩@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 鹿乃つの氏 周辺注意喚起@ウィキ
  5. 初音ミク Wiki
  6. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 発車メロディーwiki
  8. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  9. 検索してはいけない言葉 @ ウィキ
  10. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. アフロディテ - オレカバトル アプリ版 @ ウィキ
  3. 機体一覧 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  4. Trickster - ストグラ まとめ @ウィキ
  5. ギャング - ストグラ まとめ @ウィキ
  6. 暦家 - ストグラ まとめ @ウィキ
  7. shade - 初音ミク Wiki
  8. グランツーリスモ7/収録車種 - グランツーリスモWiki
  9. ロスサントス救急救命隊 - ストグラ まとめ @ウィキ
  10. MOZU - ストグラ まとめ @ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.