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.
Refactoring & Optimizing - Cải tiến tối ưu hóa https://github.com/tqlong/advprogram Nội dung ● Vấn đề tồn đọng ○ hình text bị trơi theo lần đánh → xấu, ○ chưa hiển thị lần đoán sai để người chơi dễ ○ code chưa tối ưu ● Tiếp tục cải tiến tối ưu hóa ○ Phiên 1.1: code tốt ○ Phiên 1.2: giao diện tốt ● Kỹ thuật ○ Truyền tham số giá trị, tham chiếu, tham chiếu ○ Từ khóa const Phiên 1.1: Cải tiến code ● ● ● ● Cơ chế truyền tham trị Tham biến Hằng tham chiếu Code sáng, an toàn Cơ chế truyền tham trị string update(strin g g u essed W ord , strin g w ord , char guess) { for (int i= w ord.length(); i> = 0; i ) { if (w ord[i] = = guess) { Chuyện xảy guessedW ord[i] = guess; với guessedWord } word đây? } retu rn g u essed W ord ; } //in m ain function if (contains(w ord, guess)) guessedW ord = update(guessedW ord, w ord, guess); Cơ chế truyền tham trị string update(string g u essed W ord , string w ord , char guess) { chép xâu ký tự: for (int i= w ord.length(); i> = 0; i ) { - 02 lần từ đối số vào if (w ord[i] = = guess) { tham số guessedW ord[i] = guess; } - 01 lần từ giá trị trả vào biến nhận kết } return g u essed W ord ; } //in m ain function if (contains(w ord, guess)) g u essed W ord = update(g u essed W ord , w ord , guess); Dùng tham biến để tránh chép void update(strin g & guessedW ord, strin g & w ord, char guess) { for (int i= w ord.length(); i> = 0; i ) { if (w ord[i] = = guess) { guessedW ord[i] = guess; Đọc ghi trực tiếp vào string } word, guessedWord main() } Không cịn nhu cầu return } Khơng cịn chép string //in m ain function if (contains(w ord, guess)) update(guessedW ord, w ord, guess); Dùng tham biến để tránh chép void update(strin g & guessedW ord, strin g & w ord, char guess) { for (int i= w ord.length(); i> = 0; i ) { (w ord[i] = = guess) { ●if Lợi ích việc dùng tham biến guessedW ord[i] = guess; ○ Giảm thời gian chạy chép liệu } ○ Giảm nhớ tạo biến } ○ Giảm nguy lỗi dùng nhớ động (sẽ quay lại sau) } ● Chú ý: ○ Bài để demo phương pháp Việc cải tiến thời gian chạy với khơng có ý nghĩa thực tiễn ○ Thực tế 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 chép void update(strin g & guessedW ord, strin g & w ord, char guess) { for (int i= w ord.length(); i> = 0; i ) { (w ord[i] = = guess) { ●if Nhược điểm: guessedW ord[i] = guess; ○ Chưa cấm hàm update() sửa liệu không } sửa, chẳng hạn word } } ● Cách giải quyết: nên ○ Khai báo const cho tất tham số không sửa void update(string& guessedW ord, st string& w ord, char guess) Lời khuyên Để giảm bớt xử lý đảm bảo code an tồn: Đối với tham số khơng tầm thường ● Dùng tham chiếu biến ghi update(string& guessedWord, ) ● Dùng tham chiếu biến đọc update( const string& word) Clean code Hiện khơng cịn để cải tiến - Quy trình top-down + chia để trị cho ta tính mơ đun hóa chương trình, hàm phân chia hợp lý - Cách viết hàm theo kiểu kể chuyện kèm việc ý đặt tên biến tên hàm có nghĩa từ đầu làm chương trình dễ hiểu - Ta ý khai báo const cho tất giá trị không thay đổi → code an toàn Nhu cầu cải tiến/refactor code xuất ta tiếp tục sửa chương trình để cải thiện giao diện thêm tính (các sau) Tại code cần sáng? ● “Chương trình chạy đúng” yêu cầu thiếu quan trọng bậc Bên cạnh đó, cịn có tiêu chí khác hữu ích ● “Code sáng dễ hiểu” giúp ○ ○ ○ ○ dễ bảo trì, dễ phát triển tiếp dễ tìm lỗi chương trình chạy sai giảm mắc lỗi lập trình, lỗi logic ■ Kết chấm làm GuessIt chơi nhiều lần Lớp số 3: 100% nộp có lỗi logic (liên tục sinh lại số cần đoán, sinh số cần đoán lần ) dùng vịng lặp lồng thay tách hàm Tại code cần an toàn? ● Code an tồn giúp ta giảm nguy lỗi ○ Vơ tình sửa biến không sửa, ○ Sửa sai làm liệu vi phạm ràng buộc ● Không phải ta viết chương trình, khơng thể tin tưởng người khác cẩn thận biết hết cần tránh ● Khơng thể tin tưởng khơng nhầm/quên Phiên 1.2 (tự làm) - Chống trôi hình - Có thể in nhiều dịng trống trước vẽ giá treo cổ để đẩy hẳn hình ảnh lần đốn trước khỏi hình cố định giá treo cổ đáy hình - Hiển thị chữ đoán sai - Thêm biến string chứa chữ đoán sai cập nhật lần đoán sai, hiển thị lần chạy renderGame - Chuẩn hóa chữ hoa chữ thường input, - ‘R’ hay ‘r’ đoán cho từ “car” Gợi ý: thư viện hàm tolower() ... code chưa tối ưu ● Tiếp tục cải tiến tối ưu hóa ○ Phiên 1.1: code tốt ○ Phiên 1.2: giao diện tốt ● Kỹ thuật ○ Truyền tham số giá trị, tham chiếu, tham chiếu ○ Từ khóa const Phiên 1.1: Cải tiến code... const string& word) Clean code Hiện khơng cịn để cải tiến - Quy trình top-down + chia để trị cho ta tính mơ đun hóa chương trình, hàm phân chia hợp lý - Cách viết hàm theo kiểu kể chuyện kèm việc... động (sẽ quay lại sau) } ● Chú ý: ○ Bài để demo phương pháp Việc cải tiến thời gian chạy với khơng có ý nghĩa thực tiễn ○ Thực tế 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