広告
  サイト内検索:
<Let's create a game!> Introduction of programming for absolute beginners English
 

SESSION 11 その29
メンバ変数(フィールド) つづき

冗談だってばー。
テスト用に新しいプロジェクトを
1つ作ってくれ。

ちょっとテストするだけだから
プロジェクト名は何でもいいよ。
主クラス名もMainのままでいいよ。

そこに、
引数を使って作った関数
checkAnswerData

2つの処理モード関数
execModeQuiz
execModeCheck
をコピーして貼り付けてみよう。

メイン関数の下辺りに
貼り付けてね。
 
はい。

新しいプロジェクトに
関数を持っていくんだ。


コピーして・・・・
貼り付け
っと。

うーん、
エラーになっちゃうと
思うけど・・・。
  いじわる
なんだから。
 
 

テスト用プロジェクトのMain.java
 
・・・      
      public static void main(String[] args) {
        // TODO code application logic here  
       
        }  
       
       /**  
         * 解答チェック処理  
         * @param seikaiBangou 正解の番号  
         * @param kaitouBangou 入力番号  
         * @param seikaiGoukei 正解数  
         * @return seikaiGoukei 正解数  
        */  
        private static int checkAnswerData(int seikaiBangou,int kaitouBangou,int seikaiGoukei){  
       
            //解答チェック  
            if(kaitouBangou == seikaiBangou){  
                System.out.println("やったね!正解");  
                seikaiGoukei += 1;//正解数加算  
            }else{  
                System.out.println("残念!不正解");  
            }  
       
            //結果を返す  
            return seikaiGoukei;  
        }  
       
        /**  
        * 問題処理モード処理  
        */  
        private static void execModeQuiz(){  
       
            //見出し:現在の状況を表示する  
            System.out.println("***************** ことくいず *****************");  
            System.out.println("         現在、"+ (nowQuizNum + 1) +"問目です。");  
            System.out.println("        現在の正解数は"+ correctTotal +"です。");  
            System.out.println("***********************************************");  
            System.out.println("");  
            System.out.println("< 問題です >");  
       
            //問題を表示する  
            switch(nowQuizNum){  
                case 0:  
                    System.out.println("変数の型でint型の最大値はいくつ?");  
                    System.out.println("");  
                    System.out.println("-----------------------------------------------");  
                    System.out.println("1:256 2:98776342 3:2147483647");  
       
                    break;  
                case 1:  
                    System.out.println("変数の型を変換するのに使う方法はどれ?");  
                    System.out.println("");  
                    System.out.println("-----------------------------------------------");  
                    System.out.println("1:キャスト 2:スコープ 3:インクリメント");  
       
                    break;  
                case 2:  
                    System.out.println("変数aが「4以上でかつ10以下」か「40未満」");  
                    System.out.println("正しい条件式はどれ?");  
                    System.out.println("");  
                    System.out.println("-----------------------------------------------");  
                    System.out.println("1:(a >= 4 || a < 10) && a < 40");  
                    System.out.println("2:(a >= 4 || a <= 10) || a < 40");  
                    System.out.println("3:(a >= 4 && a <= 10) || a < 40");  
       
                    break;  
            }  
            System.out.print("答え>");  
       
            //解答チェックモードへ変更  
            execMode = EXEC_MODE_CHECK;  
        }  
       
         /**  
         * 解答処理モード処理  
         */  
        private static void execModeCheck(){  
       
            //解答をチェックする  
            switch(nowQuizNum){  
                case 0:  
                    //正解番号チェック  
                    correctTotal = checkAnswerData(3,inputNum,correctTotal);  
       
                    break;  
                case 1:  
                    //正解番号チェック  
                    correctTotal = checkAnswerData(1,inputNum,correctTotal);  
       
                    break;  
                case 2:  
                    //正解番号チェック  
                    correctTotal = checkAnswerData(3,inputNum,correctTotal);  
       
                    break;  
             }  
            System.out.println("");  
            System.out.println("-----------------------------------------------");  
            System.out.print("< 1を入力してEnterキーを押してください >");  
       
            //問題を進める  
            nowQuizNum += 1;  
       
            //最大数以上なら  
            if(nowQuizNum >= QUIZ_MAX){  
                loopFlg = false;//ゲームを終了する  
            }  
       
            //問題処理モードへ変更  
            execMode = EXEC_MODE_QUIZ;  
        }  
       
    }  
・・・    
新しいプロジェクトを作り、そのMain.javaに以下の3つの関数をコピーして下さい。

貼り付ける関数:checkAnswerData、execModeQuiz、execModeCheck
(緑色の部分のように貼り付けて下さい。)

テストが終わったら新しく作ったプロジェクトを削除するか閉じて下さい。
IDEのメインプロジェクトの指定も元に戻しておいてください。


あちゃあー。やっぱり
エラーだらけだよー。

あれ!?

関数 checkAnswerData
はエラーが出て無いね!
そう。その関数は、
値を受け取るのに
引数を使ってる
からだ。


引数は、
関数自身の中に変数を置いて、
必要な値をコピーして受け取る
仕組みだからね。

メンバ変数を使ってないから
クラスに影響されない。
単独で動かせるんだ。

他の関数は
値を受け取るのに「外」にある
メンバ変数が必要で動かない。
あれれー
別の場所に
行っちゃったから
メンバがいないのね。
 
引数、戻り値とメンバ変数の違いの検証コード(疎結合と密結合)
エディタウィンドウ

  疎結合(そけつごう)と密結合(みつけつごう)

引数を使った関数のように
他との結びつきが弱い
独立した構造を
「疎結合(そけつごう)」
って
いうんだ。

引数を使って、
うまく「疎結合」で作れば、
簡単に他のプログラムに移植
したり、ライブラリーにして
使いまわしたりしやすいんだよ。
疎遠の
「そ」ね。
うーん

疎結合と
密結合・・・。

分かったような
無いような。

難しい。。。
そうなんだ。
引数も必要なんだね。

メンバ変数と引数、
それぞれに使う場所が
あるんだね。
 
 
疎結合(そけつごう) 他と結びつきが弱い構造。
独立性が強い。


プログラム、コンポーネント同士の
の結びつきが弱い状態。
密結合(みつけつごう) 他と結びつきが強く依存する構造。
独立性が弱い。

プログラム、コンポーネント同士が
密接に結合していて分離すると
動かない状態。
 
 
疎結合と密結合のイメージ(関数移動前)
 
疎結合と密結合のイメージ(関数移動後) 


 
ぽんちょに
いじわる
しないで!


 
でも、ぽんちょ
たくさんいるね?

ねえねえ!
兄弟なの!?

     


引数とメンバ変数の使い分け方(最初)



引数
別のプログラムでも流用できそうな関数の場合
(例えば、キー入力処理のような、いろいろなゲームで使える関数)
 
メンバ変数
・たくさんの関数で使う変数の場合
(例えば、どの処理モードでも使う共通変数)

・値を保持しておきたい変数の場合
最初以外初期化されないので値を引き継げる。
例えば、勇者の生命力のようなゲーム中ずっと使う値。)
 
2つを組み合わせて使う場合もある
 
そうそう。

頭を、
ぼい・・・
うわー、
本当に頭
お餅みたいに
柔らかくしないとー
まずは、こんなイメージで
引数とメンバ変数の
使い分けを考えてくれ。


これからクラスを学習して
数こなせばいろいろ分かってくから
まあ、今は気楽に考えてね。

「あー、そうなんだ。」でいいよ。
 
うーん、なんとなくしか
分からないけど・・・。

やっぱり、その時々で
柔軟に考えるんだね。
 


なんにも
言ってません。

言ってないから!
あたし、
何も言って
ないんだけど!


 
 

広告
home もくじ 前のページを読む 次のページを読む
  サイト内検索:
広告
お勧めの姉妹サイト
leafdays - リーフデイズ 超初心者のための園芸入門 - 楽しい趣味のガーデニング -
広告