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?

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

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á :frowning: . 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);
            }
        }
    }
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?