12 thg 5, 2010

Mô hình MVP

Trong Quá trình xử lí quá trình tách biệt các thành phần xử lí khỏi hệ thống UI là rất cần thiết, tạo ra khả năng xử lí độc lập cho UI.

Việc tách rời dữ liệu khỏi UI sẻ tạo ra được nhiều UI khác nhau cho các cách thể hiện khác nhau.

Code xử lý đặt trong UI gây khó khăn cho việc kiểm tra và gây phức tạp và trùng lập code. Việc kiểm tra các UI thường hoặc phải chạy ứng dụng thủ công hoặc sử dụng kịch bản (script) để thực hiện việc tương tác tự động lên các UI, do đó sẽ tốn nhiều chi phí và thời gian hơn để kiểm tra các xử lý bên trong thành phần này.

Việc tách các xử lý này ra ngoài ra còn tăng tính tái sử dụng code và dễ bảo trì hơn.

Phương pháp để giải quyết là dùng kiến trúc MVC (Model-View-Controller) và một mẫu kiến trúc thừa kế là MVP, hiện được ứng dụng rộng rãi trong môi trường .NET.
Mẫu kiến trúc Model-View-Controller chia nhỏ các thành phần dữ liệu, thể hiện (output) và dữ liệu nhập từ người dùng (input) thành những thành phần riêng biệt.
Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới (business logic). Thành phần model thường được trình bày ở dạng Domain Model.
View là thành phần đảm nhận việc thể hiện những dữ liệu của Model. View bao gồm những gì thể hiện trên màn hình như các control, form... Trên cùng một Model, có thể có nhiều View.
Controller là thành phần đảm nhận việc xử lý đáp trả lại các dữ liệu được đưa vào từ người dùng như các sự kiện chuột, bàn phím, các tương tác lên các control... Controller là cầu nối giữa người dùng và ứng dụng.
Sự phụ thuộc của Model vào các thành phần khác và tại một thời điểm khó xác định điều gì sẽ xảy ra khi đọc code và việc kiểm tra cũng khó khăn hơn.
Kiến trúc MVP dựa trên tư tưởng cơ bản của MVC nhưng với cách tiếp cận khác nhằm khắc phục các hạn chế của MVC cổ điển.

Các thành phần của MVP
Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới.
View là thành phần đảm nhận việc thể hiện những dữ liệu của Model và là tổng hợp của các form, control được sử dụng.
Presenter là thành phần đảm nhận các xử lý thể hiện cũng như tương tác đến dữ liệu bên dưới và có thể tương tác để thay đổi View trong quá trình xử lý.
Phối hợp các thành phần
Mẫu kiến trúc MVP của Microsoft tương tự như Passive View nhưng có bổ sung ràng buộc là Presenter chỉ có thể truy cập đến View thông qua interface IView. Điều này giúp Presenter không phụ thuộc đến cài đặt cụ thể của View và có thể dễ dàng kiểm tra Presenter một cách độc lập.
Mối quan hệ giữa Presenter và Model là quan hệ một chiều (chiều còn lại là gián tiếp). Hệ quả là chúng ta có một mô hình đa lớp như cấu trúc ở trên theo ý nghĩa các thành phần ở một lớp chỉ phụ thuộc và sử dụng các thành phần ở lớp ngay bên dưới nó.
Với MVP, một View gắn liền với một interface IView. Khi View được tạo ra, nó tạo ra một đối tượng private Presenter và gắn nó vào đối tượng này thông qua IView. Khi một sự kiện xảy ra, View bắt lấy và sau đó kích hoạt một phương thức của Presenter mà sau đó có thể tương tác với Model. Một số sự kiện như bắt đầu hiển thị và đóng của View cũng được gửi tới để Presenter kích hoạt một số phương thức tương ứng, điều này giúp cho một số công việc như khởi tạo và giải phóng dữ liệu cho View được dễ dàng hơn. Model được tổ chức bổ sung một lớp Service nằm bên trên để tương tác với Presenter.

11 thg 4, 2010

Exception trong java - Ngoại lệ trong java

1.1 Khái niệm và mục đích sử dụng
Exception là một đối tượng được tạo ra khi chương trình gặp lỗi được java trả về nhằm mục đích dò tìm và sửa lỗi chương trình
1.2 Các kiểu exception
Có ba kiểu exception trong java là checked exception, error và unchecked exception (runtime exception)
Checked exception là loại ngoại lệ phổ biến sử dụng để kiểm tra những lỗi phổ biến trong lúc biên dịch ví dụ bạn truy xuất một tập tin không tồn tại trên ổ đĩa thì bạn sẽ nhận được một java.io.FileNotFoundException. Checked exception kế thừa từ java.lang.Exception và chúng được dùng trong try-catch-finally.
Error là một loại lỗi nằm ngoài phạm vi ứng dụng, được java trả về trong đối tượng java.io.IOError. Ví dụ ứng dụng mở một tập tin thành công nhưng khi đọc dữ liệu lại không đọc được do ổ cứng bị hỏng một vài sector vật lý, …
Unchecked exception thường được hiểu là những exception được sinh ra do lỗi logic khi lập trình và được trả về lúc runtime. Unchecked exception kế thừa từ java.lang.RuntimeException
1.3 Bắt giữ và xử lý các exception
Để xử lý một exception ta dùng lệnh try-catch-finally, throw hoặc throws
Try chứa các dòng lệnh thực hiện một chức năng nào đó mà có thể gây ra exception
Catch chứa các dòng lệnh để xử lý kết quả khi nhận được một exception từ java sau khi khối try tạo ra exception.
Finally các dòng lệnh trong khối này luôn luôn được thưc thi khi thoát khối try
Ví dụ:
int a = 0;
int b = 1;
int c;

try {
c = b/a;
}
catch (ArithmeticException e)
{
System.out.println("Arithmetic Exception");
}
finally {
System.out.println("Finally");
}
Với đoạn code trên ta sẽ có kết quả in ra màn hình là:
Arithmetic Exception
Finally
throws
Ví dụ:
public static int getEndMember(int[] a) throws ArrayIndexOutOfBoundsException {
return a[a.length];
}
public static void main(String[] args) {
int[] a = {1, 2, 3};
try {
getEndMember(a);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException");
}
}
Đoạn code trên sẽ in ra ArrayIndexOutOfBoundsException bởi vì hàm getEndMember đã truy xuất phần tử a[3] không có trong mảng.
throw
Chúng ta cũng có thể dùng throw để quăng ra một exception Object
Ví dụ:
public static int getEndMember(int[] a) throws ArrayIndexOutOfBoundsException {
return a[a.length-1];
}
public static void main(String[] args) {
int[] a = {1, 2, 0};
int j;

try {
int i = getEndMember(a);
if (i == 0) {
throw new ArithmeticException();
}
else{
j = 10/i;
}
}
catch(ArithmeticException e) {
System.out.println("ArithmeticException");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsExceptionkkkk");
}
}
Đoạn code trên sẽ in ra ArithmeticException bởi vì giá trị nhận được i = 0

1.4 Exception tự định nghĩa
Chúng ta có thể tự định nghĩa ra những lớp ngoại lệ riêng nếu chúng ta thấy java cung cấp chưa đủ thông tin ngoại lệ như chúng ta mong muốn.
Ví dụ về cách sử dụng exception tự định nghĩa:
class MyException extends Exception {
MyException() {

}
}

public class ExceptionDemo {
public static void executeHasException() throws MyException {
throw new MyException();
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
executeHasException();
} catch (MyException e) {
e.printStackTrace();
}
}
}
Và kết quả in ra màn hình sẽ là
exception_2.MyException
at exception_2.ExceptionDemo.executeHasException(ExceptionDemo.java:18)
at exception_2.ExceptionDemo.main(ExceptionDemo.java:27)

1.5 Một số exception đơn giản
a. NullPointerException (java.lang)
Xảy ra khi chúng ta tham khảo đến một đối tượng rỗng
Ví dụ:
• Gọi phương thức instance của một đối tượng rỗng
• Truy cập thuộc tính của một đối tượng rỗng
• …
int[] a = null;
int b;

try {
b = a[10];
}
catch (NullPointerException e)
{
System.out.println("NullPointerException"); //In ra NullPointerException
}
Đoạn code trên sinh ra một exception NullPointerException bởi vì đối tượng a là rỗng mà chúng ta vẫn truy cập thuộc tính của nó.

b. NumberFormatException (java.lang)
Một exception cũng khá thường gặp là khi biến đổi string sang số
Ví dụ:
String s = "Luvina";

try {
int i = Integer.parseInt(s);
}
catch (NumberFormatException e)
{
System.out.println("NumberFormatException"); //In ra NumberFormatException
}
Đoạn code trên sẽ xảy ra exception vì chuỗi s không thể biến đổi thành số nguyên i được

c. ArayIndexOutOfBoundsException (java.lang)
Truy xuất phần tử ngoài phạm vi của mảng
int[] a = {1, 2, 3};
int b;

try {
b = a[10];
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("ArrayIndexOutOfBoundsException");
}

d. ArithmeticException (java.lang)
Lỗi do các biểu thức toán học, thường là do chia cho 0
Ví dụ:
int a = 0;
int b = 1;
int c;

try {
c = b/a;
}
catch (ArithmeticException e)
{
System.out.println("Arithmetic Exception");
}