Hàm thuần túy là gì?
Chà, một chức năng thuần túy trông như thế này.
Chúng tôi có một chức năng.
Vì vậy, thay vì một hộp mà trước đây chúng ta có các đối tượng của tất cả các chức năng này, thay vào đó hãy nghĩ đây chỉ
là một chức năng đơn giản.
Và giả sử chúng tôi cung cấp cho nó một danh sách chứa một, hai và ba.
Nếu chúng ta đưa đầu vào này vào hàm này, điều chúng ta mong đợi với một hàm thuần túy là điều gì đó xảy
ra với đầu vào này mà mọi lúc đều cho kết quả giống nhau.
Vì vậy, giả sử chúng ta nhân số này với hai, chúng ta sẽ nhận được hai, bốn và sáu.
Bây giờ một hàm thuần túy có hai quy tắc.
Một là cho cùng một đầu vào, nó sẽ luôn trả về cùng một đầu ra.
Có nghĩa là, mỗi khi chúng ta đưa một, hai và ba vào danh sách này, chúng ta đưa nó cho một hàm mà chúng ta tạo.
Nó sẽ luôn trả về cùng một đầu ra.
Vì vậy, nếu tôi chạy hàm này hàng triệu lần với cùng một đầu vào, nó sẽ dẫn đến cùng một đầu ra.
Và điểm thứ hai là ý tưởng về một chức năng không được tạo ra bất kỳ tác dụng phụ nào.
Tác dụng phụ là gì?
Tác dụng phụ là những thứ mà một chức năng làm ảnh hưởng đến thế giới bên ngoài.
Ví dụ, nếu tôi in thứ gì đó bên trong hàm này, nó sẽ ảnh hưởng đến thế giới bên ngoài, phải không?
Bởi vì tôi đang in thứ gì đó lên màn hình.
Màn hình là thế giới bên ngoài.
Hoặc ví dụ, nếu hàm này chạm vào một biến nằm ngoài một phạm vi khác, thì đó là
một tác dụng phụ.
Hãy xem mã để hiểu khái niệm này hơn một chút.
Giả sử chúng ta đã có một hàm và sau đó hàm này sẽ nhân lên.
Bằng cách vào một danh sách.
Vì vậy, hãy chỉ nói một đồng minh, đó sẽ là danh sách của chúng tôi.
Và ở đây, những gì chúng tôi muốn làm là lặp lại mục này.
Trong danh sách.
Và sau đó mỗi mục chúng ta muốn nhân lên và thêm vào một danh sách mới.
Vì vậy, hãy tạo một danh sách mới sẽ là một danh sách trống.
Và ở đây chúng tôi sẽ nói danh sách mới, chấm thêm.
Và làm mục nhân với hai.
Và cuối cùng, khi kết thúc chức năng này, chúng ta muốn trả về danh sách mới.
Hãy thử đi.
Nếu tôi nói nhân với hai và cho nó một, hai, ba, và chúng ta hãy in ra.
Đây là đầu ra.
Nếu tôi bấm Chạy.
Tôi nhận được hai cho sáu?
Đây có phải là một chức năng thuần túy?
Hãy suy nghĩ về điều này.
Quy tắc đầu tiên, với cùng một đầu vào, đó là một, hai và ba.
Nó sẽ luôn trả về cùng một đầu ra.
Bất kể tôi chạy nó bao nhiêu lần, nó sẽ luôn cho tôi một kết quả như nhau.
Vì vậy, chúng tôi đã vượt qua bài kiểm tra đầu tiên.
Còn bài kiểm tra thứ hai thì sao?
Rằng nó không tạo ra tác dụng phụ.
Điều này có tạo ra bất kỳ tác dụng phụ nào không?
Điều này có đụng chạm gì đến thế giới bên ngoài không?
Hãy suy nghĩ về nó.
Không, nó không.
Đúng.
Không có gì ở thế giới bên ngoài quan trọng đối với chức năng này.
Bởi vì tất cả mọi thứ được chứa trong đây.
Ví dụ, nếu thay vì có chữ in ở đây, chúng ta chỉ cần có bản in.
Và đây.
Nếu tôi bấm Chạy.
Chúng tôi nhận được cùng một sản lượng.
Nhưng điều này có tác dụng phụ không?
Vâng, có, nó có.
Nó tương tác với thế giới bên ngoài, đó là bản in.
Câu lệnh in cho tôi biết, này, tôi sẽ in trên bất cứ thứ gì mà máy này có màn hình.
Trong trường hợp của chúng tôi, nó sẽ in ở đây, nhưng chúng tôi không thực sự biết câu lệnh in làm gì
vì nó tương tác với màn hình ở bên này.
Vì vậy, điều này.
Có tác dụng phụ.
Chúng tôi trao quyền kiểm soát việc in, nhưng chúng tôi không biết quá trình in sẽ diễn ra như thế nào.
Một ví dụ khác mà tôi có thể cung cấp cho bạn.
Đây có phải là điều gì xảy ra nếu chúng ta có một danh sách mới ở đây mà chúng ta thực sự xác định bên ngoài?
Như vậy.
Vì vậy, chúng tôi có danh sách mới như thế này.
Nếu tôi bấm Chạy.
Tôi vẫn nhận được hai cho sáu.
Nhưng điều này có tác dụng phụ không?
Vâng, có, nó có.
Nó tương tác với thế giới bên ngoài.
Và những gì bên ngoài thế giới này của một chức năng, hãy nhớ rằng, là phạm vi.
Chà, nó tương tác với danh sách mới này.
Nó mở ra danh sách mới này.
Vì vậy, nếu một lập trình viên đi cùng và có thể trước khi chúng tôi chạy chức năng này, chúng tôi quyết định đưa ra danh sách mới.
Chúng tôi thay đổi nó thành một chuỗi rỗng.
Vâng khi tôi chạy chức năng này.
Tôi gặp lỗi vì bây giờ danh sách mới này là một đối tượng chuỗi.
Vì vậy, danh sách mới tồn tại ở thế giới bên ngoài của chức năng này có thể được sửa đổi bởi một nhà phát triển khác hoặc bởi
một chương trình và chúng tôi sẽ biết về nó.
Và khi chúng tôi chạy chức năng này, nó sẽ báo lỗi cho chúng tôi.
Nó có một tác dụng phụ.
Vì vậy, lý tưởng nhất là chúng ta chứa các chức năng của mình.
Và làm cho chúng tinh khiết bởi vì như bạn có thể thấy, chúng tôi sẽ không bao giờ có lỗi hoặc lỗi trong mã của chúng tôi trừ
khi chúng tôi viết sai ở đây.
Nhưng bởi vì chúng ta không quan tâm đến thế giới bên ngoài, bởi vì mọi thứ chúng ta cung cấp như
một đầu vào luôn tạo ra một đầu ra tốt, nó sẽ thuần túy.
Bây giờ, thật khó để hiểu tại sao đây lại là một khái niệm mạnh mẽ như vậy nếu không có một chút kinh nghiệm ở nơi
làm việc.
Nhưng hãy để tôi nói với bạn điều này, rằng khi bạn có các chức năng thuần túy.
Bạn có ít mã lỗi hơn, bạn có thể kiểm tra mã của mình tốt hơn.
Nó dễ dàng hơn để hiểu mã của bạn và tổng thể.
Bạn có những lợi ích này là không để các phần khác nhau của mã chạm vào nhau và ảnh hưởng đến nhau, điều này làm
cho cuộc sống của bạn với tư cách là một lập trình viên dễ dàng hơn rất nhiều.
Vì vậy, ý tưởng về các chức năng thuần túy này thực sự quan trọng.
Nhưng một điều tôi muốn bạn rút ra từ điều này là các hàm thuần túy mang tính hướng dẫn nhiều hơn
là tuyệt đối.
Không thể có các hàm thuần túy ở khắp mọi nơi, bởi vì nếu một hàm hoàn toàn không ảnh hưởng đến thế giới bên ngoài, thì
chúng ta sẽ không có bất kỳ chương trình nào.
Chúng tôi sẽ không thể hiển thị mọi thứ.
Chúng tôi sẽ không thể lưu những thứ như hồ sơ trò chơi của chúng tôi.
Vì vậy, không thể có các chức năng thuần túy ở khắp mọi nơi.
Tuy nhiên, khi bạn có thể, bất cứ khi nào bạn có thể, lập trình hàm dạy chúng ta rằng các hàm của bạn là
tốt.
Cố gắng tạo các hàm thuần túy và chỉ có một số hàm không thuần túy có thể tương tác với thế giới bên ngoài mà chúng ta
có thể quay lại bất cứ khi nào chúng ta có lỗi trong mã của mình.
Bởi vì rất có thể đó là những cái sẽ có lỗi sau đó là những chức năng thuần túy như thế này.
Để hoàn thiện khái niệm của chúng tôi về lập trình chức năng.
Ví dụ: nếu đây là trình hướng dẫn của chúng tôi từ các video trước với lập trình chức năng, chúng tôi sẽ có
một đối tượng trình hướng dẫn.
Hoặc từ điển Wizard đã có tên.
Hãy nói Merlin.
Và sức mạnh.
Trong số 50.
Và thay vì chứa những thứ này trong một lớp, tôi sẽ có các phương thức khác nhau, chẳng hạn như tấn công.
Và đây không phải là một phương pháp.
Nó sẽ là một hàm vì nó không nằm bên trong một lớp.
Trong lập trình chức năng.
Họ nói, Này, chúng ta không cần kết hợp dữ liệu với các hàm, hãy tách chúng ra.
Hãy chỉ tạo các hàm thuần túy có thể được thông qua.
Bất cứ điều gì giống như một nhân vật.
Và bằng cách này, chúng tôi giữ hai thứ đó tách biệt để chúng tôi có thể tập trung vào các chức năng thuần túy và chúng tôi có thể tập trung
vào dữ liệu.
Vì vậy, đó là nơi sự khác biệt.
Vào cuối ngày, tất cả là cố gắng giữ cho mã của chúng tôi sạch sẽ và tránh các lỗi trong mã của chúng tôi.
Một vấn đề lớn mà các lập trình viên luôn gặp phải.
Vì vậy, đó chỉ là một cách nghĩ khác.
Chúng ta hãy tìm hiểu thêm một số trong video tiếp theo.