ãããµãŽãã«ã¢ãŒããã¯ãã£ïŒããŒããšã¢ããã¿ãŒãšãåŒã°ããïŒããã¢ããªã±ãŒã·ã§ã³ã®ä¿å®æ§ããã¹ãå®¹ææ§ãæè»æ§ãã©ã®ããã«åäžãããããåŠã³ãŸãããããã®ã¬ã€ãã¯ãäžçäžã®éçºè åãã«å®è·µçãªäŸãšå ·äœçãªæŽå¯ãæäŸããŸãã
ãããµãŽãã«ã¢ãŒããã¯ãã£ïŒããŒããšã¢ããã¿ãŒã®å®è·µã¬ã€ã
çµ¶ããé²åãããœãããŠã§ã¢éçºã®åéã«ãããŠãå ç¢ã§ä¿å®å¯èœãã€ãã¹ã容æãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšã¯æãéèŠã§ããããŒããšã¢ããã¿ãŒãšããŠãç¥ããããããµãŽãã«ã¢ãŒããã¯ãã£ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ããžãã¹ããžãã¯ãå€éšã®äŸåé¢ä¿ããåé¢ããããšã§ããããã®æžå¿µã«å¯ŸåŠããã¢ãŒããã¯ãã£ãã¿ãŒã³ã§ãããã®ã¬ã€ãã¯ãäžçäžã®éçºè åãã«ããããµãŽãã«ã¢ãŒããã¯ãã£ããã®å©ç¹ãããã³å®è·µçãªå®è£ æŠç¥ã®å æ¬çãªçè§£ãæäŸããããšãç®çãšããŠããŸãã
ãããµãŽãã«ã¢ãŒããã¯ãã£ãšã¯ïŒ
ã¢ãªã¹ã¿ãŒã»ã³ãã¯ããŒã³ã«ãã£ãŠæå±ããããããµãŽãã«ã¢ãŒããã¯ãã£ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢ããžãã¹ããžãã¯ãå€éšã®äžçããéé¢ãããšããèãæ¹ã«åºã¥ããŠããŸãããã®éé¢ã¯ãããŒããšã¢ããã¿ãŒã䜿çšããããšã§å®çŸãããŸãã
- ã³ã¢ïŒã¢ããªã±ãŒã·ã§ã³ïŒïŒ ã¢ããªã±ãŒã·ã§ã³ã®äžæ žã衚ããããžãã¹ããžãã¯ãšãã¡ã€ã³ã¢ãã«ãå«ã¿ãŸããç¹å®ã®æè¡ããã¬ãŒã ã¯ãŒã¯ã«äŸåãã¹ãã§ã¯ãããŸããã
- ããŒãïŒ ã³ã¢ã¢ããªã±ãŒã·ã§ã³ãå€éšã®äžçãšå¯Ÿè©±ããããã«äœ¿çšããã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸãããããã¯ãããŒã¿ããŒã¹ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãã¡ãã»ãŒãžãã¥ãŒãªã©ã®å€éšã·ã¹ãã ãšã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«å¯Ÿè©±ããããæœè±¡çã«å®çŸ©ãããã®ã§ããããŒãã«ã¯2ã€ã®ã¿ã€ãããããŸãïŒ
- é§åïŒãã©ã€ããªïŒããŒãïŒ å€éšã¢ã¯ã¿ãŒïŒäŸïŒãŠãŒã¶ãŒãä»ã®ã¢ããªã±ãŒã·ã§ã³ïŒãã³ã¢ã¢ããªã±ãŒã·ã§ã³å ã§ã¢ã¯ã·ã§ã³ãéå§ã§ããã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸãã
- 被é§åïŒã»ã«ã³ããªïŒããŒãïŒ ã³ã¢ã¢ããªã±ãŒã·ã§ã³ãå€éšã·ã¹ãã ïŒäŸïŒããŒã¿ããŒã¹ãã¡ãã»ãŒãžãã¥ãŒïŒãšå¯Ÿè©±ããããã«äœ¿çšããã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸãã
- ã¢ããã¿ãŒïŒ ããŒãã«ãã£ãŠå®çŸ©ãããã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŸãããããã¯ãã³ã¢ã¢ããªã±ãŒã·ã§ã³ãšå€éšã·ã¹ãã éã®ç¿»èš³è
ãšããŠæ©èœããŸããã¢ããã¿ãŒã«ã¯2ã€ã®ã¿ã€ãããããŸãïŒ
- é§åïŒãã©ã€ããªïŒã¢ããã¿ãŒïŒ é§åããŒããå®è£ ããå€éšããã®ãªã¯ãšã¹ããã³ã¢ã¢ããªã±ãŒã·ã§ã³ãçè§£ã§ããã³ãã³ããã¯ãšãªã«å€æããŸããäŸãšããŠã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã³ã³ããŒãã³ãïŒäŸïŒWebã³ã³ãããŒã©ïŒãã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ãã¡ãã»ãŒãžãã¥ãŒãªã¹ããŒãªã©ããããŸãã
- 被é§åïŒã»ã«ã³ããªïŒã¢ããã¿ãŒïŒ 被é§åããŒããå®è£ ããã³ã¢ã¢ããªã±ãŒã·ã§ã³ã®ãªã¯ãšã¹ããå€éšã·ã¹ãã ãšã®ç¹å®ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã«å€æããŸããäŸãšããŠã¯ãããŒã¿ããŒã¹ã¢ã¯ã»ã¹ãªããžã§ã¯ããã¡ãã»ãŒãžãã¥ãŒãããã¥ãŒãµãŒãAPIã¯ã©ã€ã¢ã³ããªã©ããããŸãã
ãã®ããã«èããŠã¿ãŠãã ãããã³ã¢ã¢ããªã±ãŒã·ã§ã³ãäžå€®ã«åº§ããå è§åœ¢ã®ã·ã§ã«ã«å²ãŸããŠããŸããããŒãã¯ãã®ã·ã§ã«ã®å ¥ãå£ãšåºå£ã§ãããã¢ããã¿ãŒã¯ãããã®ããŒãã«å·®ã蟌ãŸããã³ã¢ãå€éšã®äžçã«æ¥ç¶ããŸãã
ãããµãŽãã«ã¢ãŒããã¯ãã£ã®äž»èŠåå
ãããµãŽãã«ã¢ãŒããã¯ãã£ã®å¹æãæ¯ããããã€ãã®äž»èŠååããããŸãïŒ
- äŸåé¢ä¿ã®éè»¢ïŒ ã³ã¢ã¢ããªã±ãŒã·ã§ã³ã¯ãå ·äœçãªå®è£ ïŒã¢ããã¿ãŒïŒã§ã¯ãªããæœè±¡åïŒããŒãïŒã«äŸåããŸããããã¯SOLIDãã¶ã€ã³ã®æ žå¿ååã§ãã
- æç€ºçãªã€ã³ã¿ãŒãã§ãŒã¹ïŒ ããŒãã¯ãã³ã¢ãšå€éšã®äžçãšã®å¢çãæç¢ºã«å®çŸ©ããå¥çŽããŒã¹ã®çµ±åã¢ãããŒããä¿é²ããŸãã
- ãã¹ãå®¹ææ§ïŒ ã³ã¢ãå€éšã®äŸåé¢ä¿ããåé¢ããããšã§ãããŒãã®ã¢ãã¯å®è£ ã䜿çšããŠããžãã¹ããžãã¯ãåç¬ã§ãã¹ãããããšã容æã«ãªããŸãã
- æè»æ§ïŒ ã¢ããã¿ãŒã¯ã³ã¢ã¢ããªã±ãŒã·ã§ã³ã«åœ±é¿ãäžããããšãªã亀æã§ãããããå€åããæè¡ãèŠä»¶ã«å®¹æã«é©å¿ã§ããŸããMySQLããPostgreSQLã«åãæ¿ããå¿ èŠãããå ŽåãããŒã¿ããŒã¹ã¢ããã¿ãŒã®ã¿ã倿Žããã°ãããšæ³åããŠãã ããã
ãããµãŽãã«ã¢ãŒããã¯ãã£ã䜿çšããå©ç¹
ãããµãŽãã«ã¢ãŒããã¯ãã£ãæ¡çšããããšã«ã¯ãæ°å€ãã®å©ç¹ããããŸãïŒ
- ãã¹ãå®¹ææ§ã®åäžïŒ é¢å¿ã®åé¢ã«ãããã³ã¢ããžãã¹ããžãã¯ã®ãŠããããã¹ããã¯ããã«ç°¡åã«èšè¿°ã§ããŸããããŒããã¢ãã¯åããããšã§ãå€éšã·ã¹ãã ã«äŸåããããšãªãã³ã¢ãéé¢ãã培åºçã«ãã¹ãã§ããŸããäŸãã°ãæ¯æãåŠçã¢ãžã¥ãŒã«ã¯ãæ¯æãã²ãŒããŠã§ã€ã®ããŒããã¢ãã¯åããããšã§ãå®éã®ã²ãŒããŠã§ã€ã«æ¥ç¶ããããšãªããæåããã³å€±æãããã©ã³ã¶ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒãããŠãã¹ãã§ããŸãã
- ä¿å®æ§ã®åäžïŒ å€éšã·ã¹ãã ãæè¡ã®å€æŽã¯ãã³ã¢ã¢ããªã±ãŒã·ã§ã³ã«æå°éã®åœ±é¿ããäžããŸãããã¢ããã¿ãŒã¯æç±å±€ãšããŠæ©èœããã³ã¢ãå€éšã®å€åããä¿è·ããŸããSMSéç¥ã®éä¿¡ã«äœ¿çšããããµãŒãããŒãã£APIããã®åœ¢åŒãèªèšŒæ¹æ³ã倿Žããã·ããªãªãèããŠã¿ãŠãã ãããSMSã¢ããã¿ãŒã®ã¿ãæŽæ°ããã°ãããã³ã¢ã¢ããªã±ãŒã·ã§ã³ã¯æã€ããã®ãŸãŸã§ãã
- æè»æ§ã®åŒ·åïŒ ã¢ããã¿ãŒã¯ç°¡åã«åãæ¿ããããšãã§ããå€§èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ãããããšãªãæ°ããæè¡ãèŠä»¶ã«é©å¿ã§ããŸããããã«ãããå®éšãšã€ãããŒã·ã§ã³ãä¿é²ãããŸããäŒæ¥ãããŒã¿ã¹ãã¬ãŒãžãåŸæ¥ã®RDBããNoSQLããŒã¿ããŒã¹ã«ç§»è¡ããããšã決å®ãããããããŸããããããµãŽãã«ã¢ãŒããã¯ãã£ã䜿çšããã°ãããŒã¿ããŒã¹ã¢ããã¿ãŒã眮ãæããã ãã§ãããã³ã¢ã¢ããªã±ãŒã·ã§ã³ãžã®åœ±é¿ãæå°éã«æããããŸãã
- çµå床ã®åæžïŒ ã³ã¢ã¢ããªã±ãŒã·ã§ã³ã¯å€éšã®äŸåé¢ä¿ããåé¢ãããããã¢ãžã¥ãŒã«çã§åéæ§ã®é«ãèšèšã«ã€ãªãããŸããããã«ãããã³ãŒãããŒã¹ã®çè§£ã倿Žãæ¡åŒµã容æã«ãªããŸãã
- ç¬ç«ããéçºïŒ ç°ãªãããŒã ãã³ã¢ã¢ããªã±ãŒã·ã§ã³ãšã¢ããã¿ãŒãç¬ç«ããŠäœæ¥ã§ããããã䞊è¡éçºãšåžå Žæå ¥ãŸã§ã®æéã®ççž®ãä¿é²ãããŸããäŸãã°ãããããŒã ã¯ã³ã¢ã®æ³šæåŠçããžãã¯ã®éçºã«éäžããå¥ã®ããŒã ã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãšããŒã¿ããŒã¹ã¢ããã¿ãŒãæ§ç¯ããããšãã§ããŸãã
ãããµãŽãã«ã¢ãŒããã¯ãã£ã®å®è£ ïŒå®è·µäŸ
ãŠãŒã¶ãŒç»é²ã·ã¹ãã ã®ç°¡åãªäŸã§ããããµãŽãã«ã¢ãŒããã¯ãã£ã®å®è£ ã説æããŸããããåãããããããããã«ãæ¶ç©ºã®ããã°ã©ãã³ã°èšèªïŒJavaãC#ã«äŒŒããã®ïŒã䜿çšããŸãã
1. ã³ã¢ïŒã¢ããªã±ãŒã·ã§ã³ïŒãå®çŸ©ãã
ã³ã¢ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãæ°ãããŠãŒã¶ãŒãç»é²ããããã®ããžãã¹ããžãã¯ãå«ãŸããŠããŸãã
// Core/UserService.java (or UserService.cs)
public class UserService {
private final UserRepository userRepository;
private final PasswordHasher passwordHasher;
private final UserValidator userValidator;
public UserService(UserRepository userRepository, PasswordHasher passwordHasher, UserValidator userValidator) {
this.userRepository = userRepository;
this.passwordHasher = passwordHasher;
this.userValidator = userValidator;
}
public Result<User, String> registerUser(String username, String password, String email) {
// Validate user input
ValidationResult validationResult = userValidator.validate(username, password, email);
if (!validationResult.isValid()) {
return Result.failure(validationResult.getErrorMessage());
}
// Check if user already exists
if (userRepository.findByUsername(username).isPresent()) {
return Result.failure("Username already exists");
}
// Hash the password
String hashedPassword = passwordHasher.hash(password);
// Create a new user
User user = new User(username, hashedPassword, email);
// Save the user to the repository
userRepository.save(user);
return Result.success(user);
}
}
2. ããŒããå®çŸ©ãã
ã³ã¢ã¢ããªã±ãŒã·ã§ã³ãå€éšã®äžçãšå¯Ÿè©±ããããã«äœ¿çšããããŒããå®çŸ©ããŸãã
// Ports/UserRepository.java (or UserRepository.cs)
public interface UserRepository {
Optional<User> findByUsername(String username);
void save(User user);
}
// Ports/PasswordHasher.java (or PasswordHasher.cs)
public interface PasswordHasher {
String hash(String password);
}
//Ports/UserValidator.java (or UserValidator.cs)
public interface UserValidator{
ValidationResult validate(String username, String password, String email);
}
//Ports/ValidationResult.java (or ValidationResult.cs)
public interface ValidationResult{
boolean isValid();
String getErrorMessage();
}
3. ã¢ããã¿ãŒãå®çŸ©ãã
ã³ã¢ã¢ããªã±ãŒã·ã§ã³ãç¹å®ã®æè¡ã«æ¥ç¶ããã¢ããã¿ãŒãå®è£ ããŸãã
// Adapters/DatabaseUserRepository.java (or DatabaseUserRepository.cs)
public class DatabaseUserRepository implements UserRepository {
private final DatabaseConnection databaseConnection;
public DatabaseUserRepository(DatabaseConnection databaseConnection) {
this.databaseConnection = databaseConnection;
}
@Override
public Optional<User> findByUsername(String username) {
// Implementation using JDBC, JPA, or another database access technology
// ...
return Optional.empty(); // Placeholder
}
@Override
public void save(User user) {
// Implementation using JDBC, JPA, or another database access technology
// ...
}
}
// Adapters/BCryptPasswordHasher.java (or BCryptPasswordHasher.cs)
public class BCryptPasswordHasher implements PasswordHasher {
@Override
public String hash(String password) {
// Implementation using BCrypt library
// ...
return "hashedPassword"; //Placeholder
}
}
//Adapters/SimpleUserValidator.java (or SimpleUserValidator.cs)
public class SimpleUserValidator implements UserValidator {
@Override
public ValidationResult validate(String username, String password, String email){
//Simple Validation logic
if (username == null || username.isEmpty()) {
return new SimpleValidationResult(false, "Username cannot be empty");
}
if (password == null || password.length() < 8) {
return new SimpleValidationResult(false, "Password must be at least 8 characters long");
}
if (email == null || !email.contains("@")) {
return new SimpleValidationResult(false, "Invalid email format");
}
return new SimpleValidationResult(true, null);
}
}
//Adapters/SimpleValidationResult.java (or SimpleValidationResult.cs)
public class SimpleValidationResult implements ValidationResult {
private final boolean valid;
private final String errorMessage;
public SimpleValidationResult(boolean valid, String errorMessage) {
this.valid = valid;
this.errorMessage = errorMessage;
}
@Override
public boolean isValid(){
return valid;
}
@Override
public String getErrorMessage(){
return errorMessage;
}
}
//Adapters/WebUserController.java (or WebUserController.cs)
//Driving Adapter - handles requests from the web
public class WebUserController {
private final UserService userService;
public WebUserController(UserService userService) {
this.userService = userService;
}
public String registerUser(String username, String password, String email) {
Result<User, String> result = userService.registerUser(username, password, email);
if (result.isSuccess()) {
return "Registration successful!";
} else {
return "Registration failed: " + result.getFailure();
}
}
}
4. ã³ã³ããžã·ã§ã³
ãã¹ãŠãçµåããŸãããã®ã³ã³ããžã·ã§ã³ïŒäŸåæ§æ³šå ¥ïŒã¯ãéåžžãã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãã€ã³ããŸãã¯äŸåæ§æ³šå ¥ã³ã³ããå ã§è¡ãããããšã«æ³šæããŠãã ããã
//Main class or dependency injection configuration
public class Main {
public static void main(String[] args) {
// Create instances of the adapters
DatabaseConnection databaseConnection = new DatabaseConnection("jdbc:mydb://localhost:5432/users", "user", "password");
DatabaseUserRepository userRepository = new DatabaseUserRepository(databaseConnection);
BCryptPasswordHasher passwordHasher = new BCryptPasswordHasher();
SimpleUserValidator userValidator = new SimpleUserValidator();
// Create an instance of the core application, injecting the adapters
UserService userService = new UserService(userRepository, passwordHasher, userValidator);
//Create a driving adapter and connect it to the service
WebUserController userController = new WebUserController(userService);
//Now you can handle user registration requests through the userController
String result = userController.registerUser("john.doe", "P@sswOrd123", "john.doe@example.com");
System.out.println(result);
}
}
//DatabaseConnection is a simple class for demonstration purposes only
class DatabaseConnection {
private String url;
private String username;
private String password;
public DatabaseConnection(String url, String username, String password) {
this.url = url;
this.username = username;
this.password = password;
}
// ... methods to connect to the database (not implemented for brevity)
}
//Result class (similar to Either in functional programming)
class Result<T, E> {
private final T success;
private final E failure;
private final boolean isSuccess;
private Result(T success, E failure, boolean isSuccess) {
this.success = success;
this.failure = failure;
this.isSuccess = isSuccess;
}
public static <T, E> Result<T, E> success(T value) {
return new Result<>(value, null, true);
}
public static <T, E> Result<T, E> failure(E error) {
return new Result<>(null, error, false);
}
public boolean isSuccess() {
return isSuccess;
}
public T getSuccess() {
if (!isSuccess) {
throw new IllegalStateException("Result is a failure");
}
return success;
}
public E getFailure() {
if (isSuccess) {
throw new IllegalStateException("Result is a success");
}
return failure;
}
}
class User {
private String username;
private String password;
private String email;
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
// getters and setters (omitted for brevity)
}
説æïŒ
UserServiceã¯ã³ã¢ããžãã¹ããžãã¯ã衚ããŸããããã¯ãUserRepositoryãPasswordHasherãããã³UserValidatorã€ã³ã¿ãŒãã§ãŒã¹ïŒããŒãïŒã«äŸåããŸããDatabaseUserRepositoryãBCryptPasswordHasherãããã³SimpleUserValidatorã¯ãå ·äœçãªæè¡ïŒããŒã¿ããŒã¹ãBCryptãããã³åºæ¬çãªæ€èšŒããžãã¯ïŒã䜿çšããŠããããã®ããŒããå®è£ ããã¢ããã¿ãŒã§ããWebUserControllerã¯ãWebãªã¯ãšã¹ããåŠçããUserServiceãšå¯Ÿè©±ããé§åã¢ããã¿ãŒã§ãã- mainã¡ãœããã¯ãã¢ããã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããããã³ã¢ã¢ããªã±ãŒã·ã§ã³ã«æ³šå ¥ããããšã§ãã¢ããªã±ãŒã·ã§ã³ãæ§æããŸãã
é«åºŠãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
ãããµãŽãã«ã¢ãŒããã¯ãã£ã®åºæ¬ååã¯ã·ã³ãã«ã§ãããçæãã¹ãé«åºŠãªèæ ®äºé ãããã€ããããŸãã
- ããŒãã®é©åãªç²åºŠã®éžæïŒ ããŒãã®é©åãªæœè±¡ã¬ãã«ã決å®ããããšã¯éåžžã«éèŠã§ããç²åºŠã现ãããããšäžèŠãªè€éãã«ã€ãªãããç²ããããšæè»æ§ãå¶éãããå¯èœæ§ããããŸããããŒããå®çŸ©ããéã«ã¯ãã·ã³ãã«ããšé©å¿æ§ã®éã®ãã¬ãŒããªããèæ ®ããŠãã ããã
- ãã©ã³ã¶ã¯ã·ã§ã³ç®¡çïŒ è€æ°ã®å€éšã·ã¹ãã ãæ±ãå Žåããã©ã³ã¶ã¯ã·ã§ã³ã®äžè²«æ§ã確ä¿ããããšã¯é£ããå ŽåããããŸããããŒã¿æŽåæ§ãç¶æããããã«ã忣ãã©ã³ã¶ã¯ã·ã§ã³ç®¡çæè¡ã䜿çšããããè£åãã©ã³ã¶ã¯ã·ã§ã³ãå®è£ ããããšãæ€èšããŠãã ãããäŸãã°ããŠãŒã¶ãŒç»é²ã«å¥ã®è«æ±ã·ã¹ãã ã§ã®ã¢ã«ãŠã³ãäœæãå«ãŸããå Žåãäž¡æ¹ã®æäœãäžç·ã«æåããã倱æããããšãä¿èšŒããå¿ èŠããããŸãã
- ãšã©ãŒãã³ããªã³ã°ïŒ å€éšã·ã¹ãã ã§ã®é害ãé©åã«åŠçããããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ã¡ã«ããºã ãå®è£ ããŠãã ãããã«ã¹ã±ãŒãé害ãé²ãããã«ããµãŒããããã¬ãŒã«ãŒããªãã©ã€ã¡ã«ããºã ã䜿çšããŠãã ãããã¢ããã¿ãŒãããŒã¿ããŒã¹ã«æ¥ç¶ã§ããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯ãšã©ãŒãé©åã«åŠçããæ¥ç¶ãå詊è¡ãããããŠãŒã¶ãŒã«åããããããšã©ãŒã¡ãã»ãŒãžãæäŸããã¹ãã§ãã
- ãã¹ãæŠç¥ïŒ ã¢ããªã±ãŒã·ã§ã³ã®å質ã確ä¿ããããã«ããŠããããã¹ããçµ±åãã¹ãããšã³ãããŒãšã³ããã¹ããçµã¿åãããŠäœ¿çšããŠãã ããããŠããããã¹ãã¯ã³ã¢ããžãã¹ããžãã¯ã«çŠç¹ãåœãŠãã¹ãã§ãããçµ±åãã¹ãã¯ã³ã¢ãšã¢ããã¿ãŒéã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãæ€èšŒãã¹ãã§ãã
- äŸåæ§æ³šå ¥ãã¬ãŒã ã¯ãŒã¯ïŒ äŸåæ§æ³šå ¥ãã¬ãŒã ã¯ãŒã¯ïŒäŸïŒSpringãGuiceïŒã掻çšããŠãã³ã³ããŒãã³ãéã®äŸåé¢ä¿ã管çããã¢ããªã±ãŒã·ã§ã³ã®æ§æãç°¡çŽ åããŸãããããã®ãã¬ãŒã ã¯ãŒã¯ã¯ãäŸåé¢ä¿ã®äœæãšæ³šå ¥ã®ããã»ã¹ãèªååããå®åã³ãŒããåæžããä¿å®æ§ãåäžãããŸãã
- CQRSïŒCommand Query Responsibility SegregationïŒïŒ ãããµãŽãã«ã¢ãŒããã¯ãã£ã¯CQRSãšããæŽåããã¢ããªã±ãŒã·ã§ã³ã®èªã¿åãã¢ãã«ãšæžã蟌ã¿ã¢ãã«ãåé¢ããŸããããã«ãããç¹ã«è€éãªã·ã¹ãã ã§ã¯ãããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãããã«åäžããå¯èœæ§ããããŸãã
ãããµãŽãã«ã¢ãŒããã¯ãã£ã®å®éã®äœ¿çšäŸ
å€ãã®æåããäŒæ¥ããããžã§ã¯ãããå ç¢ã§ä¿å®å¯èœãªã·ã¹ãã ãæ§ç¯ããããã«ãããµãŽãã«ã¢ãŒããã¯ãã£ãæ¡çšããŠããŸãïŒ
- Eã³ããŒã¹ãã©ãããã©ãŒã ïŒ Eã³ããŒã¹ãã©ãããã©ãŒã ã¯ãã³ã¢ã®æ³šæåŠçããžãã¯ãæ¯æãã²ãŒããŠã§ã€ãé éãããã€ããŒãåšåº«ç®¡çã·ã¹ãã ãªã©ã®ããŸããŸãªå€éšã·ã¹ãã ããåé¢ããããã«ããããµãŽãã«ã¢ãŒããã¯ãã£ãé »ç¹ã«äœ¿çšããŸããããã«ãããã³ã¢æ©èœãäžæããããšãªããæ°ããæ¯æãæ¹æ³ãé éãªãã·ã§ã³ãç°¡åã«çµ±åã§ããŸãã
- éèã¢ããªã±ãŒã·ã§ã³ïŒ éè¡ã·ã¹ãã ãååŒãã©ãããã©ãŒã ãªã©ã®éèã¢ããªã±ãŒã·ã§ã³ã¯ããããµãŽãã«ã¢ãŒããã¯ãã£ãæäŸãããã¹ãå®¹ææ§ãšä¿å®æ§ã®æ©æµãåããŸããã³ã¢ã®éèããžãã¯ã¯åç¬ã§åŸ¹åºçã«ãã¹ãã§ããã¢ããã¿ãŒã䜿çšããŠåžå ŽããŒã¿ãããã€ããŒãæ±ºæžæ©é¢ãªã©ã®ããŸããŸãªå€éšãµãŒãã¹ã«æ¥ç¶ã§ããŸãã
- ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ïŒ ãããµãŽãã«ã¢ãŒããã¯ãã£ã¯ãåãã€ã¯ããµãŒãã¹ãç¬èªã®ã³ã¢ããžãã¹ããžãã¯ãšå€éšäŸåé¢ä¿ãæã€ããŠã³ãããã³ã³ããã¹ãã衚ããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã«èªç¶ã«é©åããŸããããŒããšã¢ããã¿ãŒã¯ããã€ã¯ããµãŒãã¹éã®æç¢ºãªéä¿¡å¥çŽãæäŸããççµåãšç¬ç«ãããããã€ã¡ã³ããä¿é²ããŸãã
- ã¬ã¬ã·ãŒã·ã¹ãã ã®ã¢ããã€ãŒãŒã·ã§ã³ïŒ ãããµãŽãã«ã¢ãŒããã¯ãã£ã¯ãæ¢åã®ã³ãŒããã¢ããã¿ãŒã§ã©ããããããŒãã®èåŸã«æ°ããã³ã¢ããžãã¯ãå°å ¥ããããšã§ãã¬ã¬ã·ãŒã·ã¹ãã ãæ®µéçã«ã¢ããã€ãºããããã«äœ¿çšã§ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³å šäœãæžãçŽãããšãªããã¬ã¬ã·ãŒã·ã¹ãã ã®äžéšã段éçã«çœ®ãæããããšãã§ããŸãã
課é¡ãšãã¬ãŒããªã
ãããµãŽãã«ã¢ãŒããã¯ãã£ã¯å€§ããªå©ç¹ãæäŸããŸãããé¢é£ãã課é¡ãšãã¬ãŒããªããèªèããããšãéèŠã§ãïŒ
- è€éãã®å¢å ïŒ ãããµãŽãã«ã¢ãŒããã¯ãã£ã®å®è£ ã¯ã远å ã®æœè±¡åã¬ã€ã€ãŒãå°å ¥ããå¯èœæ§ããããããã«ããã³ãŒãããŒã¹ã®åæã®è€éããå¢å ããå¯èœæ§ããããŸãã
- åŠç¿æ²ç·ïŒ éçºè ã¯ãããŒããšã¢ããã¿ãŒã®æŠå¿µãšãããã广çã«é©çšããæ¹æ³ãçè§£ããã®ã«æéãå¿ èŠã«ãªãå ŽåããããŸãã
- éå°ãªèšèšã®å¯èœæ§ïŒ äžèŠãªããŒããã¢ããã¿ãŒãäœæããããšã«ããéå°ãªèšèšãé¿ããããšãéèŠã§ããã·ã³ãã«ãªèšèšããå§ããŠãå¿ èŠã«å¿ããŠåŸã ã«è€éãã远å ããŠãã ããã
- ããã©ãŒãã³ã¹ã®èæ ®äºé ïŒ è¿œå ã®æœè±¡åã¬ã€ã€ãŒã¯ãããã€ãã®ããã©ãŒãã³ã¹ãªãŒããŒããããå°å ¥ããå¯èœæ§ããããŸãããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯éåžžãããã¯ç¡èŠã§ããã¬ãã«ã§ãã
ç¹å®ã®ãããžã§ã¯ãèŠä»¶ãšããŒã ã®èœåã®æèã§ããããµãŽãã«ã¢ãŒããã¯ãã£ã®å©ç¹ãšèª²é¡ãæ éã«è©äŸ¡ããããšãéèŠã§ããããã¯äžèœè¬ã§ã¯ãªãããã¹ãŠã®ãããžã§ã¯ãã«æé©ãªéžæè¢ã§ã¯ãªããããããŸããã
çµè«
ãããµãŽãã«ã¢ãŒããã¯ãã£ã¯ãããŒããšã¢ããã¿ãŒã«éç¹ã眮ãããšã§ãä¿å®å¯èœã§ãã¹ã容æãã€æè»ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªã¢ãããŒããæäŸããŸããã³ã¢ããžãã¹ããžãã¯ãå€éšã®äŸåé¢ä¿ããåé¢ããããšã§ãå€åããæè¡ãèŠä»¶ã«å®¹æã«é©å¿ã§ããŸããèæ ®ãã¹ã課é¡ããã¬ãŒããªãã¯ãããŸããããããµãŽãã«ã¢ãŒããã¯ãã£ã®å©ç¹ã¯ãç¹ã«è€éã§é·æã«ãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠãã³ã¹ããäžåãããšããããããŸããäŸåé¢ä¿ã®éè»¢ãšæç€ºçãªã€ã³ã¿ãŒãã§ãŒã¹ã®ååãåãå ¥ããããšã§ãããå ç¢ã§çè§£ãããããçŸä»£ã®ãœãããŠã§ã¢ç°å¢ã®èŠæ±ãæºããããã®ããè¯ãæºåãã§ããã·ã¹ãã ãäœæã§ããŸãã
ãã®ã¬ã€ãã¯ããããµãŽãã«ã¢ãŒããã¯ãã£ã®ã³ã¢ååããå®è·µçãªå®è£ æŠç¥ãŸã§ãå æ¬çãªæŠèŠãæäŸããŸããããããã®æŠå¿µãããã«æ¢æ±ããç¬èªã®ãããžã§ã¯ãã§é©çšããããšã奚å±ããŸãããããµãŽãã«ã¢ãŒããã¯ãã£ã®åŠç¿ãšæ¡çšãžã®æè³ã¯ãæçµçã«ããé«å質ãªãœãããŠã§ã¢ãšããæºè¶³åºŠã®é«ãéçºããŒã ã«ã€ãªããã§ãããã
æçµçã«ãé©åãªã¢ãŒããã¯ãã£ãéžæããããšã¯ããããžã§ã¯ãã®ç¹å®ã®ããŒãºã«äŸåããŸããæææ±ºå®ãè¡ãéã«ã¯ãè€éãã寿åœãä¿å®æ§ã®èŠä»¶ãèæ ®ããŠãã ããããããµãŽãã«ã¢ãŒããã¯ãã£ã¯ãå ç¢ã§é©å¿æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åºãªåºç€ãæäŸããŸãããããã¯ãœãããŠã§ã¢ã¢ãŒããã¯ãã®ããŒã«ããã¯ã¹ã«ããããŒã«ã®äžã€ã«éããŸããã