Một vài câu hỏi về chương trình quản lý sinh viên

Hello mọi người. Em vừa mới học qua C++ và em đang viết chương trình quản lý sinh viên. Em có 1 số thắc mắc mong mọi người giải đáp:
1.

do {
cout << "n = ";
cin >> n;
} while (n < 0);

Khi mình nhập n<0 thì trên console lại hiện dòng "n = " để mình nhập lại. Có cách nào để mình xóa dòng vừa nhập ko ạ?

  1. Khi tạo 1 class thường em thấy mọi người để các thuộc tính bên trong private rồi thông qua các hàm set và get để nhập xuất. Nhưng em đọc được ở 1 số chỗ người ta nói không nên sử dụng hàm set và get. Em xin hỏi ý kiến của mọi người về vấn đề này.

  2. Em thắc mắc là nên dùng mảng hay danh sách liên kết để viết chương trình. Em thấy mảng dễ quản lý hơn nhưng dùng mảng thì số lượng phần tử mảng là cố định. Còn danh sách kiên kết thì em đang gặp khó trong việc lưu và xuất thông tin. Mọi người có cách nào khác không ạ?

Em xin cảm ơn mọi người.

Hi there,

Để tớ thử trả lời thắc mắc của cậu nhé! :smile:

  1. Nếu tớ nhớ không nhầm, cậu cần 1 thư viện để có thể clear screen như vậy.
    Tuy nhiên, thêm thư viện ấy vào sẽ làm cho code của cậu phức tạp một cách không cần thiết, đồng thời, cậu cũng không đạt được nhiều mục đích (trông nó fancy hơn thôi :smile:)
    Vậy nên tớ recommend cậu không nên tốn thời gian vào việc đó :smile:

  2. Getter và Setter là 2 method để truy xuất vào property của một object.
    Nếu xét về quan điểm OOP, đó là một cách tồi để thiết kế chương trình in general, vì:

  • Nó phá vỡ tính bao đóng encapsulation.
    Thường, object sẽ đóng gói dữ liệu, và offer các dịch vụ ra bên ngoài. Nếu cậu để các object khác tùy ý access vào dữ liệu thông qua getter setter, sẽ rất bất lịch sự với object đó (thử tưởng tượng, thay vì gọi method “cho tớ vay tí tiền được không?”, ai đó rút ví của cậu và tự lấy tiền đó làm việc của họ, cậu sẽ thấy sao? :smile: ).
  • Object của cậu mutable (trong TH cậu dùng setter), điều này dẫn tới chương trình của cậu dễ có side effect hơn, in general.

Tuy vậy, cậu hoàn toàn có thể sử dụng getter với setter khi cậu thiết kế các object chứa dữ liệu (entity hoặc value object), vì đó là pattern rồi :smile: Ngoài ra, tớ không khuyến khích cậu sử dụng 2 method này, trừ khi cậu biết mình đang làm gì.

  1. Dùng mảng hay DSLK (danh sách liên kết) sẽ phụ thuộc vào vấn đề của cậu.
    Nếu cậu có một danh sách dữ liệu yêu cầu xóa, chèn vào đầu danh sách thường xuyên, DSLK là tốt nhất. Còn không, in general cậu sẽ thường sử dụng mảng nhiều hơn.

Hope it helps!

4 Likes

Em đa tạ cao nhân đã trợ giúp em. Vậy anh cho em hỏi có phương pháp nào thay thế cho setter và getter không ạ?

Về setter, cậu có thể set thuộc tính lúc khởi tạo object. Gán thuộc tính ở constructor hoặc sử dụng factory method là 2 phương án thường dùng.
Khi cậu cần thay đổi dữ liệu, cậu chỉ cần tạo lại object mới với dữ liệu mới thôi.

Về getter, trừ entity/value object classes, cậu nên thiết kế object đưa ra dịch vụ, thay vì đưa ra dữ liệu/expose nội dung object.
Chẳng hạn, khi cậu cần lưu dữ liệu, và cậu có StudentRepository có connection tới database, thay vì cậu getConnection của StudentRepository và tự mình lưu dữ liệu, cậu chỉ cần để StudentRepository offer dịch vụ saveStudent, và caller chỉ cần gọi tới dịch vụ đó mà không quan tâm cài đặt bên trong của StudentRepository.

Hope it helps!

5 Likes

Em newbie nên không hiểu được các thuật ngữ anh dùng :cry:. Dù sao cũng cảm ơn anh đã giúp đỡ ạ. Em sẽ tìm hiểu thêm.

1 Like

Ohm, sorry cậu nhé.
Nếu cậu còn mới, cậu nên sử dụng getter setter như bình thường. Nó đơn giản và hiệu quả :smile:
Những gì tớ đề cập sẽ có ích cho cậu hơn khi cậu có 1 lượng trải nghiệm nhất định. Hiện giờ thì cậu đừng nên nghe theo tớ vụ setter getter nha :smile:

4 Likes

Vâng em cảm ơn anh nhiều

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?