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à methodTa 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 annualSalary
và yearsAtCurrentJobs.
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 annualSalary
và yearsAtCurrentJob,
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 LoanRequest
và qualify().
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
- 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ị true và
false
|
logical
operator
|
toán
tử logic
|
Không có nhận xét nào:
Đăng nhận xét