魁!dcWORKS塾 〜エンジニア編 vol.8〜
こんにちは! dcWORKSでエンジニアをしているミネです。
弊社のエンジニアチームやデザインチームの実態をより詳しく知ってもらうべく始まった「魁!dcWORKS塾」エンジニア編 第8回をお届けしていきます!
魁!dcWORKS塾とは?
技術研修や勉強会など、それぞれで実際に取り組んでいるような内容を問題・課題の形式でご紹介します。
エンジニアの問題では解答や解決するためのポイントを、またデザインチームでは制作過程など、各チームの取り組みを具体的に紹介していきますのでお楽しみに!
BLOGを見てくださっているみなさんも一緒に楽しみながら取り組んでいただけると嬉しいです。
エンジニア編 第8回ということで、弊社が運営しているプログラミングスクールのEngineersGateでも講師を務めるサトウ先生からの出題です。
- エンジニア編 第1回 (配列の作成についての問題)はこちら
- エンジニア編 第2回 (関数の作成についての問題)はこちら
- エンジニア編 第3回 (インスタンスメソッド作成についての問題)はこちら
- エンジニア編 第4回 (インターフェースについての問題)はこちら
- エンジニア編 第5回 (継承についての問題)はこちら
- エンジニア編 第6回 (オブジェクト指向についての問題)はこちら
- エンジニア編 第7回 (連想配列についての問題)はこちら
エンジニアズゲート講師。みんなから愛されるキャラクターとボディーの持ち主。
今回はコールバックに関する問題を出題します。
まずは「コールバック」について説明します。
プログラム内で特定のイベントが発生した際に、あらかじめ指定されたコード(関数やメソッド)を実行する仕組みです。一般的に、関数やメソッドを引数として他の関数やメソッドに渡し、特定の条件が満たされた時点でその引数として渡された関数やメソッドが実行されることを指します。
◎主な用途
コールバックは非同期処理やイベントハンドリングに用いられます。
例えば、ボタンがクリックされた時に特定の処理を実行する場合、その処理をコールバックとしてボタンのクリックイベントに紐づけます。
これにより、ボタンがクリックされた時に事前に登録した処理が実行される仕組みになります。
コールバックの実装には、インターフェースが利用されます。
インターフェースは、実際の処理を持たず、メソッドの宣言だけを提供します。
これにより、コールバックを実現するためのフレームワークを作ることができます。
◎具体例
具体的には、コールバックの場面では、特定のイベントや条件が満たされた時に呼び出されるメソッドが必要です。
このメソッドを含んだインターフェースを定義し、コールバックが必要な箇所でこのインターフェースを使用します。
例えば、ボタンがクリックされた時に特定の処理を行いたい場合、その処理を含んだメソッドを持つインターフェースを作成します。
次に、ボタンのクリックイベントを監視する部分で、このインターフェースを実装したクラスを作成し、ボタンのクリックがあった時にインターフェースのメソッドが呼び出されるように設定します。
このようにすることで、特定のイベントが発生した時に実行される処理を簡単に定義できるようになります。
つまり、コールバックを実現するために、インターフェースはコードの流れを定義し、そのインターフェースを実装したクラスが実際の処理内容を提供します。
これにより、異なる処理を同じインターフェースを介して扱うことができ、柔軟性や再利用性が高まります。
問題
コールバックに関する下記課題を実装してください。
package lesson_06.works_01;
/**
* ■課題
* 下記コードは、int配列を引数として渡し、配列要素の値をそれぞれ2倍にする関数processArrayを使った実装です
* また、すべてのint配列の要素が2倍になった時点で、CallbackインターフェースのonCompleteメソッドで
* 2倍となった結果が通知(コールバック)されます。
*
* Callbackインターフェースに、下記コールバックメソッドを追加し、processArrayメソッド内に追加してください。
* ・beforeElementメソッド・・・繰り返し処理前(2倍にする前)の1要素を通知する。
* ・afterElementメソッド・・・繰り返し処理後(2倍にした後)の1要素を通知する。
*
* @author tomo-sato
*/
public class Main {
public static void main(String[] args) {
Callback callback = new Callback() {
@Override
public void onComplete(int[] iArray) {
for (int i : iArray) {
System.out.println("処理結果:" + i);
}
}
};
int[] iArray = new int[] {1, 2, 3, 4};
processArray(iArray, callback);
}
/**
* 引数iArrayの、各要素を2倍にする。
* 2倍にした結果をCallbackインターフェースのonCompleteメソッドで通知する。
*
* @param iArray 処理対象の配列。
* @param callback 処理結果を通知するコールバック。
*/
public static void processArray(int[] iArray, Callback callback) {
int[] processedArray = new int[iArray.length];
for (int i = 0; i < iArray.length; i++) {
processedArray[i] = iArray[i] * 2;
}
// onCompleteメソッドで通知。
callback.onComplete(processedArray);
}
}
/**
* コールバックインターフェース。
*/
interface Callback {
/**
* 処理結果を通知するコールバックメソッド。
* @param resultArray
*/
void onComplete(int[] resultArray);
// --- ※下記、コールバックメソッドのコメントを外し、実装してください。
//
// /**
// * 処理前の1要素を通知するコールバックメソッド。
// * @param i
// */
// void beforeElement(int i);
//
// /**
// * 処理後の1要素を通知するコールバックメソッド。
// * @param i
// */
// void afterElement(int i);
}
みなさん、解けましたか?
解答は下記です!
解答例
package lesson_06.works_01;
/**
* ■課題
* 下記コードは、int配列を引数として渡し、配列要素の値をそれぞれ2倍にする関数processArrayを使った実装です。
* また、すべてのint配列の要素が2倍になった時点で、CallbackインターフェースのonCompleteメソッドで
* 2倍となった結果が通知(コールバック)されます。
*
* Callbackインターフェースに、下記コールバックメソッドを追加し、processArrayメソッド内に追加してください。
* ・beforeElementメソッド・・・繰り返し処理前(2倍にする前)の1要素を通知する。
* ・afterElementメソッド・・・繰り返し処理後(2倍にした後)の1要素を通知する。
*
* @author tomo-sato
*/
public class Main {
public static void main(String[] args) {
Callback callback = new Callback() {
@Override
public void onComplete(int[] iArray) {
for (int i : iArray) {
System.out.println("処理結果:" + i);
}
}
@Override
public void beforeElement(int i) {
System.out.println("処理前結果:" + i);
}
@Override
public void afterElement(int i) {
System.out.println("処理後結果:" + i);
}
};
int[] iArray = new int[] {1, 2, 3, 4};
processArray(iArray, callback);
}
/**
* 引数iArrayの、各要素を2倍にする。
* 2倍にした結果をCallbackインターフェースのonCompleteメソッドで通知する。
*
* @param iArray 処理対象の配列。
* @param callback 処理結果を通知するコールバック。
*/
public static void processArray(int[] iArray, Callback callback) {
int[] processedArray = new int[iArray.length];
for (int i = 0; i < iArray.length; i++) {
int j = iArray[i];
callback.beforeElement(j);
int k = iArray[i] * 2;
processedArray[i] = k;
callback.afterElement(k);
}
// onCompleteメソッドで通知。
callback.onComplete(processedArray);
}
}
/**
* コールバックインターフェース。
*/
interface Callback {
/**
* 処理結果を通知するコールバックメソッド。
* @param resultArray
*/
void onComplete(int[] resultArray);
// --- ※下記、コールバックメソッドのコメントを外し、実装してください。
/**
* 処理前の1要素を通知するコールバックメソッド。
* @param i
*/
void beforeElement(int i);
/**
* 処理後の1要素を通知するコールバックメソッド。
* @param i
*/
void afterElement(int i);
}
まとめ
今回はコールバックについて出題しました。
コールバックへの理解を深め、自身のプログラミングで活用し学習を進めてください!
メンバー募集のお知らせ
dcWORKSでは一緒に働く仲間を常時募集しています。私たちと一緒に人々の心を動かすものを創りませんか?
興味がある方は以下からお気軽にご応募ください。