web-dev-qa-db-ja.com

ベストプラクティス:入力検証(Android)

私はAndroidモバイル開発(Android Studioネイティブ開発-新しい知識のため)です。ここで、入力検証のベストプラクティスに関する質問をしたいと思います。入力フォームを作成します。ユーザーがテキストフィールドに間違った入力をしないようにする必要があります。

  1. 1つのJava検証目的のみのファイルを作成できますか?すべての入力フォームは、その1つの検証ファイルのみに移動する必要があります(1つのアプリに多くの入力ページ画面がある場合)。If[〜#〜] yes [〜#〜]、学習研究のためにそのテクニックの例/リンク/チュートリアルを取得するにはどうすればよいですか?[〜#〜] no [〜#〜]、なぜですか?

個人的には、この手法を実装する方法が必要です。そのため、各Javaファイル(クリーンなコードの観点から))に対して同じコードを再利用する必要はありませんでした。残念ながら、そのための例やチュートリアルは見つかりませんでした。間違ったキーワードを検索したり、誤読したりしますが、そのような手法が存在しない場合、入力検証のベストプラクティスは何ですか?

ありがとうございました。

p/s:ベストプラクティスでより良い方法を見つけるためのこのスレッド。ありがとうございました。

14
Salehin Rafi

このJavaクラスはTextWatcherを実装して、編集テキストを「監視」し、テキストに加えられた変更を監視します。

public abstract class TextValidator implements TextWatcher {
    private final TextView textView;

    public TextValidator(TextView textView) {
        this.textView = textView;
    }

    public abstract void validate(TextView textView, String text);

    @Override
    final public void afterTextChanged(Editable s) {
        String text = textView.getText().toString();
        validate(textView, text);
    }

    @Override
    final public void 
    beforeTextChanged(CharSequence s, int start, int count, int after) {
         /* Needs to be implemented, but we are not using it. */ 
    }

    @Override
    final public void 
    onTextChanged(CharSequence s, int start, int before, int count) { 
         /* Needs to be implemented, but we are not using it. */    
    }
}

EditTextで、そのテキストウォッチャーをそのリスナーに設定できます。

editText.addTextChangedListener(new TextValidator(editText) {
    @Override public void validate(TextView textView, String text) {
       /* Insert your validation rules here */
    }
});
15

(私が使用している)1つのアプローチは、次のような入力を検証するためのヘルパーを用意することです。

  1. 無効(または空)
  2. 日付
  3. パスワード
  4. メール
  5. 数値
  6. その他

validationHelperクラスからの抜粋です。

public class InputValidatorHelper {
    public boolean isValidEmail(String string){
        final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
        Pattern pattern = Pattern.compile(EMAIL_PATTERN);
        Matcher matcher = pattern.matcher(string);
        return matcher.matches();
    }

    public boolean isValidPassword(String string, boolean allowSpecialChars){
        String PATTERN;
        if(allowSpecialChars){
            //PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})";
            PATTERN = "^[a-zA-Z@#$%]\\w{5,19}$";
        }else{
            //PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,20})";
            PATTERN = "^[a-zA-Z]\\w{5,19}$";
        }



        Pattern pattern = Pattern.compile(PATTERN);
        Matcher matcher = pattern.matcher(string);
        return matcher.matches();
    }

    public boolean isNullOrEmpty(String string){
        return TextUtils.isEmpty(string);
    }

    public boolean isNumeric(String string){
        return TextUtils.isDigitsOnly(string);
    }

    //Add more validators here if necessary
}

このクラスの使用方法は次のとおりです。

InputValidatorHelper inputValidatorHelper = new InputValidatorHelper();
StringBuilder errMsg = new StringBuilder("Unable to save. Please fix the following errors and try again.\n");
//Validate and Save
boolean allowSave = true;
if (user.getEmail() == null && !inputValidatorHelper.isValidEmail(user_email)) {
    errMsg.append("- Invalid email address.\n");
    allowSave = false;
}

if (inputValidatorHelper.isNullOrEmpty(user_first_name)) {
    errMsg.append("- First name should not be empty.\n");
    allowSave = false;
}

if(allowSave){
    //Proceed with your save logic here
}

EditText#addTextChangedListenerを介して接続されているTextWatcherを使用して、検証を呼び出すことができます。

例:

txtName.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        //Do nothing
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        validate();
    }
});
6
PinoyCoder