Thứ Năm, 26 tháng 1, 2012

OOP - Bài 3: Vay tiền ngân hàng




Center of Excellence, SaigonTech


Bài 3
Vay tiền ngân hàng



Lập trình là một hoạt động thiết kế (design),
không phải là một hoạt động thi công (construction).
-- Einar Landre



I. Bài toán

Để vay được tiền của một ngân hàng với lãi suất đặc biệt thấp, khách hàng phải thỏa mãn hai điều kiện sau:

  • Lương hàng năm (annual salary) phải tối thiểu là 30.000 USD.
  • Phải làm việc cho cơ quan hiện thời tối thiểu là hai năm.

Hãy phát triển chương trình kiểm tra xem một khách hàng có đủ điều kiện để được vay tiền của ngân hàng đó hay không?

Bạn không phải phát triển phần UI, nhưng để hiểu rõ hơn yêu cầu bài toán, bạn có thể tham khảo một UI mẫu dưới đây.

Hình 1



II. Giải pháp

Bước 1. Phát biểu lại yêu cầu bài toán

Kiểm tra điều kiện để được vay tiền ngân hàng
  • Input
    • Lương hàng năm (annual salary)
    • Số năm làm việc cho cơ quan hiện thời (years at current job)
  • Output
    • Đủ điều kiện (true) hoặc không đủ điều kiện (false)

Bước 2. Thiết kế sơ bộ
  • Xác định tên method và tên parameters
Hình 2

  • Thử chuyển parameters thành fields
Hình 3
  • Xác định tên class dựa vào fields và method
    Ta cần trả lời câu hỏi: Đối tượng nào có lương hàng năm và số năm làm việc cho cơ quan hiện thời, rồi từ đó cho biết khách hàng có đủ điều kiện để được vay tiền ngân hàng hay không? Đó chính là một đề nghị vay tiền (loan request).
Hình 4



Bước 3. Xây dựng test cases

Để kiểm tra điều kiện vay tiền có được hay không, ta phải dựa vào giá trị của annualSalaryyearsAtCurrentJobs. Hơn nữa, đề bài còn cho giá trị cụ thể của annualSalary là 30.000 và yearsAtCurrentJob là 2, vậy thì ta cần kiểm tra

  • Ba giá trị của annualSalary, bao gồm: dưới 30.000, bằng 30.000, và trên 30.000
  • Ba giá trị của yearsAtCurrentJob, bao gồm: nhỏ hơn 2, bằng 2, và lớn hơn 2

Tổ hợp các giá trị khác nhau của annualSalaryyearsAtCurrentJob, ta có tổng cộng 3 × 3 = 9 test cases.



qualify()
No
annualSalary
yearsAtCurrentJob
qualify?
1
25_000
1.5
false
2
25_000
2.0
false
3
25_000
2.5
false
4
30_000
1.5
false
5
30_000
2.0
true
6
30_000
2.5
true
7
35_000
1.5
false
8
35_000
2.0
true
9
35_000
2.5
true


Cuối cùng ta bổ sung data types vào thiết kế. Lưu ý rằng trong Java, hai giá trị true (đúng) và false (sai) hợp thành một data type gọi là boolean.

Hình 5



Bước 4: Phát triển test class
  • Project: LoanRequest
  • Package: loanrequest
  • Test class: LoanRequestTest
Do số lượng test cases khá nhiều, ta tạm thời chỉ dùng hai test cases, một cho ra kết quả false và một cho ra kết quả true. Sau này ta sẽ bổ sung đầy đủ ngay sau khi hoàn thành việc phát triển code.

package loanrequest;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;

public class LoanRequestTest {

    @Test
    public void qualify() {
        assertFalse(new LoanRequest(25_000, 1.5).qualify());
        assertTrue(new LoanRequest(30_000, 2.0).qualify());
    }
}



Từ LoanRequestTest, ta tiến hành xây dựng LoanRequestqualify().

package loanrequest;

public class LoanRequest {
    private int annualSalary;
    private double yearsAtCurrentJob;

    public LoanRequest(int annualSalary, double yearsAtCurrentJob) {
        this.annualSalary = annualSalary;
        this.yearsAtCurrentJob = yearsAtCurrentJob;
    }

    public boolean qualify() {
         ???
    }
}



Đến đây ta bắt đầu suy luận nhằm tìm ra giải pháp cho qualify(). Biết rằng qualify() chỉ có thể trả về một trong hai giá trị là true hoặc false, ta triển khai bằng việc dùng cấu trúc điều kiện IF như sau

    public boolean qualify() {
        if (???)
            return true;
        else
            return false;
    }



Tiếp theo, bài toán cho hay rằng một loan request chỉ được chấp nhận nếu thỏa đồng thời hai điều kiện: annual salary phải tối thiểu 30.000 USD và years at current job phải tối thiểu hai năm. Ta viết:

public boolean qualify() {
    if (this.annualSalary >= 30000 && this.yearsAtCurrentJob >= 2.0)
        return true;
    else
        return false;
}



Qualify() method còn có thể viết gọn lại như sau. (Nếu ta không thoải mái với cách viết gọn thì có thể không dùng. Dù sao cũng nên cố gắng làm quen với nó.)

public boolean qualify() {
    return this.annualSalary >= 30000 && this.yearsAtCurrentJob >= 2.0;
}



Ở trên ta đã sử dụng toán tử logic (logical operator) && để kết hợp hai điều kiện lại với nhau. Toán tử (operator) này thể hiện quan hệ logic AND. Trong một chương trình nào đó, nếu muốn thể hiện quan hệ logic OR, ta dùng operator ||, và sử dụng operator ! cho quan hệ logic NOT.

Sau khi thi hành test class để nhận được tín hiệu xanh, ta tiếp tục bổ sung các test cases còn thiếu, rồi kiểm thử test class để xác nhận tín hiệu xanh một lần cuối.

package loanrequest;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;

public class LoanRequestTest {

    @Test
    public void qualify() {
        assertFalse(new LoanRequest(25_000, 1.5).qualify());
        assertFalse(new LoanRequest(25_000, 2.0).qualify());
        assertFalse(new LoanRequest(25_000, 2.5).qualify());

        assertFalse(new LoanRequest(30_000, 1.5).qualify());
        assertTrue(new LoanRequest(30_000, 2.0).qualify());
        assertTrue(new LoanRequest(30_000, 2.5).qualify());

        assertFalse(new LoanRequest(35_000, 1.5).qualify());
        assertTrue(new LoanRequest(35_000, 2.0).qualify());
        assertTrue(new LoanRequest(35_000, 2.5).qualify());
    }
}



III. Tổng kết

Bài viết trình bày cách dùng cấu trúc điều kiện IF, kiểu dữ liệu boolean kết hợp với toán tử so sánh (comparison operator) và toán tử logic (logical comparator) để xác định xem một đề nghị vay tiền có được ngân hàng chấp thuận hay không. Một khi đã quen thuộc với các qui ước mang tính kỹ thuật, ta thấy chương trình hay code chẳng qua là bài viết mạch lạc nhằm hướng dẫn một chiếc computer vô tri thực hiện đúng ý đồ của tác giả.



IV. Tài liệu tham khảo
  1. Gaddis T. (2010) Starting Out with Java From Control Structures Through Objects (4th edition), Pearson Education, Boston. Chương 3.

V. Thuật ngữ tiếng Anh


boolean
kiểu dữ liệu logic, chỉ gồm hai giá trị truefalse
logical operator
toán tử logic

Không có nhận xét nào:

Đăng nhận xét