2010-04-08 33 views
5

Tôi chỉ đọc bài viết Programming by Coincidence. Ở cuối trang có bài tập. Một vài đoạn mã là các trường hợp "lập trình trùng hợp". Nhưng tôi không thể tìm ra lỗi trong đoạn này:'Lập trình bởi trùng hợp ngẫu nhiên' Tập thể dục: Nhà văn tệp Java

Mã này có nguồn gốc chung Bộ theo dõi Java. Hàm ghi một chuỗi vào tệp nhật ký. Nó vượt qua kiểm tra đơn vị của nó, nhưng không thành công khi một trong những nhà phát triển Web sử dụng nó. Sự trùng hợp nào?

public static void debug(String s) throws IOException { 
    FileWriter fw = new FileWriter("debug.log", true); 
    fw.write(s); 
    fw.flush(); 
    fw.close(); 
    } 

Điều gì sai về điều này?

+0

Không phải là trường hợp các bài kiểm tra đơn vị không đảm bảo 100% chống lừa đảo? Ý tôi là, có rất nhiều sự trùng hợp mà chúng tôi đang đối mặt kể từ khi chúng tôi bắt đầu lập trình :) – bragboy

+1

@ Bragaadeesh: Đây là một thử nghiệm đơn vị không tốt vì nó vi phạm ["nguyên tắc trách nhiệm duy nhất"] (http: //en.wikipedia .org/wiki/Single_responsibility_principle). Nếu bạn đang thử nghiệm nếu phương thức ghi chính xác chuỗi, bạn nên lấy tệp I/O ra khỏi nó. Nó sẽ nhận được một 'java.io.Writer' được tạo ra từ nơi khác và ghi vào nó. –

Trả lời

10

Mã này dựa trên thực tế là có một tệp có tên là debug.log có thể ghi trong thư mục thực thi của ứng dụng. Rất có thể ứng dụng của nhà phát triển web không được thiết lập với tệp này và phương thức không thành công khi anh ấy cố gắng sử dụng nó.

Kiểm tra đơn vị mã này sẽ hoạt động vì nhà phát triển ban đầu có đúng tệp ở đúng vị trí (và có quyền phù hợp). Đây là trùng hợp ngẫu nhiên cho phép thử nghiệm đơn vị thành công.

+0

Vâng, tôi sẽ nói điều gì đó về quyền. –

+0

Điều này có ý nghĩa thực sự. Cảm ơn bạn đã làm rõ điều này! –

0

Tidbit thú vị. Lý tưởng nhất, tài nguyên phải được kéo từ classpath. Tuy nhiên, không có sự kết thúc nào đối với tình trạng bệnh học của con người. Điều gì sẽ xảy ra nếu tập tin đã có trong classpath của môi trường thử nghiệm (nói nhật thực), nhưng đã bị thiếu trong triển khai sản xuất.?

+0

Tài nguyên (nếu bạn có nghĩa là tệp, trong ngữ cảnh của câu hỏi này) không nhất thiết phải được kéo theo đường dẫn lớp. Chương trình không cần phải biết classpath là gì. Classpath chỉ được sử dụng bởi trình nạp lớp. Java không chỉ định "thư mục làm việc" cho tệp IO. Đó là trách nhiệm của lập trình viên để vượt qua một thư mục làm việc thông qua một đối số dòng lệnh hoặc lý tưởng một tham số hệ thống và sử dụng nó trong chương trình. –

+0

Đó là những gì tôi muốn nói một cách lý tưởng. Điều đó sẽ dễ dàng cho việc di chuyển trên nền tảng, thay vì mã hóa nó. – Maddy

Các vấn đề liên quan