class Member { String emailAddress; public boolean isValid() { return emailAddress.matches("^\\S+@\\S+\\.\\S+$"); } } @Getter public class Member { String emailAddress; boolean emailVerified; } public interface VerifyEmailService { boolean verify(String emailAddress); } public class VerifyEmailUseCase { private VerifyEmailService verifyEmailService; private SaveMemberPort saveMemberPort; public void verify(VerifyEmailCommand command) { if (verifyEmailService.verify(command.getEmailAddress())) { Member member = new Member(command.getEmailAddress(), true); saveMemberPort.save(member); } else { throw new FailToVerifyEmailException(); } } } @Getter public abstract class EmailAddress { String value; } public class VerifiedEmailAddress extends EmailAddress { VerifiedEmailAddress(String value) { super(value); } } public class UnverifiedEmailAddress extends EmailAddress { public UnverifiedEmailAddress(String value) { super(value); } } public class Member { EmailAddress emailAddress; } public interface VerifyEmailService { VerifiedEmailAddress verify(UnverifiedEmailAddress emailAddress); } public interface SendNotificationService { void send(VerifiedEmailAddress emailAddress); }