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

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

では試してみましょう

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

fujiyan

- view
管理者のみ編集可

演算を追加してみるパート2

それでは同様に、新しい演算「累乗」を追加してみましょう。

累乗
package jp.fujiyan.binaryoperation3.operator;
 
import jp.fujiyan.binaryoperation3.IBinaryOperator;
 
/**
 * 累乗です。
 * 
 * @author Fujiyan
 */
public class Power implements IBinaryOperator {
	private String expression;
	private String result;
 
	public String getChoiseString() {
		return "累乗";
	}
 
	public void calculate(int value1, int value2) {
		expression = String.valueOf(value1) + " ^ " + String.valueOf(value2);
		result = String.valueOf((long) Math.pow(value1, value2));
	}
 
	public boolean isError() {
		// エラーが発生することは無いので、常にfalse
		return false;
	}
 
	public String getErrorMessage() {
		// エラーが発生することは無いので、常にnull
		return null;
	}
 
	public String getExpression() {
		return expression;
	}
 
	public String getResult() {
		return result;
	}
}
 

演算を追加したことによる修正
/*
 * オブジェクト指向版
 */
package jp.fujiyan.binaryoperation3;
 
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
 
import jp.fujiyan.binaryoperation3.operator.Addition;
import jp.fujiyan.binaryoperation3.operator.Division;
import jp.fujiyan.binaryoperation3.operator.Multiplication;
import jp.fujiyan.binaryoperation3.operator.Power;//$$$$$修正$$$$$
import jp.fujiyan.binaryoperation3.operator.Subtraction;
 
/**
 * 二項演算です。
 * 
 * @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 List<IBinaryOperator> operatorList = new ArrayList<IBinaryOperator>();
    static {
        // operatorListの初期化
        operatorList.add(new Addition());
        operatorList.add(new Subtraction());
        operatorList.add(new Multiplication());
        operatorList.add(new Division());
        operatorList.add(new Power());//$$$$$修正$$$$$
    }
 
    /**
     * ユーザ入力を返します。
     * 
     * @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 {
        StringBuilder sb = new StringBuilder();
        int i = 0;
        sb.append(i).append(":").append("終了");
        while (i < operatorList.size()) {
            sb.append(" ");
            sb.append(i + 1).append(":").append(operatorList.get(i).getChoiseString());
            i++;
        }
        String prompt = "操作を番号で選択してください。(" + new String(sb) + ")";
 
        int operation = 0;
        boolean invalid = true;
        while (invalid) {
            // 有効な選択肢が入力されるまで
            String ret = input(prompt);
 
            try {
                operation = Integer.parseInt(ret);
                invalid = (operation < 0) || (operation > operatorList.size());
            } 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) {
        IBinaryOperator op = operatorList.get(operation - 1);
        op.calculate(value1, value2);
 
        if (op.isError()) {
            // エラーあり
            System.out.println(op.getErrorMessage());
            return;
        }
 
        System.out.println(op.getExpression() + " の答えは " + op.getResult() + " です。");
    }
 
    /**
     * メインメソッドです。
     * 
     * @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();
        }
    }
}
 

修正箇所が、格段に減りました。package宣言を除けば1箇所です。

オブジェクト指向でない版では、演算毎に実装が異なる処理がプログラム全体に散らばっていましたが、
インターフェースとしてそれを抽出し、分離することによって、プログラマが追加の際に実装すべきポイントが集約されたためです。

プログラマはインターフェースの実装に注力するだけでよく、そのインターフェースを利用する部分について把握する必要がなくなりました。
そして同時に、追加部分以外の修正を行わないことは、既存の機能に影響を与えることも無いのです。

次→ようやくクラス継承の登場
「では試してみましょう」をウィキ内検索
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. ドンキーコング バナンザ - アニヲタWiki(仮)
  4. 機体一覧 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. 危険度7 - 検索してはいけない言葉 @ ウィキ
  6. キングクルール - アニヲタWiki(仮)
  7. ひの らん/エピソード6 - ストグラ まとめ @ウィキ
  8. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  9. 生きたメキシコ - 検索してはいけない言葉 @ ウィキ
  10. コメント/雑談・質問 - マージマンション@wiki
もっと見る

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

2019 AtWiki, Inc.