Bạn hiểu vấn đề, logic, cơ bản của cú pháp, v.v. Và nếu bạn thấy code của người khác hoặc có người hướng dẫn bạn, bạn có thể làm theo. Nhưng có thể bạn cảm thấy không chắc chắn về việc tự mình thực hiện và gặp rắc rối khi chuyển suy nghĩ của bạn thành code, mặc dù bạn hiểu cú pháp hoặc logic.
Ở đây, tôi sẽ trình bày quy trình của tôi để giải quyết một vấn đề mẫu. Hy vọng rằng, một số bạn sẽ thấy bài này hữu ích hỗ trợ hành trình lập trình của bạn.
Bạn không thể giải quyết vấn đề mà bạn không hiểu. Có một sự khác biệt giữa vấn đề và vấn đề bạn nghĩ rằng bạn đang giải quyết. Thật dễ dàng để bắt đầu đọc vài dòng đầu tiên của một vấn đề và đặt giả thiết cho phần còn lại của nó bởi vì nó giống như một thứ bạn đã nhìn thấy trong quá khứ. Ngay cả khi bạn đang tạo ra một trò chơi phổ biến như Hangman, hãy chắc chắn đọc qua các quy tắc ngay cả khi bạn đã chơi nó trước đây. Tôi đã được hỏi một lần để làm một trò chơi như Hangman và chỉ nhận ra rằng đó là “Evil Hangman” sau khi tôi đọc qua các hướng dẫn (đó là một thủ thuật!).
Đôi khi, tôi thậm chí sẽ cố gắng giải thích vấn đề cho bạn bè và xem liệu họ có hiểu lời giải thích của tôi và đánh giá nó có phù hợp với vấn đề tôi được giao nhiệm vụ hay không. Bạn không muốn phát hiện ra rằng bạn hiểu sai vấn đề khi đã đi được nữa chặng đường. Dành thêm thời gian ở khoảng thời gian đầu là điều đáng làm. Bạn càng hiểu rõ vấn đề, bạn sẽ dễ dàng giải quyết được.
Hãy tưởng tượng chúng ta đang tạo ra một function đơn giản
selectEvenNumbers
đặt vào một mảng (array) các số và trả về một mảng số
selectEvenNumbers
chỉ có các số chẵn. Nếu không có số chẵn, nó sẽ trả lại kết quả là mảng rỗng.
- Làm thế nào máy tính có thể cho biết một số chẵn? Chia số đó cho 2 và xem phần còn bằng không.
- Tôi chuyển vào function như thế nào? Một mảng ( array ).
- Mảng đó chứa gì? Một hoặc nhiều số.
- Các kiểu dữ liệu của các phần tử trong mảng là gì? Số.
-
Mục tiêu của chức năng này là gì? Tôi sẽ trả lại gì khi kết thúc function này? Mục đích là để lấy tất cả các số chẵn và trả lại chúng trong một mảng. Nếu không có số chẵn, hàm sẽ trả về một mảng trống.
3. Xử lý các vấn đề thủ công với ít nhất ba bộ dữ liệu mẫu
- Trường hợp Corner: Một vấn đề hoặc tình huống xảy ra bên ngoài các thông số bình thường, đặc biệt khi nhiều biến môi trường hoặc các điều kiện xảy ra đồng thời ở mức cực cao, mặc dù mỗi tham số nằm trong phạm vi được chỉ định cho tham số đó.
- Trường hợp Edge: Một vấn đề hoặc tình huống xảy ra chỉ ở một tham số cực trị (tối đa hoặc tối thiểu) hoạt động.
Chúng ta hãy đi qua mảng đầu tiên
[1]
-
Nhìn vào phần tử duy nhất trong mảng
[1]. - Quyết định xem nó là số chẵn hay không. Nó không phải
- Lưu ý rằng không có nhiều phần tử trong mảng này.
- Xác định rằng không còn số chẵn nào trong mảng được cung cấp này.
- Trả lại một mảng trống.
1, 2]
-
Nhìn vào phần tử đầu tiên trong mảng
[1, 2] - Đó là 1.
- Quyết định xem nó có phải số chẵn hay không. Nó không phải.
- Nhìn vào phần tử tiếp theo của mảng.
-
Đó là
2. -
Quyết định xem nó có phải
evenNumbershay không. Nó đúng làevenNumbers. - Thực hiện một mảng evenNumbers và thêm 2 vào mảng này.
- Lưu ý rằng không có nhiều phần tử trong mảng này.
-
Trả lại mảng
evenNumbersvới số 2.
[1, 2]
. Đó là lý do tại sao tôi cố gắng đi qua một vài bộ khác nhau. Tôi có một số bộ chỉ với một phần tử, một số có thả nổi thay vì số nguyên, một số có nhiều chữ số trong một phần tử, và một số âm để an toàn.
3. Đơn giản hóa và tối ưu hóa các bước
Tìm các mẫu và xem liệu có bất kỳ điều gì bạn có thể khái quát hay không. Xem bạn có thể giảm bất kỳ bước nào hoặc nếu bạn đang lặp lại điều gì.-
Tạo một function
selectEvenNumbers. -
Tạo một mảng rỗng mới
evenNumberskhi bạn có thể lưu trữ các số chẵn nếu có. -
Đi qua từng phần tử trong mảng y
[1, 2]. - Tìm phần tử đầu tiên.
-
Quyết định xem nó có phải là số chẵn bằng cách xem nó có chia hết cho hai. Nếu nó là số chẵn, thêm nó vào
evenNumbers. - Tìm phần tử tiếp theo.
- Lặp lại bước # 4.
- Lặp lại bước # 5 và # 4 cho đến khi không có thêm các phần tử trong mảng này.
-
Trả lại array
evenNumbers. bất kể nó có bất cứ điều gì trong nó.
-
Cho rằng nó đúng với
n = 1,n = 2,... -
Giả sử nó đúng cho
n = k -
Chứng minh nó đúng với
n = k + 1
-
Viết pseudocode
Pseudocode thường không có các quy tắc cụ thể, đặc biệt là đôi khi tôi kết thúc bằng một số cú pháp từ một ngôn ngữ chỉ vì tôi đã quen với nó. Đừng theo đuổi cú pháp. Tập trung vào logic và các bước.
Đối với vấn đề của chúng tôi, có rất nhiều cách khác nhau để làm điều này. Ví dụ: bạn có thể sử dụng bộ lọc, nhưng để ví dụ này dễ dàng theo dõi tốt nhất, chúng tôi sẽ sử dụng một vòng lặp cơ bản cho bây giờ (nhưng chúng tôi sẽ sử dụng bộ lọc sau này khi chúng tôi tái cấu trúc code của chúng tôi).
Dưới đây là ví dụ về giả mã có nhiều từ hơn:
Hãy tham khảo lại vấn đề để chắc chắn rằng bạn đang đi đúng hướng.
-
Dịch pseudocode thành code và debug
Nếu bạn đã viết nó trên giấy, hãy viết như bình luận trong trình biên tập code của bạn. Sau đó, thay thế mỗi dòng trong pseudocode của bạn.
Sau đó tôi gọi function và cung cấp cho nó một số tập hợp dữ liệu mẫu mà chúng ta đã sử dụng trước đó. Tôi sử dụng chúng để xem nếu mã của tôi trả về kết quả tôi muốn hay không. Bạn cũng có thể viết bài kiểm tra để kiểm tra xem kết quả thực tế bằng với kết quả dự kiến hay không.
-
Đơn giản hóa và tối ưu hóa mã của bạn
Trong ví dụ này, một cách để tối ưu hóa chức năng đó là lọc các khoản mục khỏi một mảng bằng cách trả về một mảng mới sử dụng
filter
. Bằng cách này, chúng ta không cần phải định nghĩa một biến
evenNumbers
nữa bởi vì bộ lọc sẽ trả về một mảng mới với các bản sao của các phần tử phù hợp với bộ lọc. Điều này sẽ không thay đổi mảng gốc. Chúng tôi cũng không cần phải sử dụng một vòng lặp với cách tiếp cận này. Bộ lọc sẽ đi qua từng khoản mục và trả về
true
(bao gồm phần tử đó trong mảng) hoặc
false
(bỏ qua phần tử trong mảng đó).
Dưới đây là một số câu hỏi cần ghi nhớ:
- Mục tiêu của bạn để đơn giản hóa và tối ưu hóa là gì? Mục tiêu sẽ phụ thuộc vào phong cách của nhóm hoặc sở thích cá nhân của bạn. Bạn đang cố gắng làm gọn code càng nhiều càng tốt? Là mục tiêu để làm cho code dễ đọc hơn? Nếu đó là trường hợp, bạn có thể thích dùng thêm dòng để xác định biến hoặc tính toán một cái gì đó hơn là cố gắng xác định và tính toán tất cả trong một dòng.
- Làm thế nào khác bạn có thể làm cho code dễ đọc hơn?
- Có thêm bất kỳ bước nào bạn có thể thực hiện được không?
- Có bất kỳ biến hoặc function nào mà bạn đã kết thúc thậm chí không cần hoặc sử dụng?
- Bạn có lặp lại một số bước rất nhiều? Xem nếu bạn có thể xác định trong một function khác.
- Có những cách tốt hơn để xử lý các trường hợp edge?
-
Debug
- Kiểm tra bảng điều khiển để xem những gì thông báo lỗi nói. Đôi khi, nó sẽ chỉ ra một số dòng. Điều này cho tôi ý tưởng sơ bộ về nơi để bắt đầu – mặc dù vấn đề đôi khi không thể ở trong dòng này.
- Nhận xét các khối hoặc các dòng mã và đầu ra mà tôi có cho đến nay để nhanh chóng xem code có hoạt động như tôi mong đợi hay không. Tôi luôn luôn có thể sửa lại code khi cần thiết.
- Sử dụng dữ liệu mẫu khác nếu có những tình huống mà tôi không nghĩ đến và xem liệu code vẫn hoạt động hay không.
- Lưu các phiên bản khác nhau của tệp nếu tôi đang thử một cách tiếp cận hoàn toàn khác. Tôi không muốn mất bất kỳ công việc của tôi nếu tôi chưa muốn kết thúc nó!
-
Viết những lời bình luận hữu ích
Tránh xa những bình luận như:
// This is an array. Iterate through it.
// This is a variable
Tôi cố gắng viết những bình luận ngắn giúp tôi hiểu điều gì đang xảy ra nếu nó không hiển nhiên. Điều này có ích khi tôi đang làm việc với các vấn đề phức tạp hơn. Nó giúp tôi hiểu những gì một chức năng cụ thể đang làm và tại sao. Thông qua việc sử dụng các tên biến, tên chức năng và nhận xét rõ ràng, bạn (và những người khác) sẽ có thể hiểu được:
- Code này dành cho cái gì
- Nó đang làm gì
-
Nhận phản hồi thông qua đánh giá code
-
Thực hành, thực hành, thực hành
Cảm ơn, Gavin Stark.
Không có nhận xét nào:
Đăng nhận xét