Referentially transparent là gì?

Noun Programming
referential transparency

Một biểu thức (expression) được gọi là referentially transparent nếu nó có thể được thay thế bằng giá trị tương ứng của nó (và ngược lại) mà không làm thay đổi hành vi của chương trình. Điều này yêu cầu rằng biểu thức phải thuần túy (pure) nghĩa giá trị của nó phải giống nhau đối với các đầu vào (input) giống nhau và việc đánh giá (evaluation) nó phải không có side effect.

Ví dụ các phép toán số học (arithmetic operation) là referentially transparent, ví dụ: 5 * 5 có thể được thay thế bằng 25. Trong khi đó các phép gán lại (reassignment) là không referentially transparent. Ví dụ biểu thức x = x + 1 thay đổi giá trị được gán cho biến x. Giả sử ban đầu x có giá trị 10, hai lần đánh giá liên tiếp của biểu thức tạo ra lần lượt là 11 và 12. Rõ ràng, việc thay thế x = x + 1 bằng 11 hoặc 12 sẽ cho một chương trình có ý nghĩa khác và do đó biểu thức là không referentially transparent.

Noun Programming
referential transparency

Một phương thức (method) / hàm (function) là referentially transparent nếu nó luôn trả về (return) cùng một giá trị cho một đối số (argument) nhất định (tưc là hàm deterministic deterministic function)) và không có bất kỳ tác dụng phụ (side effect) nào khác. Nói các khác nó là pure function.

Bên dưới là ví dụ về hàm là referentially transparent:


int number = 10;
int add(int a, int b) {
    return a + b
}

Đoạn code trên nếu hàm nhận cùng một đối số thì luôn trả về cùng giá trị ví dụ nếu nhận hai đối số là 2 và 3 thì hàm luôn trả về giá trị là 5 và hàm này không có tác dụng phụ (side effect) tức là hàm này không sửa đổi giá trị của biến toàn cục (global variable).

Bên dưới là ví dụ về hàm không phải là là referentially transparent:


int number = 10;
int add(int a) {
    return a + number
}

Hàm trên do thay đổi giá trị của biến toàn cục (tức là có tác dụng phụ) nên không phải là referentially transparent.

Learning English Everyday