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

SESSION 11 その14
関数(メソッド) つづき
  コードの解説

追加したコードを
上から順番に見ていこう。

解説図も一緒に見てね。
説明は、いきなり
2回目のループの
解答処理モードから
始まってる
んだね。
今回は、
正解処理の
関数化の
部分のみ見るよ。
他は
変わってない
からね。
 
 
今回のコードのポイント
 
・正解処理関数の呼出
・正解処理関数の定義
 
コードの解説図(画像をクリックで拡大表示します)
クイズゲーム 完成(正解処理関数化)解説図


今回のコードは、クイズが
正解だった場合の処理を
分離して関数化したものだ。


たった数行の処理ね。
関数を使えば
何回もswitch文の中で
書いてたのが
1箇所にできるんだね。

これで処理を変更・追加
する場合も1箇所で済むんだ。
 
すっきり
するね!
 

クイズゲーム完成 正解処理関数化
(KotoQuizTestのKNMain.java)179行目~
 
・・・      
179       //関数:正解処理関数  
180       private static int printCorrect(int seikaiGoukei){  
181      
182           System.out.println("やったね!正解");  
183           seikaiGoukei += 1;//正解数加算  
184      
185           //結果を返す  
186           return seikaiGoukei;  
187       }  
・・・    
 

  正解処理関数の呼出

 
まず、メイン関数から
作った関数 printCorrectを
呼び出してるよ。


引数にはcorrectTotalを
指定して、現在の正解数を
コピーして渡してる。
 
switch文の中の
正解処理を
全部、関数を呼び出す
ように変更したんだ。
  関数の
呼出が3つに
なったんだ。
 
 

クイズゲーム完成 正解処理関数化
(KotoQuizTestのKNMain.java)93行目~
 
・・・      
093                   //解答をチェックする  
094                   switch(nowQuizNum){  
095                       case 0:  
096                           //正解番号チェック  
097                           if(inputNum == 3){  
098                               correctTotal = printCorrect(correctTotal);//正解処理  
099                           }else{  
100                               System.out.println("残念!不正解");  
101                           }  
102      
103                           break;  
104                       case 1:  
105                           //正解番号チェック  
106                           if(inputNum == 1){  
107                               correctTotal = printCorrect(correctTotal);//正解処理  
108                           }else{  
109                               System.out.println("残念!不正解");  
110                           }  
111      
112                           break;  
113                       case 2:  
114                           //正解番号チェック  
115                           if(inputNum == 3){  
116                               correctTotal = printCorrect(correctTotal);//正解処理  
117                           }else{  
118                               System.out.println("残念!不正解");  
119                           }  
120      
121                           break;  
122                   }  
・・・    
解説図 番号1を参照して下さい


呼び出した時点で、処理が
正解処理関数側に移る。


呼び出し側は
呼び出した場所で待機して
関数の処理が
終わるのを待つよ。
ここで待って・・・
戻ってくる値を受け取るんだ。

関数の前に
変数 correctTotalを書いて
正解が加算された戻り値を
受け取ってるんだね。
値を受け取って
おしまい。
 
 

クイズゲーム完成 正解処理関数化
(KotoQuizTestのKNMain.java)98行目~
 
・・・      
098              correctTotal = printCorrect(correctTotal);//正解処理  
・・・    
戻り値を受け取っている
 
解説図 番号1を参照して下さい

  正解処理関数の定義

次に関数の定義を
見てみよう。


戻り値には
int型を指定してる。

戻り値で
正解数のカウントを
加算した後の値を
戻してやるからね。
引数には
正解数の加算前の値
受け取ってるんだよね。

引数の名前は
日本語ローマ字なんだね。
 
あたし
こっちの方が
分かりやすい!
 

クイズゲーム完成 正解処理関数化
(KotoQuizTestのKNMain.java)179行目~
 
・・・      
179       //関数:正解処理関数  
180       private static int printCorrect(int seikaiGoukei){  
181      
182           System.out.println("やったね!正解");  
183           seikaiGoukei += 1;//正解数加算  
184      
185           //結果を返す  
186           return seikaiGoukei;  
187       }  
・・・    
解説図 番号2を参照して下さい



たった
数行だけどね。
正解処理関数の内容は
元のコードと同じ。


正解メッセージの表示と
正解数の加算処理ね。
 
メイン関数では
correctTotalだったのを
引数seikaiGoukeiに
変えたんだね。

違う名前の変数に
値を渡すんだ。
  うーん

同じ値だよね・・・
 
 

 
<元のコード>
クイズゲーム 完成(モード別処理)
(KotoQuizTestのKQMain.java)102行目~
・・・      
102                               System.out.println("やったね!正解");  
103                               correctTotal += 1;//正解数加算  
・・・    
 
 
<現在のコード>
クイズゲーム完成 正解処理関数化
(KotoQuizTestのKNMain.java)179行目~
・・・      
179       //関数:正解処理関数  
180       private static int printCorrect(int seikaiGoukei){  
181      
182           System.out.println("やったね!正解");  
183           seikaiGoukei += 1;//正解数加算  
184      
185           //結果を返す  
186           return seikaiGoukei;  
・・・    
 
処理の内容は同じ。
元のコードの変数名を関数の引数名に変更した。


なんで?
あれ?
何でseikaiGoukeiに変えたの?

関数が違うから同じ名前の変数
作れるよね?

引数名をcorrectTotalにすれば・・・

printCorrect関数にもメイン関数と
全く同じ名前の変数ができるから
コードをコピーして貼り付けても
書き換えないで済んだよ。

戻り値も全部統一できるよ。

引数は、呼び出し元の変数と
同じ名前の方が良かった
んじゃないのかな?
 
 

呼出元関数の変数名と引数名を同じにした例

 
呼出側の関数内
・・・      
098                               correctTotal = printCorrect(correctTotal);//正解処理  
・・・    
 
 
定義側の関数内
・・・      
179       //関数:正解処理関数  
180       private static int printCorrect(int correctTotal){  
181      
182           System.out.println("やったね!正解");  
183           correctTotal += 1;//正解数加算  
184      
185           //結果を返す  
186           return correctTotal;  
187       }  
・・・    
 
関数が違うので同じ名前の引数を作ることができる。

メイン関数側の変数名と引数名を同じにした場合は
移植するコードの変更をしないで済む。
 
そうだね。
同じ名前にもできるよ。

でも、セッションでは
基本的に変えるよ。


・説明が紛らわしくなる。
・関数の分離性の点から。
 (関数はメイン関数以外にも
 いろいろなコードから
 呼ばれる可能性がある。)
etc・・・

今回は、関数の引数には
関数と元のコードを区別する意味で
日本語ローマ字を使ったよ。
  説明したくないとこ
よく気付くなあ。

ここら辺は
分かりやすさと
作りやすさで
柔軟にいこう。

今は軽く流して。。。
 


  うーん
今回は
作ってある処理を
関数に切り出してる
からね。

これからは最初から
関数で作るから
気にならなくなると
思うけど。
クラスもやるし。

最初だけじゃね?
そうなんだ。

全くわかんない
けど。

     

で、最後。

加算した正解数の値を
return文で
呼び出し元に戻して
関数終了。
戻してあげるように
作らないと、
正解数の値は
ここで消えちゃうんだね。
加算した結果を
返してあげような。
関数も
対話に
なってるね。
 

クイズゲーム完成 正解処理関数化
(KotoQuizTestのKNMain.java)179行目~
 
・・・      
179       //関数:正解処理関数  
180       private static int printCorrect(int seikaiGoukei){  
181      
182           System.out.println("やったね!正解");  
183           seikaiGoukei += 1;//正解数加算  
184      
185           //結果を返す  
186           return seikaiGoukei;  
187       }  
・・・    
 

     

今回はたった数行の処理を
整理しただけだけどね。

処理が大きくなればなるほど
関数にした時、差が出るよ。

関数の流れはなんとなく
見えたんじゃない?

はいっ、分かりました!

なんとなく
見えた気がする。
今は
なんとなく
でいいよ。

繰り返し
やるからね。
復習するね!

 
 

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