Elm Debug cho phép bạn quay ngƣợc thời gian. Bạn có thể tạm ngƣng chƣơng trình để tua lại các điểm ban đầu và chạy lại chƣơng trình. Việc di chuyển thời gian cho phép chúng ta khám phá sự tƣơng tác của chƣơng trình một cách nhanh hơn dễ dàng hơn. [10]
Tất cả nguồn đầu vào chƣơng trình Elm đƣợc quản lý bởi thời gian chạy đƣợc biết nhƣ là tĩnh tại thời điểm đƣợc biên dịch. Các yếu tố đầu vào nhƣ bàn phím và tín hiệu chuột dễ dàng đƣợc theo dõi. Khi ta di chuyển thời gian chính là lịch sử của những sự kiện đầu vào đƣợc coi là những bản ghi (Recording Inputs).
Các sự kiện trong Elm đều gắn liền với một thời gian. Vì vậy nó sẽ không có một lỗ hổng nào về thời gian. Elm Debug sẽ tạo ra bản ghi tại các thời điểm hiện tại. Việc kết hợp giá trị sự kiện với thời gian nghĩa là các sự kiện có thể đƣợc xem lại bất cứ khi nào cần.
Thời gian chạy sẽ lƣu trữ trạng thái. Các sự kiện đầu vào điều khiển trạng thái sẽ thay đổi khi chƣơng trình chạy. Elm Debug có thể nhẩy đến bất cứ trạng thái nào bởi vì trạng thái ban đầu đƣợc quyết định hoàn toàn bởi các bản ghi của những sự kiện đầu vào. Thời gian Elm kết hợp với trạng thái cũ và đầu vào mới tạo ra trạng thái hiện thời.
Elm Debug cho phép chúng ta tƣơng tác với các mã chƣơng trình khi cần và tìm đúng nơi mã chƣơng trình cần xử lý. Ta có thể xem kết quả của mã mới tại thời điểm đó mà không cần chạy qua toàn bộ tƣơng tác với mỗi lần chỉnh sửa.
Khi ta trao đổi với chƣơng trình bằng một thao tác gây ra lỗi gì đó hoặc lỗi cú pháp. Trong trƣờng hợp đó Elm Debug không trao đổi trong mã mới. Thay vào
50
đó nó sẽ hiển thị một thông báo giải thích vấn đề này trong khi phiên bản làm việc cuối cùng vẫn luôn chạy.
Việc gỡ lỗi trong phần mềm thƣờng bị giới hạn bởi một số ngôn ngữ. Trong các ngôn ngữ nhƣ C++, Java và JavaScript chúng ta sẽ dò qua tầng bƣớc vì đó là cách ngắn gọn nhất để thể hiện ý nghĩa của lập trình truyền thống. Việc gỡ lỗi điển hình thƣờng chỉ tập chung phía trƣớc vì mỗi bƣớc sẽ hủy các trạng thái trong quá khứ.
Việc gỡ lỗi trong một ngôn ngữ bậc cao nhƣ Elm có thể cho ta ngƣợc trở lại hoặc chuyển tiếp thời gian. Cho phép chúng ta thay đổi lại lịch sử và cho ta xem lại một chƣơng trình thay đổi theo thời gian.
Tất cả các tƣơng tác trong chƣơng trình đƣợc ghi lại vì vậy bạn có thể dừng, tua lại trình tự các sự kiện. Ta có thể sửa đổi mã ở bất cứ thời điểm nào và xem nó thay đổi mọi thứ trong chƣơng trình. Nó dễ dàng cho chúng ta thấy các bƣớc thay đổi theo thời gian. Ở dƣới thanh trƣợt thời gian ta có thể di chuyển vị trí chuột để xem vị chí chính xác của mỗi sự kiện. Vì vậy gỡ lỗi trong Elm hiển thị cho ta thấy nhƣ một loại thông tin phản hồi mang tính tƣơng tác cao nhƣ giao diện ngƣời dùng có tính chính xác hơn nhiều.
Debug.watch : String -> a -> a
Hàm này đƣa ra một chuỗi duy nhất để có thể theo dõi theo thời gian, ta có thể nhìn chính xác giá trị của mọi thứ ngay cả khi nó không xuất hiện trong giao diện ngƣời dùng. Vì vậy ta có thể xem một giá trị cụ thể mà không nhất thiết phải thay đổi mã nguồn nhƣ một số ngôn ngữ trƣớc đây.
Debug.trace : String -> Element -> Element
Một yếu tố hình ảnh nhìn thấy đƣợc gắn với một chuỗi thời gian liên tiếp nhƣ một ID duy nhất trong suốt chƣơng trình, cho phép gỡ lỗi và theo dõi thời gian. Nó có thể truy tìm và tắt bật các yếu tố mà không cần chỉnh sửa code. Khi chƣơng trình của chúng ta trở lên lớn hơn và phức tạp hơn thì lợi ích của việc ghi lại các sự kiện
51
thành các bản ghi sẽ tăng lên. Nếu chúng ta có một lỗi đƣợc kích hoặt bởi một chuỗi các sự kiện tuần tự cụ thể. Chúng ta chỉ cần thực hiện chuỗi sự kiện đó một lần sau đó sẽ nhận đƣợc phản hồi ngay lập tức. Elm debug có thể thay đổi tùy biến các giá trị.
Elm debug có thể tạm dừng và tua lại chƣơng trình bằng cách mô hình hóa các sự kiện vào ra để theo dõi chƣơng trình của chúng ta tƣơng tác với thế giới bên ngoài qua thời gian. Lập trình hàm phản ứng tồn tại để làm chính xác điều đó. Các tín hiệu của Elm là một API cho việc quản lý các sự kiện khi chúng bƣớc vào và thoát ra khỏi một chƣơng trình Elm. Để thực hiện các hiệu ứng (side – effect) chúng ta cần phải gửi các cấu trúc dữ liệu của chƣơng trình vào thời gian chạy. Để quan sát các hiệu ứng chúng ta nhận lại từ thời gian chạy.