tài liệu ôn thi cuối kì phương pháp luận lâp trình

50 650 0
tài liệu ôn thi cuối kì phương pháp luận lâp trình

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đề cương ôn thi phương pháp luận lập trình đại học công nghệ thông tin và truyền thông Thái Nguyên full ngân hàng :v CHƯƠNG 1 LỊCH SỬ HÌNH THÀNH VÀ PHÁT TRIỂN CỦA LẬP TRÌNH1.1 Kỹ thuật lập trình giai đoạn thứ nhất của MTĐT Lập trình, hay nói chính xác hơn là học lập trình là một công việc nặng nhọc, năng xuất thấp. Có thể nói năng xuất lập trình đứng cuối bảng so với các hoạt động trí tuệ khác. Cho đến nay, năng xuất của lập trình viên chỉ dao động trong khoảng 45 lệnhngày. Một sản phẩm phần mềm có thể được thiết kế và cài đặt trong khoảng 6 tháng với 3 lao động chính. Nhưng để kiểm tra và tiếp tục tìm lỗi, hoàn thiện sản phẩm đó phải mất thêm chừng 3 năm. Hiện tượng này là phổ biến trong tin học, người ta khắc phục nó bằng một mẹo nhỏ có tính chất thương mại như sau: Thay vì sửa sản phẩm, người ta công bố bản sửa đó dưới dạng một phiên bản mới. Ví dụ: Ta thấy hệ điều hành DOS 4.0, chỉ tồn tại một thời gian ngắn được thay bẳng DOS 5.0, . ..............................tương tự cho hệ điều hành Window..... Trong thời kỳ đầu của tin học, khoảng những năm 50, người ta lập trình bằng các ngôn ngữ bậc thấp. o Việc nạp và theo dõi hoạt động của chương trình một cách trực tiếp theo chế độ trực tuyến (online), tìm diệt lỗi (debugging) như ta hay làm ngày nay là không thể được. o => Lập trình viên ngày xưa làm việc thận trọng hơn ngày nay rất nhiều. Trước những năm 60, người ta coi lập trình như một hoạt động nghệ thuật, nhuốm màu sắc tài nghệ cá nhân hơn là khoa học. Một người nắm được một ngôn ngữ lập trình và một số mẹo vặt tận dụng cấu hình phần cứng cụ thể của máy tính có thể được xem là chuyên gia nắm bắt được những bí mật của “nghệ thuật lập trình”.1.2Cuộc khủng hoảng PM những năm 60Những năm 60 đã bùng nổ “ cuộc khủng hoảng về đảm bảo phần mềm” được đặc trưngbởi hai hiện tượng sau đây:Chi phí cho tin học quá lớn, trong đó chi phí cho phần mềm chiếm tỉ lệ cao và ngày càng tăng so với chi phí cho kỹ thuật tin học (phần cứng).oNăm 1965 tổng chi phí cho tin học trên Thế giới chiếm 250 tỉ Franc.oRất nhiều đề án lớn nhằm ứng dụng tin học bị thất bại liên tiếp. Nguyên nhân thất bại chủ yếu là do phần đảm bảo sản phẩmĐể giải quyết những vướng mắc trong kỹ thuật lập trình, các nhà tin học lý thuyết đã đi sâu vào nghiên cứu, tìm hiểu bản chất của ngôn ngữ, thuật toán và các hoạt động lập trình và nâng nội dung của nó lên thành nguyên lý khoa học.Các kết quả nghiên cứu điển hình như:+ Dijkstra trong nghiên cứu của mình đã chỉ ra rằng: “động thái của chương trình có thể được đánh giá một cách tường minh qua các cấu trúc lặp, rẽ nhành, gọi đề quy...” và rằng ”... tay nghề của lập trình viên tỷ lệ nghịch với toán tử goto mà anh ta viết trong chương trình”+ Gues trong bài báo của mình đã phân tích sâu sắc nguyên nhân dẫn đên tình trọng trong lập trình dùng goto bừa bãi sẽ biến chương trình thành một mớ rối rắm như món mì sợi.+ Gries phê phán trong các trường đại học, người ta dạy ngôn ngữ lập trình chứ không dạy kỹ thuật lập trình, người ta dạy các mẹo để lập trình chứ không quan tâm đến các nguyên lý phương pháp luận lập trình.1.3Những tư tưởng cách mạng trong lập trìnhTính cách mạng của những quan điểm khoa học nẩy nở trong giai đoạn này thể hiện ởnhững điểm sau đây:oChương trình máy tính và lập trình viên trở thành đối tượng nghiên cứu của lý thuyết lập trìnhoVấn đề cơ bản đặt ra đối với lý thuyết lập trình là “làm thế nào có thể làm chủ được sự phức tạp của hoạt động lập trình”.Do trí tuệ của từng cá nhân lập trình viên là có hạn mà các vấn để thực tiễn cần giải quyết bằng các công cụ tin học là lớn và phức tạp. Vấn đề đặt ra là liệu có thể phân bài toán lớn thành những bài toán nhỏ có độ phức tạp thấp để giải riêng, sau đó tổng hợp kết quả lại được không ?Các kết quả nghiên cứu đạt được:+ Năm 1969, Hoere phát biểu các tiên đề phục vụ cho việc chứng minh tính đúng đắn của chương trình và phát hiện tính chất bất biến của vòng lặp. Sau đó Dijkstra và Hoere đã phát triển ngôn ngữ lập trình có cấu trúc.+ Để triển khai được các nguyên lý lập trình Wirth đã thiết kế và cài đặt ngôn ngữ ALGOL W – một biến thể của ALGOL – 60. Sau này ALGOL W tiếp tục được hoàn thiện để trở thành ngôn ngữ lập trình Pascal. Đây là ngôn ngữ giản dị, trong sáng về cú pháp, dễ minh họa các tư tưởng của lập trình hiện đại => Rất phù hợp trong giảng dạy.+ Năm 1978, Kernighan và Ritchie đã thiết kế ra ngôn ngữ lập trình C.Cuộc cách mạng lập trình diễn ra những năm 60 – 70 đem lại cho chúng ta những nhận thức sau đây:oLập trình là một trong những lĩnh vực khó nhất của toán học ứng dụng. Có thể coi lập trình như một khoa học nhằm đề xuất các nguyên lý và phương pháp nâng cao hiệu xuất lao động cho lập trình viên. Năng xuất ở đây cần định hướng trước hết đến:Tính đúng đắn của chương trìnhTính dễ đọc, dễ hiểu, dễ thực hiện của chương trìnhTính dễ sửa đổi của chương trìnhTận dụng tối đa khả năng của thiết bị mà vẫn không phụ thuộc vào thiết bị.oTóm lại: Kỹ thuật lập trình hay ở mức độ rộng hơn là CNPM nhằm hướng đến mục tiêu cuối cùng là “Sử dụng tối ưu sự phối hợp giữa người và máy”.oNgười ta chỉ kiểm soát được tính đúng đắn của một đối tượng nào đó nếu nó được kiến trúc một cách đơn giản và trong sáng.Lập trình viên phải thoát khỏi những ràng buôc cụ thể về văn phạm của ngôn ngữ lập trình, phải diễn đạt một cách trong sáng và đúng đắn các chỉ thị (chứ không phải biết bao nhiêu ngôn ngữ) – đây là tiêu chuẩn số 1.Trong lập trình, một số lập trình viên mới hay bị cột chặt vào những ngôn ngữ lập trình cụ thể. Thực chất của quá trình lập trình là “người ta không lập trình trên một ngôn ngữ cụ thể mà lập trình hướng đến nó”1.4Triển khai chương trình theo sắc thái công nghệ

CHƯƠNG LỊCH SỬ HÌNH THÀNH VÀ PHÁT TRIỂN CỦA LẬP TRÌNH 1.1 Kỹ thuật lập trình giai đoạn thứ MTĐT Lập trình, hay nói xác học lập trình công việc nặng nhọc, xuất thấp Có thể nói xuất lập trình đứng cuối bảng so với hoạt động trí tuệ khác Cho đến nay, xuất lập trình viên dao động khoảng 4-5 lệnh/ngày Một sản phẩm phần mềm thiết kế cài đặt khoảng tháng với lao động Nhưng để kiểm tra tiếp tục tìm lỗi, hoàn thiện sản phẩm phải thêm chừng năm Hiện tượng phổ biến tin học, người ta khắc phục mẹo nhỏ có tính chất thương mại sau: Thay sửa sản phẩm, người ta công bố sửa dạng phiên Ví dụ: Ta thấy hệ điều hành DOS 4.0, tồn thời gian ngắn thay bẳng DOS 5.0, tương tự cho hệ điều hành Window Trong thời kỳ đầu tin học, khoảng năm 50, người ta lập trình ngôn ngữ bậc thấp o Việc nạp theo dõi hoạt động chương trình cách trực chế độ trực tuyến (on-line), tìm & diệt lỗi (debugging) ta hay làm ngày o => Lập trình viên làm việc thận trọng ngày nhiều Trước năm 60, người ta coi lập trình hoạt động nghệ thuật, nhuốm màu sắc tài nghệ cá nhân khoa học Một người nắm ngôn ngữ lập trình số mẹo vặt tận dụng cấu hình phần cứng cụ thể máy tính xem chuyên gia nắm bắt bí mật “nghệ thuật lập trình” 1.2 Cuộc khủng hoảng PM năm 60 Những năm 60 bùng nổ “ khủng hoảng đảm bảo phần mềm” đặc trưng hai tượng sau đây: - - Chi phí cho tin học lớn, chi phí cho phần mềm chiếm tỉ lệ cao ngày tăng so với chi phí cho kỹ thuật tin học (phần cứng) o Năm 1965 tổng chi phí cho tin học Thế giới chiếm 250 tỉ Franc o Rất nhiều đề án lớn nhằm ứng dụng tin học bị thất bại liên tiếp Nguyên nhân thất bại chủ yếu phần đảm bảo sản phẩm Để giải vướng mắc kỹ thuật lập trình, nhà tin học lý thuyết sâu vào nghiên cứu, tìm hiểu chất ngôn ngữ, thuật toán hoạt động lập trình nâng nội dung lên thành nguyên lý khoa học Các kết nghiên cứu điển hình như: + Dijkstra nghiên cứu rằng: “động thái chương trình đánh giá cách tường minh qua cấu trúc lặp, rẽ nhành, gọi đề quy ” ” tay nghề lập trình viên tỷ lệ nghịch với toán tử goto mà viết chương trình” + Gues báo phân tích sâu sắc nguyên nhân dẫn đên tình trọng lập trình dùng goto bừa bãi biến chương trình thành mớ rối rắm mì sợi + Gries phê phán trường đại học, người ta dạy ngôn ngữ lập trình không dạy kỹ thuật lập trình, người ta dạy mẹo để lập trình không quan tâm đến nguyên lý & phương pháp luận lập trình 1.3 Những tư tưởng cách mạng lập trình Tính cách mạng quan điểm khoa học nẩy nở giai đoạn thể điểm sau đây: o Chương trình máy tính lập trình viên trở thành đối tượng nghiên cứu lý thuyết lập trình o Vấn đề đặt lý thuyết lập trình “làm làm chủ phức tạp hoạt động lập trình” Do trí tuệ cá nhân lập trình viên có hạn mà vấn để thực tiễn cần giải công cụ tin học lớn phức tạp Vấn đề đặt liệu phân toán lớn thành toán nhỏ có độ phức tạp thấp để giải riêng, sau tổng hợp kết lại không ? Các kết nghiên cứu đạt được: + Năm 1969, Hoere phát biểu tiên đề phục vụ cho việc chứng minh tính đắn chương trình phát tính chất bất biến vòng lặp Sau Dijkstra Hoere phát triển ngôn ngữ lập trình có cấu trúc + Để triển khai nguyên lý lập trình Wirth thiết kế cài đặt ngôn ngữ ALGOL W – biến thể ALGOL – 60 Sau ALGOL W tiếp tục hoàn thiện để trở thành ngôn ngữ lập trình Pascal Đây ngôn ngữ giản dị, sáng cú pháp, dễ minh họa tư tưởng lập trình đại => Rất phù hợp giảng dạy + Năm 1978, Kernighan Ritchie thiết kế ngôn ngữ lập trình C Cuộc cách mạng lập trình diễn năm 60 – 70 đem lại cho nhận thức sau đây: o Lập trình lĩnh vực khó toán học ứng dụng Có thể coi lập trình khoa học nhằm đề xuất nguyên lý phương pháp nâng cao hiệu xuất lao động cho lập trình viên Năng xuất cần định hướng trước hết đến:  Tính đắn chương trình  Tính dễ đọc, dễ hiểu, dễ thực chương trình  Tính dễ sửa đổi chương trình  Tận dụng tối đa khả thiết bị mà không phụ thuộc vào thiết bị o Tóm lại: Kỹ thuật lập trình hay mức độ rộng CNPM nhằm hướng đến mục tiêu cuối “Sử dụng tối ưu phối hợp người máy” o Người ta kiểm soát tính đắn đối tượng kiến trúc cách đơn giản sáng  Lập trình viên phải thoát khỏi ràng buôc cụ thể văn phạm ngôn ngữ lập trình, phải diễn đạt cách sáng đắn thị (chứ biết ngôn ngữ) – tiêu chuẩn số  Trong lập trình, số lập trình viên hay bị cột chặt vào ngôn ngữ lập trình cụ thể Thực chất trình lập trình “người ta không lập trình ngôn ngữ cụ thể mà lập trình hướng đến nó” 1.4 Triển khai chương trình theo sắc thái công nghệ Công nghệ sản xuất sản phẩm phần mềm thường bao gồm giai đoạn sau: Tìm hiểu nhu cầu khách hàng Đây bước hình thành nên toán Xác định chức cần có sản phẩm Chia nhỏ chức thành nhóm độc lập tương Mỗi nhóm ứng với phần hợp thành sản phẩm Ví dụ: Để sản xuất hộp bia, người ta phân chia công nghệ thành giai đoạn (nhóm chức năng) sau đây: a b c d e f g Chuẩn bị nguyên liệu Lên men Làm hộp Ướp hương liệu Đóng hộp Đóng thùng Nhập kho Chú ý rằng, công đoạn bao gồm nhiều chức khác nhỏ Ví dụ: + Công đoạn a) chuẩn bị nguyên liệu bao gồm:  Chuẩn bị lúa đại mạch,  Chuấn bị hoa bia, + Công đoạn c) làm hộp gồm:  Cắt nhôm,  Dập hộp,  In nhãn Giao việc thiết kế sản xuất sản phần sản phẩm cho người nhóm người Các nhóm triển khai công việc: Thực bước thiết kế, sản xuất, thử nghiệm Trong trình này, nhóm thường xuyên liên hệ với nhằm hạn chế tối đa công việc trùng lặp đảm bảo tính tương thích ghép nối phận Ghép nối phận/chi tiết thành phẩm Thử nghiệm sản phẩm, sửa cần Bán giao lô sản phẩm cho khách hàng Thu thập thông tin phản hồi từ phía người sử dụng Quyết định sửa lại sản phẩm, cải tiến hủy bỏ việc sản xuất sản phẩm Trên quy trình sản xuất sản phẩm nói chung Nhóm làm phần mềm thực ngần nhiệm vụ giai đoạn tương ứng Trong nhóm cách chuyên viên cho nhiệm vụ - - Phân tích viên + lãnh đạo nhóm: Đảm nhận nhiệm vụ từ 1- o Sản phẩm thu sau giai đoạn phần đầu hồ sơ phần mềm gồm:  Các đặc tả yêu cầu  Các đặc tả chức phần mềm module tương ứng Giai đoạn 5: Dành cho nhóm triển khai công việc o Các nhóm trưởng lại tiếp tục phát triển hồ sơ = cách bổ sung thêm đặc tả chi tiết, tinh chế dần bước nhận chương trình viết ngôn ngữ lập trình cụ thể o Các lập trình viên tham gia vào việc:  Phân tích nhiệm vụ  Đặc tả khối chức nhóm mình, đặc tả tốt giao nhiệm vụ mã hóa cho máy tính  Mã hóa:  Chuyển biểu diễn thuật toán từ dạng đặc tả sang dạng mã nguồn (sử dụng ngôn ngữ lập trình cụ thể)  Khi mã hóa nên tận dụng quỹ thuật toán quỹ chương trình: o Vì thời gian giao nộp sản phẩm hạn hẹp, nên tìm sử dụng lại mô đun, thủ tục thuật toán có sẵn o Để thực điều dễ, đòi hỏi ý thức trách nhiệm cao thành viên tập thể Ở đây, nguyên tắc “mình người, người mình” coi đắc dụng Khi viết phần mềm đó, dù nhỏ, bạn có ý thức viết cho nhiều người dùng Có ý thức đó, lợi bạn thận trọng cho sản phẩm mình, bạn thực đóng góp quan trọng vào quỹ thuật toán quỹ chương trình, mà đó, bạn có quyền khai thác sản phẩm trí tuệ người khác o Có thể nói, lĩnh vực người phung phí chất xám nhiều tin học Với xuất thảm hại 4-5 lệnh/ngày, người ta làm hàng vạn, hàng triệu module, chương trình, hệ thống để thực công việc  Trao đổi với nhóm khác để:  nhận thủ tục dùng chung  thông hiểu lẫn nhau: o Muốn hiểu biết tốt nên:  Dùng thứ ngôn ngữ đặc tả, nhằm mô tả yếu tố sau chương trình:  Input, output, CHƯƠNG CÁC PHƯƠNG PHÁP LUẬN LẬP TRÌNH 2.2 Phương pháp luận Phương pháp luận cách tiếp cận để giải vấn đề Phương pháp luận lập trình cách tiếp cận để viết chương trình (theo quan điểm lý thuyết) Theo quan điểm kỹ thuật, phương pháp luận lập trình gọi kỹ thuật lập trình [1] 2.3 Các phương pháp triển khai chương trình 2.3.1 Triển khai chương trình từ xuống từ lên Khi vận dụng nguyên lý phân mức toán theo cấp độ trừu tượng hóa, làm quen với hai cách tiếp cận từ xuống từ lên Cách tiếp cận thứ (Top – Down) tác giải ngôn ngữ Pascal đề xuất vào thập kỷ 70 đặt tên làm mịn dần Điều quan trọng trình làm mịn dần/hay xác dần chương trình phải tiến hành đồng thời với xác hóa liệu Cận tiếp cận giúp ta xuất phát từ máy giải trừu tượng dần đến máy giải cụ thể trang bị ngôn ngữ lập trình cụ thể Cách tiếp cận thứ (Bottom - up) xuất phát từ viên gạch để thiết kế móng, tầng, tầng nhận kiến trúc hoàn chỉnh (ví dụ vận dụng giáo dục, đào tạo) Các tiếp cận thường vận dụng trường hợp chiến lược giải toán chưa nghiên cứu Quá trình trừu tượng hóa chia làm nhiều mức Mỗi mức nói chung xác định công cụ: Ngôn ngữ Cấu trúc liệu Các thao tác Máy giải Trong đó: + Ngôn ngữ: công cụ dùng để mô tả CTDL thao tác cần thiết Ngôn ngữ mức trừu tượng mức ngôn ngữ tự nhiên ngôn ngữ tự nhiên có cấu trúc (phi hình thức bán hình thức) + Máy giải: Ở mức cao, máy giải máy trừu tượng (máy giả định) Càng mức mức độ trừu tượng cao theo nguyên tắc “thấy chưa quan trọng thấy rùng” Quá trình trừu tượng hóa xác dần mịn dần mức nhận chương trình hoàn chỉnh viết ngôn ngữ lập trình cụ thể để chạy ngôn ngữ cụ thể Ví dụ: Triển khai chương trình Phanso.Pas (minh họa nguyên lý phân mức toán theo cấp độ trừu tượng hóa Mục đích cuối ta thu chương trình Pacal tên PHANSO.PAS chạy máy tính IBM XT/AT a) Với ngôn ngữ Pascal Ta sử dụng phương pháp triển khai chương trình từ – lên: bottom - up ): Phương pháp từ – lên (Bottom – up Method) Đi từ chung đến riêng, từ đối tượng thành phần mức thấp lên đối tượng mức cao, từ đơn vị biết, lắp ráp thành đơn vị b) Với ngôn ngữ C Ta áp dụng phương pháp triển khai chương trình từ xuống: Phương pháp từ – xuống (Top - down Method) Đi từ chung đến riêng, từ kết luận đến biết, từ tổng thể đến đơn vị Đây phương pháp dùng rộng rãi trình thiết kế cài đặt chương trình Hai phương pháp xuống lên thực tiễn dùng cách túy Tùy theo kinh nghiệm lập trình viên, hai phương pháp thường trộn lẫn với nhau, sử dụng đồng thời theo tỷ lệ 2.3.2 Làm mịn dần (tinh chế dần bước) Như nói, phương pháp triển khai chương trình bước làm mịn dần (successive refinements) Wirth đề xuất tiền thân phương pháp thiết kế chương trình từ – xuống (top – down design) Ta biết, năm 1956, Chuyên gia tâm lý học George Miller rằng: Tại thời điểm, có khả tập trung vào khoảng vấn đề khó khăn cần giải ( chunk) Phát biểu gọi luật Miller (Miller’s Law) [Miller, 1956] Tuy nhiên, vấn đề cần giải lại chia thành nhiều vần đề cần giải quyết, để hạn chế lượng thông tin/các vấn đề giải thời điểm ta sử dụng kỹ thuật “tinh chế bước” –“ stepwise refinement” [2] Tinh chế bước kỹ thuật giải vấn đề định nghĩa công cụ để cắt tỉa định chi tiết đến giai đoạn sau để tập trung vào vấn đề quan trọng/các vấn đề Như luật Miller đưa ra, thời điểm ta tập trung giải khoảng khó khăn Tinh chế bước vận dụng nhiều kỹ thuật kỹ nghệ phần mềm như, kỹ thuật phân tích, thiết kế, cài đặt, kiểm thử tích hợp 2.4 Các phương pháp luận lập trình Phương pháp luận là? Phương pháp luận cách tiếp cận để giải vấn đề Phương pháp luận lập trình cách tiếp cận để viết chương trình (theo quan điểm lý thuyết) Theo quan điểm kỹ thuật, phương pháp luận lập trình gọi kỹ thuật lập trình [1] Các mô hình lập trình liệt kê bảng sau: Phương thức lập trình Lập trình hướng thiết bị - Gear Oriented Programming Lập trình hướng công tắc- Switch Oriented Programming Lập trình hướng thủ tục – Procedural/structured Programming Lập trình hướng đối tượng – Object Oriented Programming Mệnh lệnh Khai báo Lập trình hướng lát cắt – Aspect Oriented Programming Lập trình hướng cấu phần – Component Oriented Programming Lập trình hướng dịch vụ - Service Oriented Programming Điện toán đám mây – Clound Computing Lập trình logic – Logic Programming Lập trình hàm – Functional Programming Lập trình CSDL – Database Programming Các phương pháp luận lập trình 2.4.2 Lập trình hướng thiết bị Lập trình để thay đổi thiết bị, khớp chuyển động Qua cử động vật lý thiết bị giới hạn thiết bị này, tính toán thực Phương thức lập trình thường sử dụng lĩnh vực điều khiển tự động Thiết bị không thiết phải máy tính Phương thức lập trình đòi hỏi lập trình viên phải có khả vật lý tốt phải có trí tuệ Có thể dùng phương thức lập trình việc xây dựng phần mềm ứng dụng nhúng 2.4.3 Lập trình hướng công tắc Máy tính điện tử ENIAC (Electronic Numerical Integrator And Computer), đời năm 1942 Lập trình máy tính có nghĩa điều chỉnh công tắc lắp ráp lại toàn hệ thống Ngôn ngữ lập trình ngôn ngữ máy (machine language) Chương trình hoàn toàn phụ thuộc vào kiến trúc phần cứng máy tính quy ước khắt khe nhà chế tạo phần cứng Để giảm nhẹ khó khăn cho hoạt động lập trình từ năm 1950, ngôn ngữ hợp dịch/hợp ngữ (Assembly) gọi ngôn ngữ biểu tượng (Symbolic) đời Trong hợp ngữ, mã lệnh địa toán hạng thay từ tiếng anh gợi nhớ Else *xp=d[k ] 70 *x+=*xp; Nguyên tắc 9: Tính sáng sủa biểu thức “Diến đạt biểu thức cho rõ nghĩa nhất, tránh mã nguồn bí hiểm” Năng lực sáng tạo vô tận lập trình viên dùng để viết mã nguồn ngắn có thể, để tìm cách thông minh để đạt mục đích Tuy nhiên kỹ áp dụng sai chỗ; mục tiêu viết mã nguồn cho sáng sủa, dễ hiểu viết mã để thể tài khéo léo Ví dụ: xét xem phép tính sau thực gì? Subkey =Subkey>>(bitoff – ((bitoff>>3)> (bitoff&0x7), Subkey >>=bitoff&0x7; Biểu thức ngắn gọn dễ hiểu nhiều Nguyên tắc 10: “Đặt tên cho số tối nghĩa” Số tối nghĩa số kích thước mảng, vị trí ký tự, hệ số chuyển đổi giá trị số khác xuất chương trình Về nguyên tắc chung, tất giá trị số trừ xem tối nghĩa nên đặt tên cho Một số mã nguồn cho biết tầm quan trọng xuất xứ Điều xem tối nghĩa làm cho chương trình trở nên khó hiểu khó sửa đổi Ví dụ: Chiếu chương trình để minh họa - Cách đặt tên cho số tối nghĩa để làm chương trình dễ hiểu 71 - Sự tiện lợi việc sửa chương trình đặt tên cho số tối nghĩa Nguyên tắc 11: “Dùng số dạng ký tự, không dùng dạng nguyên làm việc với biến ký tự” Ví dụ: Xét phép toán kiểm tra điều kiện sau: If (c>=65 && c=’A’&& c50 phát biểu Nếu hơn, lớn cần hỏi ý kiến người quản lý “Các lệnh if không lồng mức” “Nên tránh sử dụng phát biểu goto, goto dược sử dụng để xử lý lỗi – nên tối thiểu dùng” Mục đích chuẩn mã hóa tăng tính dễ dùng cho hoạt động bảo trì, làm tăng chất lượng phần mềm, mục đích kỹ nghệ phần mềm 3.4 Các lỗi phát sinh trình thiết kế cài đặt sản phẩm phầm mềm Ta đơn giản hóa trình thiết kế cài đặt sản phẩm phần mềm theo tiến trình gồm giai đoạn (còn giai đoạn khác kiểm sửa, vận hành, bảo trì, tạm thời bỏ qua): Phân tích yêu cầu: thu thập, tìm hiểu nhu cầu, hình thành toán Thiết kế chức năng: Xác định chức cần có sản phẩm+chia nhỏ chức Đặc tả thao tác sở Cài đặt chức năng: Mã hóa đặc tả mức thấp Khớp nối đơn thể Ta xét loại lỗi nẩy sinh tiến trình thiêt kế cài đặt sản phẩm phầm mềm mục sau 3.4.1 Ý đồ thiết kế sai Đây loại lỗi chiến lược, loại lỗi nặng, ta khoản tiền lớn với lao động trí tuệ lớn Nó dẫn nhóm đến tình trạng thất bại Kết mà tập thể làm ròng rã nhiều năm tháng lại chẳng dùng vào việc Tuy nhiên cần lưu ý đến lời bàn sau: Nếu ý đồ thiết kế sai, thân thiết kế chuẩn mực nhóm thiết kế nhóm giỏi Họ nhiều dịp để thi thố tài Trong phát triển phần mềm, lỗi liên quan đến việc lựa chọn sai quy trình phát triển phần mềm (~ quy trình thiết kế sai mục đích, hệ thông sai mục đích: dự án 122, ) 3.4.2 Phân tích yêu cầu không đầy đủ lệnh lạc (xảy giai đoạn 1) 73 Cần lưu ý rằng, người đặt hàng tin học nên họ phát biểu xác đầy đủ yêu cầu họ Chúng ta không đủ hiểu biết địa bàn đối tượng mà ta định áp dụng tin học Do đó, ta thu thập đầy đủ xác thông tin đối tượng Đây mâu thuẫn trình thiết kế, thường xảy giai đoạn Ví dụ: Xét toán phân số, lỗi thuộc loại là: Người lập trình diễn đạt xác khái niệm phân số, ví dụ chia phân số Bản thân ta chưa đụng chạm tới phép toán phần số 3.4.3 Hiểu sai chức Lỗi thường xảy giai đoạn Hiểu sai chức dẫn đến đặc tả chức sai Ví dụ: Trong toán phân số: - - Ta không định nghĩa xác phân số Ví dụ coi -2/-3, 2/-3 phân số Thực dấu – không với mẫu số gây nhiều rắc rối thực phép toán Khi làm việc với phân số, bỏ qua toán tử tạo lập phân số => vi phạm nguyên lý đối tượng Nguyên lý đối tượng “Khi thao tác đối tượng nào, trước hết phải phát sinh nó” - Không rút gọn phân số kết Quan niệm chia phân số giống nhân nghịch đảo mà quên không xét tử số = Điều đặc biệt học phổ thông, ta hiểu thuộc quy tắc thực phép toán phân số Nhưng đặt bút mô tả chúng, ta lại quên điểm Đó nội dung nguyên lý gián đoạn Nguyên lý gián đoạn “Người lập trình ý thức thường trực việc dùng tri thức khoa học mà họ có sẵn” 70 3.4.4 Lỗi đối tượng chịu tải Thường xảy giai đoạn Đây lỗi nằm thủ tục/thao tác mức thấp, có mặt phận hợp thành hầu hết thủ tục khác Đây lỗi nặng Ví dụ 1: Tưởng tượng rằng, seri bóng bán dẫn sai quy cách dây chuyền sản xuất có trục trặc Các bóng bán dẫn lại dùng để lắp ráp thành thiết bị điện tử đủ loại đài thu thanh, máy ghi âm, Ti vi, Đồng hồ, => Hậu loại lỗi rõ ràng lớn Ví dụ 2: Xét toán phân số Cộng Trừ Nhân BCNN Chia Rút gọn UCLN Mod Cả phép toán Cộng, trừ, nhân, chia gọi thủ tục rút gọn Rút gọn thủ tục chịu tải, sai đặc tả/cài đặt phép toán phân số sai Tiếp tục triển khai phép toán BCNN, Rút gọn, thủ tục gọi thủ tục UCLN, UCLN thủ tục chụi tải mức thấp hơn, lỗi nặng lỗi thủ tục rút gọn UCLN lại gọi thủ tục lấy phần dư Mod Mod thủ tục chịu tải mức thấp Thủ tục BCNN dùng cho hai phép toán Cộng, trừ thông qua thủ tục quy đồng mẫu số (qđms) => Mức chịu tải BCNN thiết kế nhỏ mức chịu tải thủ tục UCLN, Rút gọi Mod Càng xuống, mức chụi tải lớn, lỗi phát sinh mức xem nặng mức Chúng ta cần nắm vững nguyên lý mức độ lỗi 71 Nguyên lý mức độ lỗi “Lỗi nặng nằm mức cao (ý đồ thiết kế) mức thấp (thủ tục có mức chịu tải lớn nhất)” Nguyên lý mức độ lỗi đạo tập trung ý xây dựng mục đích thiết kế & triển khai đặc tả cài đặt thao tác mức thấp 3.4.5 Lỗi lây lan Lỗi lây lan lỗi truyền từ chương trình sang chương trình khác Lỗi định nghĩa sau: Giả sử ta có chương trình A B A chứa lỗi E, B không chứa lỗi E Nếu đến thời điểm B nhiễm E cách trực tiếp gián tiếp từ A ta nói E lỗi nây lan E đoạn chương trình người ta cố lập cài sẵn vào chương trình (vào A chẳng hạn), tìm cách truyền cho chương trình lành khác Từ cách nhìn ta thấy, visus (chương trình v) thường có hai thành phần: v=(T, E) Trong đó: - T: chế (thủ tục) truyền bệnh, thường truyền v sang tệp chương trình lành khác E: Lỗi gặp phải Nghiên cứu Visus máy tính vấn đề hay Ta không sâu vào chế visus mà dành vấn đề cho nhà visus học 3.4.6 Lỗi cú pháp Những lỗi phân tích (trừ lỗi visus gây ra) lỗi thực (Run Errors) Các chương trình viết mặt cú pháp, tức với quy định văn phạm cấu trúc ngôn ngữ Ngoài loại lỗi trên, có loại lỗi lỗi cú pháp Nói chung lỗi cú pháp chương trình dịch phát thông báo theo nguyên lý an toàn Nguyên lý an toàn “Mọi lỗi, dù nhỏ, phải phát bước chương trình Việc phát lỗi phải thực trước lỗi hoành hành” Để tìm sửa lỗi cú pháp chương trình mình, lập trình viên phải đọc 72 hiểu thông báo lỗi (thường viết ngôn ngữ Tiếng Anh) Cũng cần lưu ý: Do độ phức tạp chương trình nên lỗi cách tường minh chỗ xuất Loại lỗi thường xảy giai đoạn 3.4.7 Hiệu ứng phụ (Side Effect) Đây tượng xảy đơn vị chương trình/module làm thay đổi giá trị biến ý muốn lập trình viên 3.5 Một số vấn đề cải tiến hiệu xuất chương trình Ta quan tâm đến vấn đề giảm thời gian chạy chi phí nhớ cho chương trình Để minh họa cho luận nêu, ta vấn đề cần quan tâm thông qua ví dụ minh họa 3.5.1 Tốc độ xử lý Trong hầu hết trường hợp, tốc độ chương trình quan trọng, đặc biệt với ứng dụng thời gian thực, ứng dụng xử lý CSDL lớn, Để ứng dụng có tốc độ xử lý nhanh, người lập trình phải quan tâm tới yếu tố như: - Thuật toán sử dụng, Lựa chọn CTDL, Tinh chế mã, a.Thuật toán sử dụng * Xác định toán Trước bắt tay vào giải toán, cần tìm hiểu kỹ yêu cầu mà toán đặt tận dụng điều biết từ toán Ví dụ: Cho mảng gồm 1.000.000 phần tử, giá trị nằm khoảng từ 110 cách ngẫu nhiên Hãy xếp để mảng có thứ tự giảm dần Ta thấy, toán trên, theo cách giải tổng quát toán xếp Do đó, ta sử dụng thuật toán xếp xếp chèn, lựa chọn, xếp nhanh, để giải, độ phức tạp cách giải O(n2) O(nlogn) thuật toán xếp nhanh Tuy nhiên, ta bỏ qua tính chất toán giá trị nằm khoảng từ  10 cách ngẫu nhiên Sau nghiên cứu toán, tận dụng thêm điều biết từ toán, ta định sử dụng thuật toán đếm để xếp toán sau; 73 - Khởi tạo mảng gồm 10 biến nguyên với giá trị (i = 10) - Thực rải trị cho mảng 10 biến nguyên ứng với số lần giá trị biến i sau: Với giá trị i mảng ban đầu cho (gồm 1.000.000 phần tử), tăng giá trị ô nhớ i lên đơn vị => Như vậy, chi phí độ phức tạp toán O(n) * Sức mạnh thuật toán: Lựa chọn thuật toán phù hợp Việc nghiên cứu thuật toán hữu ích, chúng có ảnh hưởng quan trọng đến hệ thống phần mềm đặc biệt chúng giúp tăng tốc độ vận hành hệ thống Ví dụ: xét toán Quay mảng chiều chứa N phần tử bên trái I vị trí Các thuật toán sử dụng là: Thuật toán 1: - Sao I phần tử mảng sang mảng tạm Dịch chuyển N-I phần tử cuối mảng bên phải I vị trí Sao I phần tử mảng tạm vào cuối mảng  Với I N lớn, mảng tạm tốn nhớ Xét trường hợp nhớ không rào giải nào? Thuật toán 2: - Viết thủ tục quay mảng X sang trái vị trí => giải vấn đề nhớ cần dùng biến phụ Thực thủ tục I lần  Tốn thời gian tỷ lệ với N Thời gian thực O(I*N) Thuật toán 3: Để ý rằng, quay phần tử X gồm N phần tử sang trái I vị trí, Phần tử X[I+1] phần tử X’[1] Phần tử X[2I+1] phần tử X’[I+1] Và tiếp tục b.Lựa chọn CTDL Song song với thuật toán, việc lựa chọn CTDL ảnh hưởng lớn đến hiệu xuất chương trình tác động đến thân thuật toán CTDL thuật toán gắn bó mật thiết với 74 Việc lựa chọn đắn CTDL có tác dụng: - Làm giảm không gian nhớ; - Giảm thời gian chạy; - Tăng tính khả chuyển dễ bảo trì chương trình Kỹ thuật đặt lính canh: Nếu đặt trước giá trị đầu cuối (mảng, tệp) để làm ranh giới cho việc tìm kiếm Giá trị lính canh thường làm cho vòng lặp tinh giảm sảng sủa - Với phương án 3, ta cần thời gian T3 = 3n+2 cho vòng lặp: o vòng for: n1+n = 2n+1 o vòng while: n1=n+1  Đây thuật toán đòi hỏi thời gian tuyến tính cỡ n Thay thế, ta chịu tốn miền nhớ cho mảng b Tuy nhiên tính toán nhỏ đây, ta thấy tốn không đáng kể: Trong hầu hết máy tính, lưu trữ số nguyên cần byte = 16 bit, lưu trữ giá trị logic chương trình dịch tốt, cần bit Như vậy, để có phương án ta cần dành miền nhớ = 1/16 a để tổ chức mảng b Bảo toàn độ phức tạp? Thêm miền nhớ, thêm thời gian ngược lại tiết kiệm miền nhớ thông qua việc tăng thời gian tính toán Đây nguyên lý hay định luật = > không nên định hướng theo cách ? Có thể bỏ mảng b mà vần giữ nguyên thời gian tính toán chăng? Câu trả lời Bạn đọc suy nghĩ để tìm lời giải Gợi ý: Lấy a đóng vai trò mảng b Ta tìm hiểu chi tiết việc lựa chọn CTDL xét không gian nhớ chương trình c.Tinh chế mã Thông thường để tăng tính hiệu chương trình, người ta thường bàn cách tiếp cận bậc cao như: - Định nghĩa toán; Kiến trúc hệ thống; Thiết kế thuật toán; Chọn lựa CTDL Tuy nhiên, cách tiếp cận bậc thấp thường thực phần “tốn 75 – điểm nóng” chương trình để cải tiến hiệu xuất Mặc dù phương pháp lúc cần thiết đôi lúc tạo khác biệt lớn hiệu xuất chương trình Khi thực tinh chế mã, cần xác định đâu “điểm nóng” chương trình tập trung vào điểm nóng Có nhiều phương pháp để cài tiến hiệu xuất chương trình, dùng phương pháp sau cùng, phương pháp dùng để giảm không gian chiếm chương trình “điểm nóng” đoạn mã chiếm phần lớn thời gian chạy chương trình Một số kỹ thuật tinh chế mã sau: Tập hợp biểu thức chung: Một phép tính tốn nhiều thời gian xuất nhiều lần, thực lần lưu lại kết Thay phép tính chạy chậm phép tính chạy nhanh hơn: Thường thay phép nhân thành phép cộng/phép dịch bit Khử hay loại bỏ vòng lặp: Nếu thân vòng lặp không dài nhiều bước lặp, hiệu viết rõ Lưu lại giá trị thường dùng, tránh tính lại Sử dụng cấp phát nhớ đặc biệt: Trong chương trình thường có nhiều lệnh cấp phát ô nhớ (cùng kích thước) toán tử new/mallocc => chiếm phần lớn thời gian chạy Nên cấp phát lần đủ số ô nhớ cần thiết, nên dùng lại ô nhớ vừa cấp phát Viết lại ngôn ngữ cấp thấp hơn: Chương trình tăng tốc nhiều dùng đoạn mã lệnh có tính chất phụ thuộc phần cứng Tuy nhiên cần cân nhắc cách phá hủy linh động chương trình làm cho việc bảo trì, sửa chữa tương lai trở nên khó khăn nhiều 3.5.2 Không gian nhớ Trong ngày đầu ngành kỹ thuật máy tính, nhà lập trình bị hạn chế nhiều nhớ máy tính nhỏ Ngày vần đề không điểm nóng Tuy vậy, thiết kế chương trình lúc ta có đủ nhớ để sử dụng nhiều lý khác a Không gian liệu Các nguyên tắc để làm giảm không gian lưu trữ liệu là: 76 - Đảm bảo tính đơn giản liệu - Trong số trường hợp, đừng lưu trữ, tính lại cần thiết - Nén liệu sau giải nén cần dùng - Sử dụng nguyên tắc cấp phát nhớ động - Dùng kiểu liệu có kích thước nhỏ Ví dụ: Xét toán Trên đồ chứa 2000 điểm (bản đồ quân sự) đánh số từ -> 2000 Một vị trí đồ xác định cặp tọa độ (x,y) với x số nguyên nằm khoảng 200, y số nguyên nằm khoảng từ 150 Chương trình dùng cặp (x,y) để xác định điểm chọn 2000 điểm cho b Không gian chương trình Trong số chương trình, đôi lúc kích thước thân vấn đề Hãy định nghĩa chương trình con, sử dụng thông dịch chuyên dụng để làm chương trình đơn giản, sáng rõ ràng hơn, dễ bảo trì 3.6 Case Tools hỗ trợ cài đặt Các CASE tools hỗ trợ hỗ trợ cho việc cài đặt thực thể mã (code artifacts, gọi thành phần/component) như: - Các công cụ quản lý phiên bản, tích hợp, Các công cụ xây dựng (build Tools), Các công cụ quản lý cấu hình (Configuration management Tools), cần thiết Các workbenches điều khiển cấu hình bán thị trường như: - PVCS & Source Safe Công cụ điều khiển cấu hình mã nguồn mở thông dụng CVS Sự tích hợp workbenches tạo thành môi trường/Environments 3.7 Các ngôn ngữ lập trình hệ thứ Máy tính trình thông dịch, trình biên dịch Chúng lập trình theo mã nhị phân cứng hóa với mạch cắm trực tiếp 77 vào máy tính 78 Mã máy ngôn ngữ hệ thứ Ngôn ngữ khó sử dụng, đòi hỏi người lập trình phải hiểu biết sâu phần cứng máy tính Các ngôn ngữ hệ thứ Assembler, phát triển sau năm 1940 trước năm 1950s Nhìn chung thị Assembler chuyển dịch thành thị mã máy Mã nguồn Assembler có chiều dài tương tự mã máy Ngôn ngữ dễ sử dụng ngôn ngữ máy, hướng đến cú pháp ngôn ngữ tự nhiên Ngôn ngữ hệ thứ (hoặc ngôn ngữ mức cao) C, C++, Pascal, Java, Mỗi thị ngôn ngữ bậc cao dịch thành 5/10 thị máy Chiều dài mã ngôn ngữ mức cao ngắn mã Assembler tương ứng Các ngôn ngữ bậc đơn giản hơn, dễ hiểu dễ bảo trì so với ngôn ngữ hệ trước Sau năm 1970, mục tiêu việc thiết kế ngôn ngữ hệ (4 GL) phát biểu GL tương ứng với 30 -> 50 thị mã máy Các sản phẩm viết = GL Focus/Natural ngắn hơn, dễ phát triển dễ bảo trì Đặc biệt, nhiều ngôn ngữ GL ngôn ngữ phi thủ tục (nonprocedural) Ví dụ, xét đoạn mã sau: For every survegor If rating is excellent Add 500$ to salary Trình biên dịch GL dịch thị phi thủ tục thành chuỗi thị mã máy mà thực cách có thủ tục GL hỗ trợ CASE Workbenches & Environments mạnh mẽ Các Workbenches Environments có điểm mạnh yếu, không tránh khỏi việc đưa số lượng lớn CASE vào với mức độ thục thấp Các thất bại GL thường gắn với CASE Environment từ mục đích GL Các GL gồm DB2, Oracle, PowerBuilder, Nhiểu tổ chức sử dụng GL năm cảm nhận lợi ích mà GL mang lại vượt xa so với chi phí Mục tiêu thứ GL hướng người dùng vào công việc lập trình bảo trì sản phẩm phần mềm (end – user programming) 79 60 [...]... đắn của chương trình Ví dụ: Triển khai chương trình phân số đã đề cập ở phần 2.3.1 Phương pháp này ra đời cùng với sự ra đời của các ngôn ngữ lập trình bậc cao như: Pascal, C, Basic, hỗ trợ cho phương pháp này Tính cấu trúc của phương pháp và của ngôn ngữ thể hiện ở cấu trúc điều khiển, cấu trúc dữ liệu và cấu trúc của chương trình Định lý (Boehm C., Jacopini G., 1966) Với mọi chương trình viết dưới... 2.4.12 Lập trình CSDL Trong lập trình CSDL, chương trình bao gồm một tập các khai báo truy xuất đến CSDL để trích rút ra các thông tin Ví dụ: Xét chương trinh Select From Where Critia Các ngôn ngữ hỗ trợ cho phương pháp lập trình này như SQL, SQL Server, CHƯƠNG 3 PHONG CÁCH LẬP TRÌNH, GỠ RỐI VÀ TỐI ƯU CHƯƠNG TRÌNH 3.1 Phong cách lập trình Phong cách lập trình bao hàm một triết lý về lập trình, nhấn... trình tốt phải có các chú thích sau: - - Có một chú thích ở đầu chương trình, tên file giải thích công việc mà chương trình làm Ví dụ: Chiếu chương trình minh họa một chương trình tốt, một chương trình tồi Chú thích trong chương trình Người lập trình cần lưu vết các mở rộng trong chương trình, nó sẽ giúp cho việc gỡ rối và bảo trì chương trình: o Chú thích cho mỗi phương thức: Giải thích những gì phương. .. chương trình gọi đến 3 chương trình con: Begin getData( ); {đưa dữ liệu vào} 59 processData( ); {xử lý dữ liệu} outputData( ); {xuất kết quả} End 60 Trong lập trình hàm, các lời gọi chương trình được viết thành biểu thức rất đơn giản: (outputData(processData(getData( )))) Các ngôn ngữ lập trình hàm cũng là những ngôn ngữ bậc cao, mang tính trừu tượng hơn so với các ngôn ngữ mệnh lệnh (còn gọi là ngôn ngữ... Khi lập trình với các ngôn ngữ hàm, người lập trình phải định nghĩa các hàm toán học dễ suy luận, dễ hiểu và không cần quan tâm chúng được cài đặt trên máy như thế nào Một hàm có thể không có hoặc có các tham số, sau khi tính toán, hàm trả về một giá trị nào đó thuộc miền giá trị Các ngôn ngữ hỗ trợ lập trình hàm như Lips, Scheme Hạn chế của lập trình hàm là chương trình có thể rắc rối, không đạt được... vào kỹ thuật chương trình con (subprogram/sub-rountine) và xây dựng những thư viện chương trình con để khi cần thì gọi đến hoặc sử dụng lại những đoạn chương trình đã viết Các ngôn ngữ bậc thấp như ngôn ngữ máy, hợp ngữ thường chỉ được dùng để viết các chương trình điều khiển & kiểm tra thi t bị, các chương trình gỡ rối (debugger) hay các công cụ 2.4.4 Lập trình có cấu trúc Lập trình cấu trúc là nguyên... liệu, o SaaS (Software as a Service): Là mô hình đám mây tiên tiến, phức tạp nhất Các giải pháp hiện đang được cung cấp theo mô hình SaaS gồm:  Doanh nghiệp thông minh  Hội nghị Web  Email  Bộ ứng dụng văn phòng 2.4.10 Lập trình hàm Trong lập trình mệnh lệnh, một chương trình thường chứa 3 lời gọi đến các chương trình con liên quan đến quy trình: - Đưa dữ liệu vào; - Xử lý dữ liệu - Xuất dữ liệu. .. mỗi phương thức  Ví dụ: Minh họa một chương trình tốt, một chương trình tồi (chỉ có mã, không có chú thích, không thụt cấp, không có ý niệm tiếp tục chương trình này) o Chú thích cho các biến toàn cục o Chú thích cho những thao tác phức tạp o Chú thích cho các thuật toán phức tạp sử dụng trong chương trình:  Cho biết tài liệu tham khảo  Mô tả ngắn gọn thuật toán: Ý tưởng của thuật toán  Các dữ liệu. .. chương trình logic bằng cách đặt ra các câu hỏi/truy vấn (Question/Query) truy vấn các CSDL này Ví dụ: Socrat có chết không? Tương đương với câu hỏi Socrat chết là đúng hay sai Một hệ thống logic sẽ chạy chương trình theo cách suy luận – tìm kiếm trả lời dựa trên vồn hiểu biết đã có là chương trình, để minh chứng câu hỏi là khẳng định đúng hay sai Ngôn ngữ lập trình đại diện cho phương pháp lập trình. .. giá trị trả về của nó Phương thức dùng để làm gì: Làm thế nào thì không cần biết Các tham biến truyền vào nó là gì Ví dụ: Ta biết phương thức readInt(): Dùng để lấy thông của người dùng từ bàn phím, giá trị (số nguyên) trả về thông qua tên hàm, không có tham biến truyền vào mà không cần biết bên trong phương thức là gì Có thể xem một phương thức như một hộp đen: Tham số 1 Kết quả Phương Tham số 2 thức/hộp

Ngày đăng: 11/05/2016, 15:21

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan