Chào mọi người, mình đang có một class HocSinh
bao gồm các thuộc tính MS; ten; lop
và một lớp là class DanhSachHocSinh
chứa 1 List. Bên lớp HocSinh
mình sẽ tạo các hàm nhập giá trị và bên lớp DanhSachHocSinh
mình sẽ tạo các hàm Load, Save. Và có 1 yêu cầu là khi mình nhập 1 học sinh, sẽ kiểm tra trong danh sách có học sinh nào trùng MS
hay không, nếu có thì sẽ bắt người dùng nhập lại. Cách mình giải quyết trường hợp này lúc đầu là tách hàm nhập thành 2 hàm riêng, 1 hàm thì nhập MS và hàm còn lại là sẽ nhập các thuộc tính còn lại. Sau đó, qua lớp DanhSachHocSinh
mình sẽ gọi hàm nhập MS và lấy giá trị đó để tìm trong List học sinh và gọi hàm nhập còn lại là xong.
Nhưng cách này mình thấy mình phải tạo hoàn toàn hàm nhập trong lớp DanhSachHocSinh
chứ không phải lớp HocSinh
, và mình nghĩ ra thêm 1 cách là thêm 1 biến DanhSachHocSinh danhsachhientai
vào lớp HocSinh
và bên lớp DanhSachHocSinh
mình sẽ gọi hocsinhcanthem.Danhsachhientai=this
, không biết cách này có vi phạm quy tắc nào của lập trình hướng đối tượng không.
Update: Sau khi mình nhập Mã số mình sẽ gọi hàm TimKiemTrung
trong Danhsachhientai để xem có trùng mã số nào ko
Cảm ơn mọi người trước
Truy cập ngược lại đối tượng chứa đối tượng đang khởi tạo có vi phạm quy tắc hướng đối tượng nào ko?
Như vậy là hai class dính quá chặt với nhau. Đề nghị là:
driver: nhập HS -> đưa vào danh sách
danh sách: kiểm tra ID -> raise ex hoặc thêm vào DS
driver: bắt ex và nhập lại HS
3 Likes
Tại lớp HocSinh của mình không chỉ có các thuộc tính đó (có cả SDT không trùng) và còn kiểm tra nhiều ràng buộc nên mình muốn chỉ cần nhập sai thì sẽ báo lỗi và bắt người dùng nhập lại, mình cũng đã thử cách nhập hết ròi mới raise exception, nhưng lúc test oải quá . Mà cái driver bạn nhắc đến là gì vậy ?
Update luôn code hiện tại của mình:
class HocSinh
{
string ms, ten, lop;
public string Ms { get => ms; set => ms = value; }
public string Ten { get => ten; set => ten = value; }
public string Lop { get => lop; set => lop = value; }
public void Nhap()
{
Console.Write("Nhap ten: ");
Ten = Console.ReadLine();
Console.Write("Nhap lop: ");
Lop = Console.ReadLine();
}
public string NhapMS()
{
Console.Write("Nhap MS: ");
Ms = Console.ReadLine();
return Ms;
}
public void XuatHocSinh()
{
Console.Write("MS: "+Ms);
Console.Write("Ten: "+Ten);
Console.Write("Lop: "+Lop);
}
}
class DanhSachHocSinh
{
List<HocSinh> danhSachHocSinh;
bool KiemTraTrungMS(string ms)
{
//if Trung
return true;
//else return fasle;
}
public void NhapMotHocSinh()
{
HocSinh hs = new HocSinh();
string ms = hs.NhapMS();
if(KiemTraTrungMS(ms))
{
//Nhap lai
}
else
{
danhSachHocSinh.Add(hs);
}
}
}