Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ チャレンジ:タスクマネージャサービスの実装 | Javaにおける高度なデータ構造
Javaデータ構造

bookチャレンジ:タスクマネージャサービスの実装

メニューを表示するにはスワイプしてください

練習

実践の時間TaskManager サービスを作成し、タスクを管理します。

このサービスでは、ユーザーがタスクを追加し、自分に割り当て、その後順番に完了できます。

このタスクに一緒に取り組み、その後は自分で続けてください。

まず、タスクモデル自体を作成する必要があります。Task クラスを作成します:

Main.java

Main.java

copy
12345
public class Task { private int id; private String name; private String description; }

Task クラスには、idnamedescription の3つの属性が含まれています。各タスクにはname と descriptionが必要であり、id はあらゆるデータ構造にとって必要な属性です。

他にどのように要素へアクセスしますか? これらの属性は、private アクセス修飾子によって保護されています。これは、このクラスのフィールドに他のクラスが直接アクセスできないようにするためで、コンストラクタまたはゲッターを通じてのみアクセスできるようにします。

次に、これらのゲッターとコンストラクタを実装します。これは、MacBook では Control + Return、Windows では Alt + Ins の組み合わせで簡単に行えます。

操作後、次のような Task クラスが得られます。

Task.java

Task.java

copy
12345678910111213141516171819202122232425262728293031323334
package codefinity.taskManager; public class Task { private int id; private String name; private String description; public Task(int id, String name, String description) { this.id = id; this.name = name; this.description = description; } public int getId() { return id; } public String getName() { return name; } public String getDescription() { return description; } @Override public String toString() { return "Task{" + "id=" + id + ", name='" + name + '\'' + ", description='" + description + '\'' + '}'; } }

サービス

非常にシンプルなタスクボードサービスを用意します。タスクを追加し、完了済みにマークし、キューにタスクがあるかどうかを確認するサービスを実装します。

このクラスを TaskQueueService と呼びます。 まずは、これらのタスクを持つインターフェースを定義する必要があります:

TaskQueueService.java

TaskQueueService.java

copy
123456789
package codefinity.taskManager; public interface TaskQueueService { void addTask(Task task); Task getNextTask(); boolean isEmpty(); }

このインターフェースは、実装クラスが必ず実装しなければならない3つのメソッドを定義しています。これらのメソッドには、タスクの追加次のタスクへの移動(ユーザーが前のタスクをすでに完了していることを意味します)、およびキューにタスクが存在するかを確認するメソッドが含まれます。

それでは、これらすべてのメソッドをオーバーライドして実装する実装クラスを作成しましょう:

TaskQueueServiceImpl.java

TaskQueueServiceImpl.java

copy
12345678910
package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.Task; import java.util.LinkedList; import java.util.Queue; public class TaskQueueServiceImpl { private Queue<Task> taskQueue = new LinkedList<>(); }

このサービスクラス内でのみ使用されるプライベート属性を作成。

ここで、サービスクラスについて少し説明。サービスクラスはOOPにおいて重要な役割を果たす。

サービスクラスとは?

サービスクラスは、特定の操作を実行するために設計されたクラス。サービスインターフェースを継承し、そのメソッドを実装する。このアプローチにより、コードの保守性と拡張性が向上し、SOLID原則に従うことができる(詳細は別のコースで学習)。

現時点では、サービスクラスは他のオブジェクトに対して操作を実行するためだけに存在することを理解しておくことが重要。

例: 電卓を作成する場合、操作対象の数値を保持するための別クラスが存在する。実際の加算や減算などの操作は、サービスクラスで定義される。

この説明が、サービスクラスの目的を理解する助けとなれば幸い。

サービスの実装

次のステップは、このクラスがTaskQueueServiceインターフェースを実装していることを明示すること。

これを実現するには、implementsキーワードの後にインターフェース名を記述する。これにより、クラスがインターフェースで定義された動作を継承することが保証される。

インターフェースはメソッドの宣言のみを提供するため、クラス内でこれらのメソッドをオーバーライドして実装する必要がある。

ここで、クラス内でオーバーライドが必要なすべてのメソッドが表示されています。それでは、実装を進めましょう。

TaskQueueServiceImpl.java

TaskQueueServiceImpl.java

copy
1234567891011121314151617181920212223242526
package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.Task; import codefinity.taskManager.TaskQueueService; import java.util.LinkedList; import java.util.Queue; public class TaskQueueServiceImpl implements TaskQueueService { private Queue<Task> taskQueue = new LinkedList<>(); @Override public void addTask(Task task) { taskQueue.offer(task); } @Override public Task getNextTask() { return taskQueue.poll(); } @Override public boolean isEmpty() { return taskQueue.isEmpty(); } }

今回の場合、特に複雑なことは行っていません。Queueクラスのメソッドを利用して、正しくメソッドを実装しました。このように、キューのようなデータ構造は、すべてのJavaプログラマーの作業を容易にします。

追加にはoffer()メソッド、削除にはpoll()メソッド、キューが空かどうかの確認にはisEmpty()メソッドを使用します。

ここからはあなたがこの問題解決に関わる番です。これから一緒にインターフェースを作成するサービスクラスを実装してください。

Main.java

Main.java

copy
12345
package codefinity.taskManager; public interface TaskProcessorService { void processTasks(); }

サービスインターフェースを作成し、1つのメソッド processTasks() を定義しています。このメソッドは呼び出されると、タスクリストが空になるまで全てのタスクの実行を開始します。このメソッドは、ユーザーがタスクの実行を開始することを表しています。

タスク

TaskProcessorServiceImpl インターフェースを実装するクラス TaskProcessorService を作成してください。このクラスには、すべてのタスクを処理するメソッドが必要です。つまり、TaskQueueService サービスのメソッドを利用する必要があります。実装するクラス内でこのクラスのインスタンスを作成することで、コンポジションを使用できます。例:

Main.java

Main.java

copy
1234567
package codefinity.taskManager.taskManagerImpl; import codefinity.taskManager.TaskQueueService; public class TaskProcessorServiceImpl { TaskQueueService taskQueueService = new TaskQueueServiceImpl(); }

一般的に、課題のための準備済みのコンポジションが上部に用意されています。次に、このクラスのインスタンスを使って1つのメソッドを実装するだけです。

その後、taskQueueService クラスのオブジェクトを初期化する コンストラクタ を作成します。

この方法で、このオブジェクトのメソッドを利用できるようになります。また、タスク処理のためには、taskProcessor が動作する キューを渡す 必要があることも明らかです。

残りの課題はあなた自身で進めてください。ヒントは README.md ファイルに記載されています。解答が準備できたら「Run Tests」ボタンをクリックしてください。作成済みのユニットテストがあなたの解答をチェックします。

  1. まず、コンポジションを利用し、TaskQueue クラスのインスタンスを作成します。その後、コンストラクタで初期化も追加します。
  2. 次に、TaskProcessorImpl インターフェースを実装し、そのメソッドをオーバーライドします。
  3. インターフェースの実装では、isEmpty() メソッドを条件とした while ループを使用します。
  4. while ループ内で、taskQueueService.getNextTask() メソッドを使い、タスクが完了したことを示します。System.out.println() を使って画面に情報を出力します - "Processing Task: " + task
  5. ループが終了したら、"All tasks processed." を画面に出力します。
  6. テストを実行し、解答の正しさを確認します。
package codefinity.taskManager.taskManagerImpl;

import codefinity.taskManager.Task;
import codefinity.taskManager.TaskProcessorService;
import codefinity.taskManager.TaskQueueService;

public class TaskProcessorServiceImpl implements TaskProcessorService {
    private final TaskQueueService taskQueueImpl;

    public TaskProcessorServiceImpl(TaskQueueService taskQueueImpl) {
        this.taskQueueImpl = taskQueueImpl;
    }

    @Override
    public void processTasks() {
        while (!taskQueueImpl.isEmpty()) {
            Task task = taskQueueImpl.getNextTask();
            System.out.println("Processing Task: " + task + ";");
        }
        System.out.println("All tasks processed successfully.");
    }
}
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 2.  3

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 2.  3
some-alt