# 69: Chia tay chuột và bàn phím

Đã bao giờ bạn dành hàng giờ tập trung giải quyết một vấn đề khó khăn tuy nhiên bạn lại trở nên cạn kiệt ý tưởng. Vì lý do ấy, bạn hãy đứng dậy duỗi thẳng gân cốt và tìm đến một máy bán nước tự động, và khi bạn trở về câu trả lời đột nhiên xuất hiện trong đầu của bạn.

Bạn cảm thấy kịch bản này có vẻ quen thuộc? Và băn khoăn tại sao nó lại xảy ra? Một mẹo nhỏ ở đây chính là trong khi bạn đang viết code, phần bán cầu não phụ trách tư duy logic của bạn được active trong khi phần sáng tạo thì ngược lại. Nó không thể nảy ra một ý tưởng nào cho đến khi phần logic tạm thời nghỉ ngơi.

Và đây chính là một ví dụ thực tế. Trong lúc tôi đang dọn dẹp mớ code cũ của bản thân thì tình cờ tìm thấy một method thứ vị. Nó được thiết kế để kiểm tra một chuỗi chứa thông tin về thời gian có được định dạng theo chuẩn hh:mm:ss xx, với hh đại diện cho giờ, mm đại diện cho phút, ss đại diện cho giây, và xx đại cho AM hoặc PM. Cái method ấy sử dụng đoạn code dưới đây để chuyển hai ký tự (đại diện cho giờ) thành một số và kiểm tra rằng chúng nằng trong một phạm vi thích hợp:

try {
    Integer.parseInt(time.substring(0,2));
} catch (Exception x){
    Return false;
}

if (Integer.parseInt(time.substring(0,2)) > 12) {
    Return false;
}

Và đoạn code như thế xuất hiện thêm hai lần nữa cùng với sự tinh chỉnh thích hợp cho từng loại và giới hạn thích hợp để kiểm tra phút và giây. Method nảy kết thúc cùng với những dòng này để kiểm tra AM hay PM:

if (!time.substring(9, 11).equals("AM") & !time.substring(9, 11).equals("PM")){ 
    return false;
}

Nếu không phép so sánh nào trong chuỗi so sánh trên thất bại, trả về false, và method trả về true. Nếu bạn cảm thấy đoạn code phía trên cứng nhắc và khó có thể theo kịp thì đừng lo lắng. Bản thân tôi cũng thấy thế nên tôi đã tìm thấy thứ mà mình cần phải dọn dẹp. Tôi tiến hành tái bản nó đồng thời tạo một số bộ test cho nó chỉ để đảm bảo nó vẫn hoạt động tốt.

Khi hoàn tất mọi việc, tôi cảm thấy vô cùng mãn nguyện với thành quả của mình. Phiên bản mới đã dễ đọc hơn, chỉ bằng một nửa kích thước của bản cũ, và còn chính xác hơn bởi ở bản gốc bởi nó chỉ kiểm tra giới hạn trên cho giờ, phút, giây.

Sau đó, trong khi tôi đang chuẩn bị cho công việc của ngày mai, một ý tưởng nảy lên trong đầu tôi. Tại mình lại không dùng regular expression ngay từ đầu để duyệt chuỗi nhỉ? Chỉ sau một vài phút gõ phím, tôi đã hoàn thành một bản cài đặt mới hoạt động hoàn toàn bình thường chỉ trong một dòng code. Và nó đây:

Public static boolean validateTime(String time) { 
    return time.matches("(0[1–9]|1[0–2]):[0–5][0–9]:[0–5][0–9] ([AP]M)");
}

Mấu chốt của câu chuyện không phải là việc tôi thay thế tất cả ba mươi dòng code chỉ bằng một dòng duy nhất mà mấu chốt ở đây chính là cho tới khi tôi tạm chia tay cái máy tính thì tôi mới nghĩ ra giải pháp tối ưu cho bài toán của tôi.

Chốt lại vấn đề, lần sau nếu bạn gặp phải một vấn đề khó khăn, hãy cho bản thân mình một ân huệ. Một khi bạn đã thật sự hiểu vấn đề hãy đi làm gì đó kích thích phần sáng tạo ở não của bạn. Hãy mô tả vấn đề của bạn vào giấy, thêm vào một chút nhạc, và đưa bản thân dạo một vòng. Đôi khi điều tốt nhất bạn có thể làm để giải quyết một vấn đề đó chính là tạm chia tay chú chuột và cái bàn phím thân thương của các bạn.