[DISCUSSION]Ứng dụng desktop application, những trải nghiệm mới cho người dùng

JackV

Administrator
Staff member
Topic này JackV muốn cùng mọi người trao đổi về vấn đề lập trình để cho người dùng có nhữn trải nghiệm mới, nói cách khác là việc phá cách trong lập trình, thay đổi những mô típ lập trình cổ xưa, ví dụ như Phần mềm quản lý dược phẩm Cộng Đồng Java mình đã sử dụng cách thay đổi các phần tử trong cửa sổ cho việc nhập liệu thay cho việc hiện thị cửa sổ mới cho việc nhập liệu. Còn đối với việc hiện thị nhiều nội dung thì ban đầu mình cũng nghĩ đến dùng jtabbedpane để hiện thị nhưng đó là cách làm quá xưa trong khi chúng ta có thể kết hợp nhiều component khác để làm việc đó mà hiệu năng lại tốt hơn.

Bên cạnh đó thì mình còn thấy nhiều phong cách lập trình cũ vẫn đang tồn tại, ví dụ như gặp lỗi là chương trình hiện thị cái thông báo lỗi rồi chờ người dùng nhấn OK để tắt cửa sổ thông báo, ví dụ như điền form mà cứ điền sai nó lại hiện cái cửa sổ thông báo nhập sai.
==> Bên web thì người ta đã dùng là khi nhập sai thì ở sau nó có một label khác hiện thị hướng dẫn

Hoặc một trường hợp khác ví dụ như một text field thì trước nó luôn một label hiện thị tên trường và trường hợp đặc biệt thì lại có thêm phần yêu cầu, ví dụ "Nickname (3-15 ký tự không chứa khoảng trắng)" làm nó xấu thay vì chỉ có nội dung "Nickname"
==> Ở một số app thì nội dung "3-15 ký tự không chứa khoảng trắng" nằm mờ bên trong textfield

Đó là một số trường hợp và cách cải tiến nhưng chắc chắn là sáng tạo của chúng ta không dừng lại ở đó, theo các bạn thì những trường hợp nào có thể cải tiến như thế nào và chúng ta sẽ làm các demo
 
Sửa lần cuối:

badboy3283

Active Member
20/10/11
295
89
28
District BT, HCM City
Mình sẽ mô tả cách mở rôngg cho phần này bằng mô tả interface, vì mình đã build ok cho web rồi còn swing thì chưa theo nên nhờ jackv mô tả lại
 

badboy3283

Active Member
20/10/11
295
89
28
District BT, HCM City
Đầu tiên tạo Validator Manager, để lưu các phương thức kiểm tra cho từng component

Code:
public interface VM<T extends VMode, C extends Object> {
    /**
     * Validate all {@link VMode}
     *
     * @return
     */
    boolean validate();

    /**
     * @param sb
     *            that error will append to
     * @param vm
     * @return
     */
    boolean validate(StringBuilder sb, T vm);

    /**
     * Add {@link VMode}
     *
     * @param vm
     */
    VM add(T vm);

    /**
     * Clear all {@link VMode}
     */
    void clearAll();

    /**
     * Remove {@link VMode} by ID
     *
     * @param id
     */
    void remove(String id);

    /**
     * Remove {@link VMode} by {@link Component}
     *
     * @param id
     */
    void remove(C component);
}
Kế đến tạo 1 abstract class Validator Model để, 1 model sẽ chứa các cách thức kiểm tra (rổng, ký tự,...)
Mổi model sẽ đại diện cho một component

Nên chứa các biến static, VD:

Code:
public static final int OTHER = 1000;
    /**
     *
     * Check value can't Empty : value = " ", value = StringUtils.EMPTY,
     * value=null
     */
    public static final int EMPTY = 1;

    /**
     *
     * Check value must be email form : abc@xxx.xx
     *
     * Only check with not empty value
     */
    public static final int EMAIL = 2;
    /**
     *
     * Must select an item of combobox
     *
     * With customCombo: must select index > 0
     *
     */
    public static final int SELECT = 3;
    /**
     *
     * Must be a Double value
     *
     * Only check with not empty value
     */
    public static final int NUMBER_ONLY = 4;
    /**
     *
     * Must be an Integer value
     *
     * Only check with not empty value
     */
    public static final int INTEGER_ONLY = 5;
    /**
     *
     * Must be a Long value
     *
     * Only check with not empty value
     */
    public static final int LONG_ONLY = 6;
    /**
     *
     * String have a lenght more than or equal assigned lenght
     *
     * Only check with not empty value
     */
    public static final int MIN_LENGHT = 7;
    /**
     *
     * String have a lenght less than or equal assigned lenght
     *
     * Only check with not empty value
     */
    public static final int MAX_LENGHT = 8;
    /**
     *
     * String have a lenght less than or equal assigned lenght
     *
     * Only check with not empty value
     */
    public static final int EQUAL_LENGHT = 9;
    /**
     *
     * value >= comparing number
     *
     * Only check with not empty value
     */
    public static final int MIN_VALUE = 10;
    /**
     *
     * value <= comparing number
     *
     * Only check with not empty value
     */
    public static final int MAX_VALUE = 11;
    /**
     *
     * value < comparing value
     *
     * Only check with not empty value
     */
    public static final int LESS_THAN = 12;
    /**
     *
     * value > comparing value
     *
     * Only check with not empty value
     */
    public static final int MORE_THAN = 13;
    /**
     *
     * Check String must be have any character: a-z A-Z 0-9 . - _ ( ) and space
     *
     * Only check with not empty value
     */
    public static final int PHONE_FAX = 14;
    /**
     *
     * Check String must be have any character: a-z A-Z 0-9
     *
     * Only check with not empty value
     */
    public static final int STRING_ONLY = 15;
    /**
     *
     * Check String must be have any character: a-z A-Z 0-9 and space
     *
     * Only check with not empty value
     */
    public static final int STRING_WITH_SPACE = 16;
    /**
     *
     * Value.equal(CompareValue) = true
     *
     * Only check with not empty value
     */
    public static final int EQUAL = 17;
    /**
     *
     * String must have only number characters
     *
     * Only check with not empty value
     */
    public static final int STRING_WITH_NUMBER_ONLY = 18;
    /**
     *
     * Check String must be have any character: a-z A-Z 0-9 space and comma (,)
     *
     * Only check with not empty value
     */
    public static final int STRING_WITH_SPACE_COMMA = 19;
    /**
     *
     * value must be of form hex color code
     *
     * Only check with not empty value
     */
    public static final int COLOR_HEX = 20;

    public static final int DATE_NOT_PAST = 21;

    public static final int DATE_NOT_FUTURE = 22;

    public static final int STRING_URL = 23;

    public static final String BUNDLE_EMPTY;
    public static final String BUNDLE_EMAIL;
    public static final String BUNDLE_SELECT;
    public static final String BUNDLE_SELECT_ATLEAST;
    public static final String BUNDLE_NUMBER_ONLY;
    public static final String BUNDLE_INTEGER_ONLY;
    public static final String BUNDLE_LONG_ONLY;
    public static final String BUNDLE_MIN_LENGHT;
    public static final String BUNDLE_MAX_LENGHT;
    public static final String BUNDLE_EQUAL_LENGHT;
    public static final String BUNDLE_MIN_VALUE;
    public static final String BUNDLE_MAX_VALUE;
    public static final String BUNDLE_PHONE_FAX;
    public static final String BUNDLE_STRING_ONLY;
    public static final String BUNDLE_STRING_WITH_SPACE;
    public static final String BUNDLE_STRING_WITH_SPACE_COMMA;
    public static final String BUNDLE_EQUAL;
    public static final String BUNDLE_NOT_EQUAL;
    public static final String BUNDLE_STRING_WITH_NUMBER_ONLY;
    public static final String BUNDLE_EXISTED;
    public static final String BUNDLE_LESS_THAN;
    public static final String BUNDLE_MORE_THAN;
    public static final String BUNDLE_VALUE_INVALID;
    public static final String BUNDLE_COLOR_HEX;
    public static final String BUNDLE_NOT_PAST;
Model sẽ có 3 biến chính:
- Tên đại diện của component dùng để replace vào bundle khi có lổi, VD bundle có dạng: {0} là cần thiết --> name là cần thiết
- Component cần validate
- listValidates: các phương thứ kiểm tra được add vào

Code:
private String name;
private Component comp;
    private Set<ValidatorType> listValidates = new TreeSet<ValidatorType>();
Có 3 phương thức chính:

Code:
    public VMode add(ValidatorType validateType) {
        listValidates.add(validateType);
        return this;
    }

    abstract protected boolean validateForOther(Object value, StringBuilder sb);

    public final boolean validate(Object value, StringBuilder sb) {
        for (ValidatorType type : listValidates) {
            if (!validateForType(value, type, sb)) {
                return false;
            }
        }
        return true;
    }
Với trường hợp validateForOther --> validate trướng hợp khác, có thể dùng anonymous method

Ví dụ:
Code:
vm = new ValidatorModel("msg.user.name", txtUsername) {
            @Override
            protected boolean validateForOther(Object value, StringBuilder sb) {
                if (!checkExisted("username", value, getCurrentPk(),
                        getService())) {
                    setBundleExisted(sb, getLabel());
                    return false;
                }
                return true;
            }
        };
Nến tạo các phương thức đăng ký nhanh, Ví dụ:

Code:
public final VMode regBlank() {
        return add(ValidatorType.EMPTY);
    }

    public final VMode regSelect() {
        return add(ValidatorType.SELECT);
    }

    public final VMode regEmail() {
        return add(ValidatorType.EMAIL);
    }
Khi áp dụng ta sẽ có như sau, lúc đăng ký:

Code:
vm = new ValidatorModel("msg.user.name", txtUsername) {
            @Override
            protected boolean validateForOther(Object value, StringBuilder sb) {
                if (!checkExisted("username", value, getCurrentPk(),
                        getService())) {
                    setBundleExisted(sb, getLabel());
                    return false;
                }
                return true;
            }
        };
        vm.regBlank();
        vmm.add(vm);
        vm = new ValidatorModel("msg.email", txtEmail) {
            @Override
            protected boolean validateForOther(Object value, StringBuilder sb) {
                if (!checkExisted("email", value, getCurrentPk(), getService())) {
                    setBundleExisted(sb, getLabel());
                    return false;
                }

                return true;
            }
        };
        vm.regBlank();
        vm.regEmail();
      vmm.add(vm);
Và cuối cùng

Code:
if(vmm.validate()){
...
}
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,642
309
83
hix, dùng wireframe mô tả thôi, đừng dùng code :((:((:((
 

JackV

Administrator
Staff member
Mình sẽ mô tả cách mở rôngg cho phần này bằng mô tả interface, vì mình đã build ok cho web rồi còn swing thì chưa theo nên nhờ jackv mô tả lại
Cảm ơn bạn @badboy3283 đã tham gia nhưng mình chưa hiểu bạn muốn đóng góp phần cải tiến gì ở đây. Bạn hãy cho một mô tả nhé, lối mòn lập trình xử lý như thế nào và bạn cải tiến gì, đây là nội dung của topic này.
 

badboy3283

Active Member
20/10/11
295
89
28
District BT, HCM City
Hi, JackV!

Đấy là mô tả cách cải tiến phần quản lý validate của mình, gồm có 3 bước:

- Tạo validate
- Validate
- Khi có lổi thì tự format ký tự cho dễ nhìn

Cải tiến: không cần lập lại các bước validate hay dùng, tự động thao tác hiển thị lổi trên component