Giới thiệu

CodersDojoSweden, tổ chức ở Linköping, tìm kiếm một bài biểu diễn đủ đơn giản dành cho người mới bắt đầu. Thomas Nilsson đã đưa ra bài cộng số La Mã.

Mô tả vấn đề

“Là một kế toán, Tôi muốn cộng các số La Mã tự động bởi vì làm việc đó bằng tay quá tẻ nhạt.” Cho các chữ số La Mã ( I: một, V: Năm, X: Mười, L: Năm mươi, C: Một trăm, D: Năm trăm, M: Một nghìn), tạo hai số và cộng chúng. Ở Rome thời đó không có số thập phân hay số nguyên, chúng ta cần làm việc đó với chuỗi kí tự.
Ví dụ: “XIV” + “LX” = “LXXIV”.

Dưới đây là nguyên tắc viết số La Mã:

Các chữ số được nối vào nhau thành số lớn hơn ( “XX” + “II” = “XXII”)

Nếu chữ số nhỏ hơn đứng trước chữ số lớn hơn, lấy chữ số lớn trừ số nhỏ (“IV” là 4, “CM” là 900)
Nếu chữ số La mã là I, X, C, bạn không thể có nhiều hơn 3 kí tự liên tiếp ( “II” + “II” = “IV”)
Nếu chữ số La Mã là V, L, D, bạn không thể có nhiều hơn 1 (“D” + “D” = “M”)

Gợi ý:

Nhóm chuỗi và nối chuỗi là chìa khóa để giải quyết bài kata này. Nhưng hãy nhớ quy tắc về trường hợp số nhỏ hơn đứng trước số lớn hơn ở trên.(Nếu chữ số nhỏ hơn đứng trước chữ số lớn hơn, lấy chữ số lớn trừ số nhỏ (“IV” là 4, “CM” là 900))

Gợi ý các trường hợp kiểm thử

Mười trường hợp kiểm thử đầu tiên tương đối dễ tìm. Tôi không viết ra các test case ở đây bởi vì tôi thấy rằng bài kata này là một trong số những bài kata rất tốt để thực hành việc tìm trường hợp kiểm thử.

Bình luận của những người đã làm bài kata này

Khi tôi phát minh ra bài kata này tôi không biết nó sẽ tốt cỡ nào. Tôi đã ngạc nhiên và thích thú khi thấy rằng bài kata này  giúp ta rất  tập trung vào việc tìm các trường hợp kiểm thử.

Bài kata không cho thấy “hành vi” ngay lập tức giống như kata Bowling. Ý tôi là hành vi của class được kiểm thử , đối ngược với kiểm thử một phương thức đơn lẻ. Tuy nhiên, ở Linköping dojo, chúng tôi quyết định thêm khía cạnh này bằng cách thay đổi câu chuyện thành “Là một người Phần Lan làm kế toán cho người La mã… từ đó thêm kí hiệu đảo ngược Phần Lan vào việc tính toán.” Như vậy lần kiểm thử đầu tiên như sau:

public void testOnePlusOneShouldEqualTwo() {
    RomanPolishCalculator calculator = new
    RomanPolishCalculator();
    calculator.enter(“I”);
    calculator.enter(“I”);
    assertEquals(“II”, calculator.add());
}

Và chúng tôi quyết định thêm phần này vào giải pháp sơ bộ ở giữa buổi kata. Điều này tạo tính huống cho việc tái cấu trúc chương trình. Bạn có thể thử để xem nó trông như thế nào.

ThomasNilsson

Nguồn CodingDojo.org

Người dịch: Duy Hùng, Thanh Mai