# 94: Xây dựng những hàm nhỏ bằng ví dụ

Chúng ta bao giờ cũng muốn code được viết một cách chính xác, đồng thời có những bằng chứng cho tính đúng đắn của code. Nó có thể giúp ta nghĩ về vấn đề “kích thước” của hàm đấy. Không phải về mặt số lượng code mà chúng ta viết trong hàm — mặc dù chúng rất thú vị — mà là về kích thước của các phép tính toán của chúng ta sử dụng trong hàm.

Ví dụ trong trong một trò chơi của Go có một điều kiện gọi lại atari thể hiện các viên đá của người chơi có thể bị cướp bởi đối thủ của họ: Một viên đó mà có 2 hoặc nhiều hơn những khoảng trống kề cạnh (gọi là liberties) không phải là atari. Việc đếm các liberties của một viên đá có thể gặp khó khăn tuy nhiên nó sẽ giúp việc xác định atari một cách dễ dàng. Chúng ta có thể bắt đầu viên hàm như thế này:

boolean atari(int libertyCount) libertyCount < 2

Đây chỉ là một phần nhỏ của cả đoạn code. Một hàm số toán học có thể được hiểu là một tập hợp, vài tập con của tích đề các của nó là miền giá trị (ở đây là, int) và phạm vi(ở đây, boolean). Nếu tập hợp các giá trị trên có kích thước tương tự trong Java thì chúng ta sẽ có 2L * (integer.MAX_VALUE +(-1L * Integer.MIN_VALUE) +1L) hoặc là 8,589,934,592 phần tử của tập int boolean. Một nửa trong số chúng chính là những phần tử của tập con của hàm chúng ta đang viết. Chính vì thế để cung cấp những chứng minh hàm mà chúng ta viết chính xác chúng ta cần phải thử khoảng 4.3*10⁹ ví dụ.

Điều này xác nhận rằng test không chứng minh được bugs không có khả năng xuất hiện trong code của chúng ta mà chúng chỉ có thể thể các tính năng của code. Nhưng chúng ta vẫn gặp phải vấn đề về kích thước.

Chính miền xác định của vấn đề sẽ giúp chúng ta hiểu ra. Bản chất của Go chính là số lượng Liberties của một viên đó không phải là một giá trị bất kì mà chúng chỉ nằm trong tập {1,2,3,4}. Chính vì thế chúng ta có thể thay thế đoạn code trên bằng:

libertyCount = {1,2,3,4}
boolean atari(LibertyCount libertyCount) libertyCount == 1

Bằng đoạn code này chúng ta có thể dễ dàng để làm việc cùng hơn: những tính toán của hàm giờ đây đã trở thành một tập hợp với nhiều nhất 8 phần tử. Bằng bốn ví dụ trên chúng ta đã nắm chắc được bằng chứng chứng minh cho tính đúng đắn của chương trình. Đó chính là lý do vì sao chúng ta nên sử dụng những kiểu có sự tương đồng gần nhất với miền xác định của vấn đề để viết code thay vì dùng những kiểu nguyên sơ. Hơn nữa việc sử dụng các dữ liệu càng giống với miền xác định của của vấn đề có thể khiến cho hàm xử lý của chúng ta trở nên gọn gàng hơn. Chỉ có một cách để tìm ra những vấn đề đó chính là tìm những ví dụ để kiểm tra vấn đề nhằm tính toán miền xác định của vấn đề trước khi bắt tay vào việc viết hàm.