[Cánh diều] Trắc nghiệm Tin học 11 KHMT bài 11 Thực hành thiết kế và lập trình theo modun
1. Khi một module A gọi một hàm trong module B, và module B lại gọi một hàm trong module A, mối quan hệ này được gọi là gì?
A. Tight coupling.
B. Circular dependency (phụ thuộc vòng tròn).
C. High cohesion.
D. Low coupling.
2. Trong một dự án lớn, việc phân công công việc cho các nhóm lập trình viên khác nhau dựa trên các module là một ứng dụng của nguyên tắc nào?
A. Chỉ tập trung vào code.
B. Phân rã công việc (Work Breakdown Structure) và hợp tác.
C. Viết code càng nhanh càng tốt.
D. Sử dụng các thư viện có sẵn.
3. Trong quá trình thiết kế và lập trình theo module, khi nào chúng ta nên xem xét việc tạo ra một module mới?
A. Khi một module hiện tại trở nên quá lớn và khó quản lý.
B. Khi một chức năng cụ thể có thể được tách ra và tái sử dụng độc lập.
C. Khi phát hiện sự trùng lặp mã nguồn ở nhiều nơi.
D. Tất cả các trường hợp trên đều là lý do hợp lý để tạo module mới.
4. Nếu một module có low cohesion, điều này có nghĩa là gì?
A. Các thành phần bên trong module có mối liên hệ chặt chẽ với nhau.
B. Các chức năng trong module không liên quan hoặc liên quan yếu ớt.
C. Module này rất dễ tái sử dụng.
D. Module này có giao diện đơn giản và rõ ràng.
5. Yếu tố nào sau đây KHÔNG phải là lợi ích của việc lập trình theo module?
A. Dễ dàng sửa đổi và nâng cấp chương trình.
B. Tăng khả năng tái sử dụng mã nguồn.
C. Giảm thời gian phát triển tổng thể.
D. Tăng cường sự phụ thuộc lẫn nhau giữa các thành phần chương trình.
6. Module nào sau đây có khả năng cao nhất là một module được thiết kế kém về cohesion?
A. Module DatabaseConnector chỉ chứa các hàm kết nối, truy vấn, đóng kết nối CSDL.
B. Module UserAuthentication chứa các hàm đăng nhập, đăng xuất, kiểm tra quyền.
C. Module Utilities chứa các hàm tính toán số học, xử lý ngày tháng, định dạng tiền tệ và tạo báo cáo.
D. Module FileHandler chứa các hàm đọc, ghi, xóa file.
7. Nếu module A cần gọi một hàm từ module B, và hàm đó yêu cầu một đối số là một cấu trúc dữ liệu phức tạp do module B định nghĩa, điều này có thể dẫn đến tăng coupling ở mức độ nào?
A. Rất thấp, vì module A không cần biết chi tiết cấu trúc dữ liệu.
B. Cao, vì module A cần hiểu hoặc phụ thuộc vào định nghĩa cấu trúc dữ liệu của module B.
C. Không ảnh hưởng đến coupling.
D. Chỉ ảnh hưởng đến cohesion của module A.
8. Theo quan điểm của lập trình theo module, tại sao việc sử dụng các tham số (parameters) cho hàm trong một module lại quan trọng?
A. Để làm cho tên hàm trở nên phức tạp hơn.
B. Để cho phép hàm nhận dữ liệu đầu vào từ bên ngoài, tăng tính linh hoạt và khả năng tái sử dụng.
C. Để ẩn giấu logic của hàm.
D. Để đảm bảo hàm luôn trả về cùng một giá trị.
9. Trong lập trình hướng đối tượng, một class (lớp) có thể được xem như một dạng của module. Nguyên tắc encapsulation (đóng gói) trong lớp áp dụng cho điều gì?
A. Chỉ các phương thức (methods) của lớp.
B. Chỉ các thuộc tính (attributes) của lớp.
C. Kết hợp cả thuộc tính (dữ liệu) và phương thức (hành động) để thao tác với dữ liệu đó.
D. Tất cả các lớp trong chương trình.
10. Khi thiết kế một module xử lý dữ liệu, việc tách biệt hoàn toàn logic xử lý dữ liệu với logic hiển thị (ví dụ: hiển thị ra màn hình) là một ví dụ của việc áp dụng nguyên tắc nào?
A. Low coupling.
B. High cohesion.
C. Separation of concerns (Tách biệt mối quan tâm).
D. Abstraction.
11. Một module được thiết kế tốt với high cohesion và low coupling sẽ có đặc điểm nào sau đây?
A. Khó hiểu, khó sửa đổi và phụ thuộc nhiều vào module khác.
B. Dễ hiểu, dễ bảo trì, dễ dàng thay thế hoặc tái sử dụng.
C. Chỉ có thể sử dụng trong một dự án cụ thể.
D. Chứa nhiều chức năng không liên quan đến nhau.
12. Quan hệ sử dụng (uses) giữa hai module A và B có nghĩa là gì?
A. Module A được kế thừa từ module B.
B. Module A gọi hoặc sử dụng các chức năng hoặc dữ liệu từ module B.
C. Module A và module B có cùng mục đích.
D. Module A phụ thuộc hoàn toàn vào module B để hoạt động.
13. Việc sử dụng lại một module đã được phát triển cho dự án này trong một dự án khác có thể thực hiện được nếu module đó?
A. Có quá nhiều phụ thuộc vào các module cụ thể của dự án ban đầu.
B. Được thiết kế với tính đóng gói cao, giao diện rõ ràng và ít phụ thuộc bên ngoài.
C. Chứa các biến cục bộ mà không có giao diện rõ ràng.
D. Có số lượng dòng code rất lớn.
14. Trong quá trình thiết kế module, việc xác định interface (giao diện) của module là để làm gì?
A. Quyết định tên biến bên trong module.
B. Xác định cách thức mà các module khác có thể tương tác với module đó.
C. Tối ưu hóa việc sử dụng bộ nhớ.
D. Kiểm tra lỗi cú pháp trong module.
15. Một module có high cohesion sẽ có lợi ích gì trong quá trình phát triển phần mềm?
A. Tăng cường sự phụ thuộc giữa các module khác nhau.
B. Giúp module dễ hiểu, dễ bảo trì và dễ kiểm thử hơn.
C. Yêu cầu ít tài nguyên hệ thống hơn.
D. Cho phép module thực hiện nhiều chức năng không liên quan.
16. Khi thực hành lập trình theo module, việc kiểm thử (testing) các module riêng lẻ trước khi tích hợp chúng vào chương trình lớn hơn được gọi là gì?
A. Kiểm thử tích hợp (Integration Testing).
B. Kiểm thử hệ thống (System Testing).
C. Kiểm thử đơn vị (Unit Testing).
D. Kiểm thử hồi quy (Regression Testing).
17. Khi thiết kế một module, yếu tố nào sau đây là quan trọng nhất để đảm bảo tính độc lập và khả năng tái sử dụng?
A. Sử dụng nhiều biến toàn cục để dễ truy cập dữ liệu.
B. Đóng gói chặt chẽ dữ liệu và các hàm thao tác với dữ liệu đó (encapsulation).
C. Mỗi module chỉ thực hiện một chức năng đơn giản nhất có thể.
D. Sử dụng tên biến và hàm dễ đọc, nhưng không cần quan tâm đến logic bên trong.
18. Để giảm thiểu coupling giữa các module, lập trình viên nên ưu tiên hình thức giao tiếp nào?
A. Truy cập trực tiếp vào biến dữ liệu của module khác.
B. Sử dụng các hàm hoặc phương thức được định nghĩa rõ ràng trong giao diện của module.
C. Gửi toàn bộ cấu trúc dữ liệu phức tạp giữa các module.
D. Dựa vào thứ tự gọi hàm giữa các module.
19. Trong quá trình thiết kế module, nếu một module có quá nhiều trách nhiệm khác nhau, nó có thể vi phạm nguyên tắc nào?
A. Low coupling.
B. High cohesion.
C. Encapsulation.
D. Abstraction.
20. Nguyên tắc coupling (kết nối) trong thiết kế module đề cập đến điều gì?
A. Mức độ mà các thành phần bên trong một module phụ thuộc lẫn nhau.
B. Mức độ mà các module khác nhau phụ thuộc lẫn nhau.
C. Khả năng dễ dàng thay đổi nội bộ của module.
D. Tính rõ ràng của giao diện giữa các module.
21. Trong lập trình theo module, mục đích chính của việc chia một chương trình lớn thành các module nhỏ hơn là gì?
A. Tăng tốc độ thực thi của chương trình.
B. Giảm dung lượng bộ nhớ cần thiết.
C. Tăng tính tái sử dụng, dễ quản lý và bảo trì.
D. Giảm số lượng dòng code.
22. Theo nguyên tắc cohesion (gắn kết) trong thiết kế module, một module nên tập trung vào việc thực hiện bao nhiêu chức năng?
A. Càng nhiều chức năng càng tốt để tiết kiệm code.
B. Chỉ một chức năng hoặc một nhóm các chức năng có liên quan chặt chẽ.
C. Chỉ các chức năng liên quan đến giao diện người dùng.
D. Các chức năng có thể khác nhau nhưng đều liên quan đến dữ liệu đầu vào.
23. Để một module có thể tái sử dụng một cách hiệu quả, nó nên có ít phụ thuộc với môi trường bên ngoài, trừ những gì được định nghĩa trong?
A. Các biến toàn cục của hệ thống.
B. Giao diện (interface) được định nghĩa rõ ràng.
C. Các hàm ẩn bên trong các module khác.
D. Cấu trúc thư mục dự án.
24. Khi một module cần truy cập thông tin từ một module khác, cách tiếp cận nào sau đây tạo ra sự phụ thuộc lỏng lẻo (loose coupling)?
A. Module A truyền trực tiếp địa chỉ bộ nhớ của một biến trong module B cho module C.
B. Module A yêu cầu module B cung cấp dữ liệu thông qua một hàm được định nghĩa trong giao diện của module B.
C. Module A đọc trực tiếp từ file cấu hình mà module B ghi dữ liệu vào.
D. Module A gửi một thông điệp (message) không rõ định dạng cho module B.
25. Giả sử bạn có một module XuLyChuoi chứa các hàm như cat_chuoi, tim_kiem_chuoi, thay_the_chuoi. Module này có cohesion ở mức độ nào?
A. Low cohesion vì các hàm thực hiện các thao tác khác nhau.
B. High cohesion vì tất cả các hàm đều liên quan đến xử lý chuỗi.
C. Medium cohesion vì có cả cắt và tìm kiếm.
D. Rất low cohesion vì không có hàm nào dùng lại kết quả của hàm khác.