#10 Kit
To je uplna pravda, ale podla mna zalezi dost od situacie. Skusme si predstavit taky priklad, ze budeme vytvarat noveho uzivatela a zapisovat do db.
class User{
private String username;
private String password;
// gettery a settery
}
interface UICreateUser {
public String askUserForName();
public String askUserForPassword();
// atd ...
}
class UserManager {
private UICreateUser ui;
// DI UICreateUser
public CreateUser(UICreateUser ui) {
this.ui = ui;
}
public User createNewUserFromUI() {
User user = new User();
Storage<User> storage = new Storage<>(User);
try {
// vynimku mozes hodit aj ked uzivatel pouzije
// nepovolene znaky
user.setUsername(ui.askUserForName());
user.setPassword(ui.askUserForPassword());
// ak to niekde hodi vynimku, tak sa to po commit nedostane
storage.commit(); // som si z casti prebehol ako
// funguje hibernate.
} catch (InvalidArgumentException e) {
// log invalid ako INFO
// je dobre mat aspon nejaku evidenciu
// ze nieco bolo zle zadane
}
}
}
Je omnoho pohodlnejsie, ako este riesit ci klikol na cancel, alebo nie. Aj ked uznavam Cancel je normalna reakcia, ale stale je to invalid argument. Dalo by sa to pre pokoj v dusi vyriesit takto:
private Pattern validUsernamePattern = Pattern.compile("\\w+");
public String getNameFromInputDialog() {
String name = JOptionPanel.createInputDialog(this, "Zadajte meno");
if (name == null)
name = "";
// da sa este vyuzit regex aby sa predislo
// nevhodnym uzivatelskym menam
// vyluci sa aj moznost toho, ze je to prazdny String
if (vaildUsernamePattern.matcher(name).matches())
throw new InvalidArgumentException("Invalid username");
return name;
}
Mozno je to mojou slabou predstavivostou, ale ina moznost ako odoslat referenciu na UserManager, ktory by obsahoval metodu cancel, alebo nieco poobne, ma nenapada. A ak by bola honota null, tak by volal cancel().