Bài giảng Lập trình nâng cao: Cải tiến và tối ưu hóa - Trần Quốc Long
Số trang: 13
Loại file: pptx
Dung lượng: 61.81 KB
Lượt xem: 10
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bài giảng "Lập trình nâng cao: Cải tiến và tối ưu hóa" cung cấp cho người học các kiến thức: Vấn đề tồn đọng, tiếp tục cải tiến và tối ưu hóa; truyền tham số bằng giá trị, tham chiếu, tham chiếu hằng; từ khóa const. Mời các bạn cùng tham khảo.
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình nâng cao: Cải tiến và tối ưu hóa - Trần Quốc Long Refactoring & Optimizing 4 - Cải tiến và tối ưu hóa https://github.com/tqlong/advprogram Nội dung Vấn đề tồn đọng màn hình text bị trôi theo mỗi lần đánh → xấu, chưa hiển thị các lần đoán sai để người chơi dễ hơn code chưa tối ưu Tiếp tục cải tiến và tối ưu hóa Phiên bản 1.1: code tốt hơn Phiên bản 1.2: giao diện tốt hơn Kỹ thuật Truyền tham số bằng giá trị, tham chiếu, tham chiếu hằng Từ khóa const Phiên bản 1.1: Cải tiến code Cơ chế truyền tham trị Tham biến Hằng tham chiếu Code trong sáng, an toàn Cơ chế truyền tham trị string update(string guessedWord, string word, char guess) { for (int i = word.length(); i >= 0; i--) { if (word[i] == guess) { Chuyện gì xảy ra guessedWord[i] = guess; với guessedWord } và word ở đây? } return guessedWord; } ...//in main function if (contains(word, guess)) guessedWord = update(guessedWord, word, guess); Cơ chế truyền tham trị string update(string guessedWord, string word, char guess) { for (int i = word.length(); i >= 0; i--) { sao chép xâu ký tự: if (word[i] == guess) { - 02 lần từ đối số vào guessedWord[i] = guess; tham số } - 01 lần từ giá trị trả về } vào biến nhận kết quả return guessedWord; } ...//in main function if (contains(word, guess)) guessedWord = update(guessedWord, word, guess); ... Dùng tham biến để tránh sao chép void update(string& guessedWord, string& word, char guess) { for (int i = word.length(); i >= 0; i--) { if (word[i] == guess) { Đọc và ghi trực tiếp vào các guessedWord[i] = guess; string word, guessedWord của } main() } Không còn nhu cầu return } Không còn sao chép string ...//in main function if (contains(word, guess)) update(guessedWord, word, guess); ... Dùng tham biến để tránh sao chép void update(string& guessedWord, string& word, char guess) { for (int i = word.length(); i >= 0; i--) { Lợiifích (word[i] == guess) { của việc dùng tham biến guessedWord[i] = guess; } Giảm thời gian chạy do không phải sao chép dữ liệu } Giảm bộ nhớ do không phải tạo biến mới } Giảm nguy cơ lỗi khi dùng bộ nhớ động (sẽ quay lại sau) Chú ý: Bài này chỉ để demo phương pháp. Việc cải tiến thời gian chạy với bài này không có ý nghĩa thực tiễn. Thực tế chỉ cần quan tâm cải tiến chương trình chạy chậm so với nhu cầu Dùng tham biến để tránh sao chép void update(string& guessedWord, string& word, char guess) { for (int i = word.length(); i >= 0; i--) { if (word[i] == guess) { Nhược điểm: guessedWord[i] = guess; } Chưa cấm được hàm update() sửa dữ liệu không nên } sửa, chẳng hạn word } Cách giải quyết: Khai báo const cho tất cả các tham số không được sửa void update(string& guessedWord, const string& word, char guess) .. Lời khuyên Để giảm bớt xử lý trong khi vẫn đảm bảo code an toàn: Đối với các tham số không tầm thường Dùng tham chiếu đối với biến được ghi update(string& guessedWord,...) Dùng hằng tham chiếu đối với biến chỉ đọc update(... const string& word) Clean code Hiện không còn gì để cải tiến Quy trình top-down + chia để trị đã cho ta tính mô đun hóa trong chương trình, các hàm được phân chia hợp lý Cách viết hàm theo kiểu kể chuyện kèm việc chú ý đặt tên biến tên hàm có nghĩa ngay từ đầu đã làm chương trình dễ hiểu Ta đã chú ý khai báo const cho tất cả các giá trị không được thay đổi → code đã an toàn Nhu cầu cải tiến/refactor code sẽ xuất hiện khi ta tiếp tục sửa chương trình để cải thiện giao diện hoặc thêm tính năng mới (các bài sau) Tại sao code cần trong sáng? “Chương trình chạy đúng” là yêu cầu không thể thiếu và quan trọng bậc nhất. Bên cạnh đó, còn có các tiêu chí khác rất hữu ích. “Code trong sáng dễ hiểu” giúp dễ bảo trì, dễ phát triển tiếp dễ tìm lỗi khi chương trình chạy sai giảm mắc lỗi trong khi lập trình, nhất là lỗi logic Kết quả chấm bài làm GuessIt chơi nhiều lần tại Lớp số 3: 100% các bài nộp có lỗi logic (liên tục sinh lại số cần đoán, sinh số cần đoán mỗi một lần...) đều là các bài dùng các vòng lặp lồng nhau thay vì tách hàm. Tại sao code cần an toàn? Code an toàn giúp ta giảm nguy cơ lỗi Vô tình sửa các biến không được sửa, Sửa sai làm dữ liệu vi phạm ràng buộc Không phải một mình ta viết một chương trình, không thể tin tưởng người khác cẩn thận và biết hết những gì cần tránh. Không thể tin tưởng chính mình không bao giờ nhầm/quên Phiên bản 1.2 (tự làm) Chống trôi màn hình Có thể in nhiều dòng trống trước khi vẽ giá treo cổ để đẩy hẳn hình ảnh của lần đoán trước ra khỏi màn hình và cố định giá treo cổ mới tại đáy màn hình Hiển thị các chữ cái đã đoán sai Thêm một biến string chứa các chữ cái đã đoán sai và cập nhật mỗi lần đoán sai, hiển thị mỗi lần chạy renderGame Chuẩn hóa chữ hoa chữ thường ở input, ‘R’ hay ‘r’ đều là đoán đúng cho từ “car” Gợi ý: thư viện hàm tolo ...
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình nâng cao: Cải tiến và tối ưu hóa - Trần Quốc Long Refactoring & Optimizing 4 - Cải tiến và tối ưu hóa https://github.com/tqlong/advprogram Nội dung Vấn đề tồn đọng màn hình text bị trôi theo mỗi lần đánh → xấu, chưa hiển thị các lần đoán sai để người chơi dễ hơn code chưa tối ưu Tiếp tục cải tiến và tối ưu hóa Phiên bản 1.1: code tốt hơn Phiên bản 1.2: giao diện tốt hơn Kỹ thuật Truyền tham số bằng giá trị, tham chiếu, tham chiếu hằng Từ khóa const Phiên bản 1.1: Cải tiến code Cơ chế truyền tham trị Tham biến Hằng tham chiếu Code trong sáng, an toàn Cơ chế truyền tham trị string update(string guessedWord, string word, char guess) { for (int i = word.length(); i >= 0; i--) { if (word[i] == guess) { Chuyện gì xảy ra guessedWord[i] = guess; với guessedWord } và word ở đây? } return guessedWord; } ...//in main function if (contains(word, guess)) guessedWord = update(guessedWord, word, guess); Cơ chế truyền tham trị string update(string guessedWord, string word, char guess) { for (int i = word.length(); i >= 0; i--) { sao chép xâu ký tự: if (word[i] == guess) { - 02 lần từ đối số vào guessedWord[i] = guess; tham số } - 01 lần từ giá trị trả về } vào biến nhận kết quả return guessedWord; } ...//in main function if (contains(word, guess)) guessedWord = update(guessedWord, word, guess); ... Dùng tham biến để tránh sao chép void update(string& guessedWord, string& word, char guess) { for (int i = word.length(); i >= 0; i--) { if (word[i] == guess) { Đọc và ghi trực tiếp vào các guessedWord[i] = guess; string word, guessedWord của } main() } Không còn nhu cầu return } Không còn sao chép string ...//in main function if (contains(word, guess)) update(guessedWord, word, guess); ... Dùng tham biến để tránh sao chép void update(string& guessedWord, string& word, char guess) { for (int i = word.length(); i >= 0; i--) { Lợiifích (word[i] == guess) { của việc dùng tham biến guessedWord[i] = guess; } Giảm thời gian chạy do không phải sao chép dữ liệu } Giảm bộ nhớ do không phải tạo biến mới } Giảm nguy cơ lỗi khi dùng bộ nhớ động (sẽ quay lại sau) Chú ý: Bài này chỉ để demo phương pháp. Việc cải tiến thời gian chạy với bài này không có ý nghĩa thực tiễn. Thực tế chỉ cần quan tâm cải tiến chương trình chạy chậm so với nhu cầu Dùng tham biến để tránh sao chép void update(string& guessedWord, string& word, char guess) { for (int i = word.length(); i >= 0; i--) { if (word[i] == guess) { Nhược điểm: guessedWord[i] = guess; } Chưa cấm được hàm update() sửa dữ liệu không nên } sửa, chẳng hạn word } Cách giải quyết: Khai báo const cho tất cả các tham số không được sửa void update(string& guessedWord, const string& word, char guess) .. Lời khuyên Để giảm bớt xử lý trong khi vẫn đảm bảo code an toàn: Đối với các tham số không tầm thường Dùng tham chiếu đối với biến được ghi update(string& guessedWord,...) Dùng hằng tham chiếu đối với biến chỉ đọc update(... const string& word) Clean code Hiện không còn gì để cải tiến Quy trình top-down + chia để trị đã cho ta tính mô đun hóa trong chương trình, các hàm được phân chia hợp lý Cách viết hàm theo kiểu kể chuyện kèm việc chú ý đặt tên biến tên hàm có nghĩa ngay từ đầu đã làm chương trình dễ hiểu Ta đã chú ý khai báo const cho tất cả các giá trị không được thay đổi → code đã an toàn Nhu cầu cải tiến/refactor code sẽ xuất hiện khi ta tiếp tục sửa chương trình để cải thiện giao diện hoặc thêm tính năng mới (các bài sau) Tại sao code cần trong sáng? “Chương trình chạy đúng” là yêu cầu không thể thiếu và quan trọng bậc nhất. Bên cạnh đó, còn có các tiêu chí khác rất hữu ích. “Code trong sáng dễ hiểu” giúp dễ bảo trì, dễ phát triển tiếp dễ tìm lỗi khi chương trình chạy sai giảm mắc lỗi trong khi lập trình, nhất là lỗi logic Kết quả chấm bài làm GuessIt chơi nhiều lần tại Lớp số 3: 100% các bài nộp có lỗi logic (liên tục sinh lại số cần đoán, sinh số cần đoán mỗi một lần...) đều là các bài dùng các vòng lặp lồng nhau thay vì tách hàm. Tại sao code cần an toàn? Code an toàn giúp ta giảm nguy cơ lỗi Vô tình sửa các biến không được sửa, Sửa sai làm dữ liệu vi phạm ràng buộc Không phải một mình ta viết một chương trình, không thể tin tưởng người khác cẩn thận và biết hết những gì cần tránh. Không thể tin tưởng chính mình không bao giờ nhầm/quên Phiên bản 1.2 (tự làm) Chống trôi màn hình Có thể in nhiều dòng trống trước khi vẽ giá treo cổ để đẩy hẳn hình ảnh của lần đoán trước ra khỏi màn hình và cố định giá treo cổ mới tại đáy màn hình Hiển thị các chữ cái đã đoán sai Thêm một biến string chứa các chữ cái đã đoán sai và cập nhật mỗi lần đoán sai, hiển thị mỗi lần chạy renderGame Chuẩn hóa chữ hoa chữ thường ở input, ‘R’ hay ‘r’ đều là đoán đúng cho từ “car” Gợi ý: thư viện hàm tolo ...
Tìm kiếm theo từ khóa liên quan:
Bài giảng Lập trình nâng cao Lập trình nâng cao Kỹ thuật lập trình Ngôn ngữ lập trình Tối ưu hóa Từ khóa constGợi ý tài liệu liên quan:
-
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 271 0 0 -
Bài thuyết trình Ngôn ngữ lập trình: Hệ điều hành Window Mobile
30 trang 263 0 0 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 262 0 0 -
Giáo trình Lập trình cơ bản với C++: Phần 1
77 trang 231 0 0 -
Bài giảng Một số hướng nghiên cứu và ứng dụng - Lê Thanh Hương
13 trang 221 0 0 -
Tóm tắt luận án tiến sỹ Một số vấn đề tối ưu hóa và nâng cao hiệu quả trong xử lý thông tin hình ảnh
28 trang 221 0 0 -
Giáo án Tin học lớp 11 (Trọn bộ cả năm)
125 trang 214 1 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 203 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 193 0 0 -
Bài tập lập trình Windows dùng C# - Bài thực hành
13 trang 179 0 0