Trắc nghiệm Tin học 11 Cánh diều KHMT bài 11 Thực hành thiết kế và lập trình theo modun
1. Khi một module cần truy cập dữ liệu từ một module khác, việc truyền dữ liệu qua tham số của hàm gọi là gì?
A. Đóng gói.
B. Gắn kết.
C. Khớp nối.
D. Trừu tượng hóa.
2. Trong thiết kế phần mềm, "giao diện rõ ràng" (clear interface) cho một module có ý nghĩa gì đối với các lập trình viên khác?
A. Họ cần phải hiểu toàn bộ mã nguồn của module.
B. Họ biết cách sử dụng module mà không cần biết chi tiết triển khai bên trong.
C. Họ phải sửa đổi giao diện nếu muốn sử dụng module.
D. Họ không cần quan tâm đến module đó.
3. Một ví dụ về hành vi "khớp nối chặt" (tight coupling) giữa hai module là gì?
A. Module A gọi một hàm công khai của Module B.
B. Module A trực tiếp truy cập vào các biến nội bộ của Module B mà không thông qua giao diện.
C. Module A gửi một thông điệp đến Module B và chờ phản hồi.
D. Module A và Module B cùng sử dụng một tệp cấu hình chung.
4. Module trong lập trình là gì?
A. Một tệp tin chứa mã nguồn duy nhất của toàn bộ chương trình.
B. Một đơn vị logic có thể tái sử dụng, thực hiện một tập hợp các chức năng cụ thể.
C. Một biến toàn cục được khai báo trong chương trình.
D. Một hàm dùng để nhập dữ liệu từ người dùng.
5. Nguyên tắc "trừu tượng hóa" (abstraction) trong lập trình module có nghĩa là gì?
A. Tạo ra các lớp kế thừa lẫn nhau.
B. Ẩn đi các chi tiết không cần thiết và chỉ hiển thị các tính năng cốt lõi.
C. Sử dụng các kiểu dữ liệu phức tạp.
D. Tăng cường bảo mật bằng cách mã hóa dữ liệu.
6. Trong Python, tệp `__init__.py` trong một thư mục có ý nghĩa gì?
A. Đánh dấu thư mục đó là một module độc lập.
B. Chứa mã nguồn chính của thư mục.
C. Chỉ định tệp nào sẽ được chạy đầu tiên.
D. Xóa toàn bộ nội dung của thư mục.
7. Một module tốt nên có mức độ "phụ thuộc vào chi tiết" (high dependency on details) với các module khác ở mức độ nào?
A. Rất cao, để các module dễ dàng chia sẻ dữ liệu.
B. Thấp, ưu tiên khớp nối lỏng.
C. Trung bình, để dễ dàng kiểm soát.
D. Không có phụ thuộc nào cả.
8. Trong ngữ cảnh của lập trình module, một "giao diện" (interface) có thể được xem như là:
A. Một tệp thực thi của module.
B. Một hợp đồng quy định các chức năng mà module cung cấp và cách tương tác với nó.
C. Toàn bộ mã nguồn của module.
D. Một tệp cấu hình cho module.
9. Trong lập trình module, việc xác định rõ ràng "giao diện" (interface) của một module là quan trọng vì lý do gì?
A. Để đảm bảo module chỉ làm một việc duy nhất.
B. Để các module khác biết cách tương tác với nó mà không cần biết chi tiết bên trong.
C. Để tăng hiệu suất xử lý của module.
D. Để module có thể tự động biên dịch.
10. Trong lập trình theo module, mục đích chính của việc chia chương trình thành các module độc lập là gì?
A. Tăng tốc độ thực thi của chương trình.
B. Giúp dễ dàng quản lý, bảo trì và tái sử dụng code.
C. Giảm dung lượng bộ nhớ mà chương trình sử dụng.
D. Tăng cường bảo mật cho dữ liệu của chương trình.
11. Nếu bạn muốn tạo một "namespace" riêng cho các hàm liên quan đến xử lý chuỗi trong dự án, bạn nên làm gì?
A. Đặt tên tất cả các biến chuỗi bắt đầu bằng "str_".
B. Tạo một module riêng (ví dụ: `string_utils.py`) chứa các hàm xử lý chuỗi.
C. Sử dụng các hàm có sẵn của ngôn ngữ lập trình mà không cần tổ chức.
D. Chỉ sử dụng các ký tự đặc biệt trong tên hàm.
12. Giả sử bạn có một tệp tên là `math_operations.py` chứa các hàm tính toán. Để sử dụng hàm `add` trong tệp này từ một tệp khác, bạn sẽ làm gì trong Python?
A. Sao chép toàn bộ nội dung của `math_operations.py` vào tệp hiện tại.
B. Sử dụng câu lệnh `import math_operations` và gọi `math_operations.add(a, b)`.
C. Viết lại hàm `add` trong tệp hiện tại.
D. Chỉ cần khai báo tên hàm `add` là đủ.
13. Nếu một module có nhiều hàm, nhưng một module khác chỉ cần sử dụng một hoặc hai hàm đó, cách nhập nào là hiệu quả nhất để tránh làm ô nhiễm không gian tên?
A. Sử dụng `import module_name`.
B. Sử dụng `from module_name import specific_function1, specific_function2`.
C. Sử dụng `from module_name import *`.
D. Không nhập gì cả và viết lại các hàm cần thiết.
14. Nguyên tắc "khớp nối lỏng" (loose coupling) giữa các module có nghĩa là gì?
A. Các module phụ thuộc lẫn nhau rất nhiều.
B. Sự thay đổi trong một module ít có khả năng ảnh hưởng đến các module khác.
C. Các module cần có cùng cấu trúc dữ liệu.
D. Các module phải giao tiếp trực tiếp bằng cách gọi hàm.
15. Khi một module gọi một hàm (function) từ một module khác, điều này thể hiện loại tương tác nào?
A. Đóng gói (Encapsulation).
B. Gắn kết (Cohesion).
C. Khớp nối (Coupling).
D. Trừu tượng hóa (Abstraction).
16. Khi thiết kế một module xử lý dữ liệu người dùng, chức năng nào sau đây nên được đóng gói bên trong module đó?
A. Giao diện người dùng (UI) cho toàn bộ ứng dụng.
B. Các thuật toán xử lý logic nghiệp vụ riêng của module.
C. Cấu hình kết nối cơ sở dữ liệu cho toàn hệ thống.
D. Chức năng hiển thị báo cáo tổng hợp của toàn bộ ứng dụng.
17. Ngôn ngữ lập trình Python hỗ trợ lập trình theo module như thế nào?
A. Chỉ cho phép tạo ra một tệp .py duy nhất cho toàn bộ dự án.
B. Sử dụng cú pháp "import" để đưa các module khác vào sử dụng.
C. Yêu cầu mọi module phải được viết bằng các ngôn ngữ khác nhau.
D. Không hỗ trợ khái niệm module, mọi thứ đều là hàm.
18. Khi thiết kế một module, nguyên tắc "đóng gói" (encapsulation) đề cập đến điều gì?
A. Module đó chỉ có thể được sử dụng bởi một chương trình duy nhất.
B. Ẩn đi các chi tiết triển khai bên trong và chỉ cung cấp giao diện để tương tác.
C. Module phải được biên dịch thành một tệp thực thi riêng biệt.
D. Tất cả các biến trong module phải là biến cục bộ.
19. Khi nào thì việc tạo ra các module riêng biệt là không cần thiết hoặc không hiệu quả?
A. Khi chương trình rất nhỏ, chỉ có vài trăm dòng mã.
B. Khi một module thực hiện quá nhiều chức năng không liên quan.
C. Khi các module có sự phụ thuộc lẫn nhau rất cao.
D. Khi người lập trình không muốn chia sẻ mã nguồn.
20. Độ phức tạp của việc bảo trì phần mềm có mối liên hệ như thế nào với tính module hóa?
A. Module hóa cao làm tăng độ phức tạp bảo trì.
B. Module hóa cao giúp giảm độ phức tạp bảo trì.
C. Không có mối liên hệ nào.
D. Chỉ các module lớn mới ảnh hưởng đến bảo trì.
21. Khả năng tái sử dụng (reusability) của một module có ý nghĩa gì trong phát triển phần mềm?
A. Module đó có thể được sử dụng nhiều lần trong cùng một dự án hoặc các dự án khác nhau mà không cần thay đổi.
B. Module có thể tự động cập nhật khi có phiên bản mới.
C. Module có thể chạy trên mọi hệ điều hành mà không cần biên dịch lại.
D. Module có thể tự động sửa lỗi khi phát hiện ra.
22. Theo nguyên tắc "gắn kết cao" (high cohesion) trong thiết kế module, một module nên tập trung vào việc gì?
A. Thực hiện càng nhiều chức năng càng tốt để giảm số lượng module.
B. Liên kết chặt chẽ với các module khác để chia sẻ dữ liệu.
C. Tập trung vào một nhóm chức năng có liên quan chặt chẽ với nhau.
D. Sử dụng càng ít biến càng tốt để tiết kiệm bộ nhớ.
23. Lập trình theo module giúp ích gì cho quá trình gỡ lỗi (debugging)?
A. Làm cho việc gỡ lỗi trở nên phức tạp hơn do có nhiều tệp.
B. Cho phép cô lập vấn đề vào một module cụ thể, dễ dàng tìm và sửa lỗi.
C. Tự động sửa mọi lỗi trong chương trình.
D. Chỉ cho phép gỡ lỗi ở cấp độ toàn bộ chương trình.
24. Khi bạn sử dụng `from math_operations import add` trong Python, điều gì sẽ xảy ra?
A. Bạn chỉ có thể gọi hàm `add`, không thể gọi các hàm khác trong `math_operations.py`.
B. Bạn có thể gọi trực tiếp `add(a, b)` mà không cần tiền tố tên module.
C. Toàn bộ nội dung của `math_operations.py` sẽ bị xóa.
D. Bạn phải gọi là `math_operations.from_import(add)`.
25. Trong Python, khi bạn nhập một module, điều gì sẽ xảy ra với mã nguồn của module đó?
A. Mã nguồn sẽ được biên dịch thành mã máy và chạy ngay lập tức.
B. Mã nguồn sẽ được thực thi và các định nghĩa (hàm, lớp, biến) sẽ được tải vào bộ nhớ.
C. Chỉ các hàm được gọi sẽ được thực thi, còn lại sẽ bị bỏ qua.
D. Mã nguồn sẽ được lưu trữ dưới dạng tệp thực thi mới.