Java中級

中級 Javaで学ぶクリーンアーキテクチャ|練習問題編

導入

クリーンアーキテクチャは、ソフトウェア開発において保守性や拡張性を高めるための設計原則を提供します。特に、ビジネスロジックとインフラストラクチャを分離することで、変更に強いシステムを構築できます。このセクションでは、実際の業務で遭遇する可能性のあるシチュエーションを通じて、クリーンアーキテクチャの実践的な適用方法を探ります。

教科書レベルの解説(クリーンアーキテクチャ)

重要な概念の整理

クリーンアーキテクチャでは、システムを層に分けることが基本です。主に、以下の層が存在します。

  • エンティティ層: ビジネスルールを定義します。
  • ユースケース層: アプリケーションの特定の機能を実現します。
  • インターフェース層: ユーザーや他のシステムとの接点を提供します。
  • フレームワーク層: 外部ライブラリやフレームワークと連携します。

この構造により、各層の独立性が保たれ、テストやリファクタリングが容易になります。特に、ユースケース層の設計が不十分だと、エンティティ層やインターフェース層に影響を及ぼすため、注意が必要です。

コード例(Java)


public class User {
    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }
}

public class UserRepository {
    private List users = new ArrayList<>();

    public void addUser(User user) {
        users.add(user);
    }

    public User findUserByEmail(String email) {
        return users.stream()
                    .filter(user -> user.getEmail().equals(email))
                    .findFirst()
                    .orElse(null);
    }
}

public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void registerUser(String name, String email) {
        User user = new User(name, email);
        userRepository.addUser(user);
    }
}

コードの行ごとの解説

  1. Userクラス: ユーザーの基本情報を保持するエンティティ層。
  2. UserRepositoryクラス: ユーザー情報を管理するリポジトリ層。データの追加と検索を行う。
  3. UserServiceクラス: ビジネスロジックを実装するユースケース層。ユーザーの登録機能を提供。
  4. 依存性の注入: UserServiceはUserRepositoryに依存し、これによりテストが容易になる。

練習問題編

以下の練習問題を解くことで、クリーンアーキテクチャの理解を深めてください。

  1. 問題1: Userクラスに新しいフィールド(例: 年齢)を追加し、適切にコンストラクタとゲッターを修正してください。
  2. 問題2: UserRepositoryにユーザーをメールアドレスで削除するメソッドを追加してください。
  3. 問題3: UserServiceにユーザー情報を更新するメソッドを追加し、そのロジックを実装してください。

模範解答と解説

  1. 問題1の解答: Userクラスに年齢フィールドを追加し、コンストラクタで初期化する。
  2. 
    private int age;
    
    public User(String name, String email, int age) {
        this.name = name;
        this.email = email;
        this.age = age;
    }
    
  3. 問題2の解答: UserRepositoryにメールアドレスでユーザーを削除するメソッドを実装する。
  4. 
    public void removeUserByEmail(String email) {
        users.removeIf(user -> user.getEmail().equals(email));
    }
    
  5. 問題3の解答: UserServiceにユーザー情報を更新するメソッドを追加する。
  6. 
    public void updateUserEmail(String oldEmail, String newEmail) {
        User user = userRepository.findUserByEmail(oldEmail);
        if (user != null) {
            user = new User(user.getName(), newEmail);
            userRepository.addUser(user);
            userRepository.removeUserByEmail(oldEmail);
        }
    }
    

まとめ

  • クリーンアーキテクチャは層を分けてシステムの独立性を高める。
  • ビジネスロジックをユースケース層に実装することで、テストやリファクタリングが容易になる。
  • 実務に即した設計が、長期的な保守性を確保する。