Thứ Sáu, 5 tháng 7, 2013

Các bước căn bản tạo đối tượng trong java

Tôi xin giới thiệu với các bạn các bước căn bản để tạo 1 lớp trong java nhằn đặc tả 1 đối tượng nào đó.
Tuy nhiên, không phải lúc nào các bước này cũng đúng, nó chỉ đảm bảo trong các lớp đặc tả bình thường, còn các lớp đặc biệt thì bạn có thể “chế biến” nó 1 chút để phù hợp.
Trong bài viết này tôi có 1 ví dụ tạo 1 lớp đặc tả đối tượng Thí sinh dự thi Đại học.

Đầu tiên, bạn phải liệt kê các tính chất cần thiết của đối tượng (tùy ngữ cảnh), ví dụ cũng là nói về con người nhưng đối với đối tượng sinh viên bạn sẽ phải nghĩ đến những thuộc tính như mã số SV, lớp học, kết quả học tập,… còn với việc đặc tả cho 1 bệnh nhân bạn cần phải nghĩ đến những thuộc tính như tiền sử bệnh án,…
Với đối tượng thí sinh của chúng ta, giả sử ta cần quan tâm đến các tính chất: số báo danh, họ tên, điểm thi môn toán, điểm thi môn lý, điểm thi môn hóa.
Bước 1: Tạo 1 lớp biểu diễn cho đối tượng. tên lớp phải đảm bảo ngắn gọn, rõ ràng và dễ hiểu.
Ví dụ







public class Thisinh{
//nội dung của lớp sẽ đề cập tiếp theo
}

Bước 2: Ứng vỗi tính chất của đối tượng, ta khai báo thành 1 data instance trong lớp. 
Theo tính chất Encapsulation của oop, ta khải khai báo các thuộc tính này có visibility modifier là private

Ví dụ







private String soBD;
private String hoTen;
private float diemToan;
private float diemLy;
private float diemHoa;

Bước 3: Ứng với mỗi data instance ở Bước 2, ta tạo các phương thức setters/getters.
Cũng theo tính chất Encapsulation, ta phải làm cho việc thay đổi giá trị của thuộc tính đảm đảo tính toàn vẹn dữ liệu.
Ví dụ:







public String getSoBD() {
return soBD;
}
public void setSoBD(String soBD) throws Exception{
if(soBD.trim().equals(""))
throw new Exception("Số báo danh không thể không có!");
this.soBD = soBD;
}
public String getHoTen() {
return hoTen;
}
public void setHoTen(String hoTen)throws Exception {
if(hoTen.trim().equals(""))
throw new Exception("Họ tên không thể không có!");
this.hoTen = hoTen;
}
public float getDiemToan() {
return diemToan;
}
public void setDiemToan(float diemToan) throws Exception{
if(diemToan10)
throw new Exception("Điểm không hợp lệ");
this.diemToan = diemToan;
}
public float getDiemLy() {
return diemLy;
}
public void setDiemLy(float diemLy) throws Exception{
if(diemLy10)
throw new Exception("Điểm không hợp lệ");
this.diemLy = diemLy;
}
public float getDiemHoa() {
return diemHoa;
}
public void setDiemHoa(float diemHoa) throws Exception{
if(diemHoa10)
throw new Exception("Điểm không hợp lệ");
this.diemHoa = diemHoa;
}

Lưu ý: đối với những thuộc tính mang tính chất chỉ đọc (read-only) ta không định nghĩa phương thức set cho nó. Còn với các phương thức chỉ ghi (write-only) ta không định nghĩa phuog7 thức get cho nó.
Bước 4: Nên tạo 2 hàm constructors cho đối tượng
constructor default: là constructor không có tham số, thường dùng để khởi gán các giá trị mặc định cho đối tượng.
constructor copy: constructor có đầy đủ tham số (số tham số của constructor này bằng với số data instance ta đã khai báo). Constructor này thường dùng để khởi tạo 1 đối tượng đầy đủ.
Ví dụ







public Thisinh() throws Exception{
this("","no-name",0f,0f,0f);
}
public Thisinh(String soBD, String hoTen, float diemToan, float diemLy,
float diemHoa)throws Exception {
setSoBD(soBD);
setHoTen(hoTen);
setDiemToan(diemToan);
setDiemLy(diemLy);
setDiemHoa(diemHoa);
}

Bước 5: Định nghĩa thuộc tính nhận diện (khóa)cho đối tượng bằng cách viết lại (overrid) 2 phương thức equals và hashCode
Các phương thức này rất quan trọng trong việc lập trình sau này, dùng để phân biệt 2 đối tượng.
Trong ví dụ của chúng ta, 2 thí sinh phân biệt với nhau nhờ và thuộc tính số báo danh.







@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((soBD == null) ? 0 : soBD.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Thisinh other = (Thisinh) obj;
if (soBD == null) {
if (other.soBD != null)
return false;
} else if (!soBD.equals(other.soBD))
return false;
return true;
}

Bước 6: Định nghĩa phương thức đặc tả dạng chuỗi của đối tượng (phương thức toString)
Đây là phương thức sẽ được tự động triệu gọi khi chúng ta làm việc với việc kết xuất đối tượng ra màn hình hay lên 1 GUI controls nào đó. Ở đây đơn giả tôi xuất ra họ tên của 1 sinh viên, còn bạn có thể xuất ra bất cứ thứ gì bạn muốn.:-)







@Override
public String toString() {
return hoTen;
}

Bước 7: Viết các business methods của đối tượng.
Đây là bước quan trọng nhất bởi nó định nghĩa tập các dịch vụ của đối tượng cung cấp cho bên ngoài.







/**
* Kiểm tra 1 thí sinh có đậu hay không
* @return true nếu sinh viên có tổng số điểm trên 15 và không
* có điểm nào dưới 3.
*/
public boolean CheckPassed() {
return TongDiem()>15 && diemToan>=3&&diemHoa>=3 && diemLy>=3;
}
/**
* Tổng điểm của thí sinh
* @return: tổng điểm
*/
public float TongDiem() {
return diemHoa+diemLy+diemToan;
}

**Ở đây chúng ta lưu ý về cách ghi chú.




Như vậy chúng ta đã có thể có 1 lớp đặc tả tốt đồi đấy. Chúc các bạn thành công. Sau đây là toàn bộ code của chương trình

 






 

package descript;

 

public class Thisinh {

//Các instatance data

private String soBD;

private String hoTen;

private float diemToan;

private float diemLy;

private float diemHoa;

//=======================================================================

//các phương thức setters/getters

public String getSoBD() {

return soBD;

}

public void setSoBD(String soBD) throws Exception{

if(soBD.trim().equals(“”))

throw new Exception(“Số báo danh không thể không có!”);

this.soBD = soBD;

}

public String getHoTen() {

return hoTen;

}

public void setHoTen(String hoTen)throws Exception {

if(hoTen.trim().equals(“”))

throw new Exception(“Họ tên không thể không có!”);

this.hoTen = hoTen;

}

public float getDiemToan() {

return diemToan;

}

public void setDiemToan(float diemToan) throws Exception{

if(diemToan<0||diemToan>10)

throw new Exception(“Điểm không hợp lệ”);

this.diemToan = diemToan;

}

public float getDiemLy() {

return diemLy;

}

public void setDiemLy(float diemLy) throws Exception{

if(diemLy<0||diemLy>10)

throw new Exception(“Điểm không hợp lệ”);

this.diemLy = diemLy;

}

public float getDiemHoa() {

return diemHoa;

}

public void setDiemHoa(float diemHoa) throws Exception{

if(diemHoa<0||diemHoa>10)

throw new Exception(“Điểm không hợp lệ”);

this.diemHoa = diemHoa;

}

 

//=======================================================================

//constructors

public Thisinh() throws Exception{

this(“”,“no-name”,0f,0f,0f);

}

public Thisinh(String soBD, String hoTen, float diemToan, float diemLy,

float diemHoa)throws Exception {

setSoBD(soBD);

setHoTen(hoTen);

setDiemToan(diemToan);

setDiemLy(diemLy);

setDiemHoa(diemHoa);

}

//=======================================================================

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((soBD == null) ? 0 : soBD.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Thisinh other = (Thisinh) obj;

if (soBD == null) {

if (other.soBD != null)

return false;

else if (!soBD.equals(other.soBD))

return false;

return true;

}

 

//=======================================================================

@Override

public String toString() {

return hoTen;

}

//=======================================================================

//Business methods

/**

* Kiểm tra 1 thí sinh có đậu hay không

@return true nếu sinh viên có tổng số điểm trên 15 và không

* có điểm nào dưới 3.

*/

public boolean CheckPassed() {

return TongDiem()>15 && diemToan>=3&&diemHoa>=3 && diemLy>=3;

}

/**

* Tổng điểm của thí sinh

@return: tổng điểm

*/

public float TongDiem() {

return diemHoa+diemLy+diemToan;

}

}

0 nhận xét:

Đăng nhận xét