Sự khác biệt giữa các ngôn ngữ lập trình chức năng và mệnh lệnh là gì?


159

Hầu hết các ngôn ngữ chính, bao gồm các ngôn ngữ lập trình hướng đối tượng (OOP) như C #, Visual Basic, C ++ và Java được thiết kế để hỗ trợ chủ yếu cho lập trình (thủ tục) bắt buộc, trong khi các ngôn ngữ như Haskell / gofer hoàn toàn là chức năng. Bất cứ ai cũng có thể giải thích về sự khác biệt giữa hai cách lập trình này là gì?

Tôi biết nó phụ thuộc vào yêu cầu của người dùng để chọn cách lập trình nhưng tại sao nên học ngôn ngữ lập trình chức năng?



1
kiểm tra cái này [bài] [1]. Nó mô tả rõ ràng sự khác biệt. [1]: stackoverflow.com/questions/602444/ từ
theta

Câu trả lời:


160

Định nghĩa: Một ngôn ngữ bắt buộc sử dụng một chuỗi các câu lệnh để xác định cách đạt được một mục tiêu nhất định. Các câu lệnh này được cho là thay đổi trạng thái của chương trình khi mỗi câu lệnh được thực thi lần lượt.

Ví dụ: Java là một ngôn ngữ bắt buộc. Ví dụ: một chương trình có thể được tạo để thêm một chuỗi số:

 int total = 0;
 int number1 = 5;
 int number2 = 10;
 int number3 = 15;
 total = number1 + number2 + number3; 

Mỗi câu lệnh thay đổi trạng thái của chương trình, từ việc gán các giá trị cho từng biến cho đến bổ sung cuối cùng của các giá trị đó. Sử dụng một chuỗi năm câu lệnh, chương trình được chỉ dẫn rõ ràng cách cộng các số 5, 10 và 15 lại với nhau.

Ngôn ngữ chức năng: Mô hình lập trình chức năng được tạo ra một cách rõ ràng để hỗ trợ một cách tiếp cận chức năng thuần túy để giải quyết vấn đề. Lập trình hàm là một dạng lập trình khai báo.

Ưu điểm của hàm thuần túy: Lý do chính để thực hiện các phép biến đổi hàm là hàm thuần là các hàm thuần có thể ghép được: đó là, khép kín và không trạng thái. Những đặc điểm này mang lại một số lợi ích, bao gồm những điều sau đây: Tăng khả năng đọc và khả năng duy trì. Điều này là do mỗi hàm được thiết kế để hoàn thành một nhiệm vụ cụ thể được đưa ra đối số của nó. Các chức năng không dựa trên bất kỳ trạng thái bên ngoài.

Phát triển lặp lại dễ dàng hơn. Bởi vì mã dễ tái cấu trúc hơn, các thay đổi về thiết kế thường dễ thực hiện hơn. Ví dụ: giả sử bạn viết một phép biến đổi phức tạp và sau đó nhận ra rằng một số mã được lặp lại nhiều lần trong phép chuyển đổi. Nếu bạn tái cấu trúc thông qua một phương thức thuần túy, bạn có thể gọi phương thức thuần túy của mình theo ý muốn mà không phải lo lắng về tác dụng phụ.

Kiểm tra và gỡ lỗi dễ dàng hơn. Vì các hàm thuần có thể dễ dàng được kiểm tra một cách dễ dàng hơn, bạn có thể viết mã kiểm tra gọi hàm thuần với các giá trị điển hình, trường hợp cạnh hợp lệ và trường hợp cạnh không hợp lệ.

Dành cho người OOP hoặc ngôn ngữ mệnh lệnh:

Các ngôn ngữ hướng đối tượng là tốt khi bạn có một bộ hoạt động cố định trên mọi thứ và khi mã của bạn phát triển, bạn chủ yếu thêm những thứ mới. Điều này có thể được thực hiện bằng cách thêm các lớp mới thực hiện các phương thức hiện có và các lớp hiện có được để lại một mình.

Các ngôn ngữ chức năng là tốt khi bạn có một tập hợp các thứ cố định và khi mã của bạn phát triển, bạn chủ yếu thêm các hoạt động mới vào những thứ hiện có. Điều này có thể được thực hiện bằng cách thêm các hàm mới tính toán với các kiểu dữ liệu hiện có và các hàm hiện có được để lại một mình.

Nhược điểm:

Nó phụ thuộc vào yêu cầu của người dùng để chọn cách lập trình, vì vậy chỉ có hại khi người dùng không chọn đúng cách.

Khi tiến hóa đi sai hướng, bạn có vấn đề:

  • Thêm một hoạt động mới vào một chương trình hướng đối tượng có thể yêu cầu chỉnh sửa nhiều định nghĩa lớp để thêm một phương thức mới
  • Thêm một loại điều mới vào một chương trình chức năng có thể yêu cầu chỉnh sửa nhiều định nghĩa chức năng để thêm trường hợp mới.

10
Hàm thuần túy trong trường hợp này tương đương với hàm toán học. Các đầu vào giống nhau sẽ luôn ánh xạ tới cùng một đầu ra. Chúng cũng không có bất kỳ tác dụng phụ nào (ngoài việc trả về một giá trị hoặc giá trị), điều đó có nghĩa là trình biên dịch có thể thực hiện một số tối ưu hóa thú vị và điều này giúp cho việc chạy song song dễ dàng hơn vì không có gì phải bàn cãi.
WorBlux

Vì vậy, những cách thức đúng đắn và thực hành tốt nhất trong việc soạn thảo các ứng dụng oop có thể duy trì và kiểm tra được có xu hướng thiết kế mã mệnh lệnh với trạng thái suy giảm?
Kemal Gültekin

4
Tôi không thấy sự khác biệt rõ ràng trên văn bản nơi tính năng của mỗi chương trình được tô sáng. Hầu hết các mô tả cho lập trình thủ tục có thể được trao đổi bằng văn bản lập trình mệnh lệnh và ngược lại.
AxeEffect

7
Câu trả lời này cố gắng làm rõ lập trình chức năng là gì nhưng thậm chí không bận tâm đến việc xác định chức năng thuần túy là gì. Tôi không thấy bất cứ ai có thể đọc câu trả lời này và cảm thấy tự tin khi biết sự khác biệt giữa lập trình khai báo và thủ tục.
Ringo

230

Đây là sự khác biệt:

Bắt buộc:

  • Khởi đầu
  • Bật giày cỡ 9 1/2.
  • Đặt phòng trong túi của bạn để giữ một mảng [7] phím.
  • Đặt chìa khóa trong phòng để chìa khóa trong túi.
  • Vào gara.
  • Mở gara.
  • Vào xe.

... và vân vân ...

  • Cho sữa vào tủ lạnh.
  • Dừng lại.

Khai báo, trong đó chức năng là một tiểu thể loại:

  • Sữa là một thức uống tốt cho sức khỏe, trừ khi bạn gặp vấn đề về tiêu hóa đường sữa.
  • Thông thường, một cửa hàng sữa trong tủ lạnh.
  • Tủ lạnh là một hộp giữ cho mọi thứ trong đó mát mẻ.
  • Cửa hàng là nơi bán các mặt hàng.
  • Bằng cách "bán", chúng tôi có nghĩa là trao đổi mọi thứ lấy tiền.
  • Ngoài ra, trao đổi tiền cho những thứ được gọi là "mua".

... và vân vân ...

  • Hãy chắc chắn rằng chúng ta có sữa trong tủ lạnh (khi chúng ta cần nó - cho các ngôn ngữ chức năng lười biếng).

Tóm tắt: Trong các ngôn ngữ bắt buộc, bạn cho máy tính biết cách thay đổi bit, byte và từ trong bộ nhớ và theo thứ tự nào. Trong các chức năng, chúng tôi nói với máy tính những gì, hành động, vv là. Ví dụ: chúng ta nói rằng giai thừa của 0 là 1 và giai thừa của mọi số tự nhiên khác là tích của số đó và là giai thừa của tiền thân của nó. Chúng ta không nói: Để tính giai thừa của n, hãy đặt vùng nhớ và lưu 1 ở đó, sau đó nhân số trong vùng nhớ đó với các số từ 2 đến n và lưu kết quả ở cùng một vị trí và ở cuối, vùng nhớ sẽ chứa giai thừa.


1
Cảm ơn bạn. Đó là một cách tuyệt vời để xem xét nó.
L-Samuels

5
Tôi thích lời giải thích của bạn @Igno, nhưng điều gì đó vẫn chưa rõ ràng với tôi. Trong Declarative, mặc dù bạn chỉ nói nội dung , nhưng bạn vẫn cần thay đổi bit và thay đổi trạng thái trong máy để tiến hành đúng. Nó làm tôi bối rối, rằng bằng cách nào đó Tuyên bố tương tự như Lập trình thủ tục (như Hàm C) , và vẫn có một sự khác biệt lớn giữa chúng trong nội bộ. Không phải C Chức năng giống như Chức năng trong lập trình chức năng (ở cấp độ máy)?
phoenisx

11
@Igno, Giống như Subroto, tôi không thực sự hiểu lời giải thích của bạn. Có vẻ như những gì bạn đã viết có thể được tóm tắt là: Cần câu trả lời ... nhận câu trả lời. nó dường như bỏ qua các bit quan trọng đó là làm thế nào. Tôi không hiểu làm thế nào bạn có thể ẩn phần đó khỏi người dùng, đến một lúc nào đó ai đó phải biết nó đã được thực hiện như thế nào ... bạn không thể giữ thuật sĩ đằng sau bức màn mãi mãi.
Brett Thomas

3
Đây không phải là từ xa những gì tôi hiểu lập trình chức năng được. Tôi nghĩ lập trình chức năng là loại bỏ các đầu vào và đầu ra ẩn khỏi các hàm.
Ringo

7
Giải thích kết luận.
JoeTidee

14

Hầu hết các ngôn ngữ hiện đại ở mức độ khác nhau cả về mệnh lệnh và chức năng nhưng để hiểu rõ hơn về lập trình chức năng, tốt nhất nên lấy một ví dụ về ngôn ngữ chức năng thuần túy như Haskell trái ngược với mã mệnh lệnh trong ngôn ngữ không chức năng như java / c #. Tôi tin rằng nó luôn dễ dàng để giải thích bằng ví dụ, vì vậy dưới đây là một.

Lập trình hàm: tính giai thừa của n tức là n! tức là nx (n-1) x (n-2) x ... x 2 X 1

-- | Haskell comment goes like
-- | below 2 lines is code to calculate factorial and 3rd is it's execution  

factorial 0 = 1
factorial n = n * factorial (n - 1)
factorial 3

-- | for brevity let's call factorial as f; And x => y shows order execution left to right
-- | above executes as := f(3) as 3 x f(2) => f(2) as 2 x f(1) => f(1) as 1 x f(0) => f(0) as 1  
-- | 3 x (2 x (1 x (1)) = 6

Lưu ý rằng Haskel cho phép chức năng nạp chồng đến mức giá trị đối số. Bây giờ dưới đây là ví dụ về mã mệnh lệnh tăng mức độ không hoàn hảo:

//somewhat functional way
function factorial(n) {
  if(n < 1) {
     return 1;
  }
  return n * factorial(n-1);   
}
factorial(3);

//somewhat more imperative way
function imperativeFactor(n) {
  int f = 1
  for(int i = 1; i <= n; i++) {
     f = f * i
  }
  return f;
}

Đọc này có thể là một tài liệu tham khảo tốt để hiểu rằng làm thế nào mã bắt buộc tập trung nhiều hơn vào cách thức một phần, trạng thái của máy (i trong vòng lặp), thứ tự thực hiện, kiểm soát luồng.

Ví dụ sau có thể được xem là mã java / c # lang và phần đầu tiên là giới hạn của chính ngôn ngữ trái ngược với Haskell để làm quá tải hàm theo giá trị (không) và do đó có thể nói nó không phải là ngôn ngữ chức năng thuần túy, mặt khác tay bạn có thể nói nó hỗ trợ prog chức năng. đến một mức độ nào.

Tiết lộ: không có đoạn mã nào ở trên được kiểm tra / thực thi nhưng hy vọng sẽ đủ tốt để truyền đạt khái niệm; Ngoài ra tôi sẽ đánh giá cao ý kiến ​​cho bất kỳ sửa chữa như vậy :)


1
Có nên không return n * factorial(n-1);?
jinawee

@jinawee, cảm ơn vì đã chỉ ra, tôi đã sửa nó từn * (n-1)
thầy tu cũ

10

Lập trình hàm là một dạng lập trình khai báo, mô tả logic tính toán và thứ tự thực hiện hoàn toàn không được nhấn mạnh.

Vấn đề: Tôi muốn thay đổi sinh vật này từ ngựa thành hươu cao cổ.

  • Kéo dài cổ
  • Kéo dài chân
  • Áp dụng điểm
  • Cho sinh vật một cái lưỡi đen
  • Bỏ đuôi ngựa

Mỗi mục có thể được chạy theo bất kỳ thứ tự nào để tạo ra cùng một kết quả.

Lập trình mệnh lệnh là thủ tục. Nhà nước và trật tự là quan trọng.

Vấn đề: Tôi muốn đỗ xe.

  1. Lưu ý trạng thái ban đầu của cửa gara
  2. Dừng xe ở đường lái xe
  3. Nếu cửa gara bị đóng, mở cửa gara, hãy nhớ trạng thái mới; nếu không thì tiếp tục
  4. Kéo xe vào gara
  5. Đóng cửa nhà để xe

Mỗi bước phải được thực hiện để đạt được kết quả mong muốn. Kéo vào gara trong khi cửa gara bị đóng sẽ dẫn đến cửa gara bị hỏng.


Tôi chỉ thấy sự khác biệt trong async so với sync.
Vladimir Vukanac

@VladimirVukanac async / sync là một cơ chế, không phải là một hình thức lập trình
Jakub Keller

2
Ồ, cảm ơn, tôi sẽ nghiên cứu thêm về nó. Bạn có tử tế không, để cập nhật vấn đề 1 giống như vấn đề 2 "Tôi muốn đỗ xe" nhưng được viết theo cách lập trình chức năng? Sau đó song song sẽ được loại trừ.
Vladimir Vukanac

6

Lập trình hàm là "lập trình với các hàm", trong đó một hàm có một số tính chất toán học dự kiến, bao gồm cả độ trong suốt tham chiếu. Từ các tính chất này, dòng tính chất tiếp theo, đặc biệt là các bước lý luận quen thuộc được kích hoạt bởi tính thay thế dẫn đến bằng chứng toán học (nghĩa là chứng minh sự tin cậy trong kết quả).

Theo sau đó là một chương trình chức năng chỉ là một biểu thức.

Bạn có thể dễ dàng thấy sự tương phản giữa hai kiểu bằng cách lưu ý các vị trí trong một chương trình bắt buộc trong đó một biểu thức không còn trong suốt tham chiếu (và do đó không được xây dựng với các hàm và giá trị và bản thân nó không thể là một phần của hàm). Hai vị trí rõ ràng nhất là: đột biến (ví dụ: biến) các luồng tác dụng phụ không cục bộ khác (ví dụ: ngoại lệ)

Trên khung chương trình biểu thức bao gồm các hàm và giá trị này, được xây dựng toàn bộ mô hình thực tế của ngôn ngữ, khái niệm, "mẫu chức năng", tổ hợp và các hệ thống loại và thuật toán đánh giá khác nhau.

Theo định nghĩa cực đoan nhất, hầu hết mọi ngôn ngữ mà thậm chí C hoặc Java có thể được gọi là chức năng, nhưng thông thường mọi người dành thuật ngữ cho các ngôn ngữ có sự trừu tượng hóa cụ thể (như đóng cửa, giá trị bất biến và hỗ trợ cú pháp như khớp mẫu). Đối với việc sử dụng lập trình chức năng có liên quan, nó liên quan đến việc sử dụng các dấu chấm câu và xây dựng mã mà không có bất kỳ tác dụng phụ nào. dùng để viết bằng chứng


3

Phong cách lập trình bắt buộc đã được thực hiện trong phát triển web từ năm 2005 đến năm 2013.

Với lập trình bắt buộc, chúng tôi đã viết ra mã liệt kê chính xác những gì ứng dụng của chúng tôi nên làm, từng bước một.

Phong cách lập trình chức năng tạo ra sự trừu tượng thông qua các cách kết hợp các chức năng thông minh.

Có đề cập đến lập trình khai báo trong các câu trả lời và liên quan đến việc tôi sẽ nói rằng lập trình khai báo liệt kê một số quy tắc mà chúng ta phải tuân theo. Sau đó, chúng tôi cung cấp những gì chúng tôi đề cập đến như một số trạng thái ban đầu cho ứng dụng của mình và chúng tôi để những quy tắc đó xác định cách ứng dụng hoạt động.

Bây giờ, những mô tả nhanh này có lẽ không có nhiều ý nghĩa, vì vậy hãy đi qua sự khác biệt giữa lập trình mệnh lệnh và khai báo bằng cách đi qua một sự tương tự.

Hãy tưởng tượng rằng chúng tôi không xây dựng phần mềm, mà thay vào đó chúng tôi nướng bánh để kiếm sống. Có lẽ chúng ta là những người làm bánh tồi và không biết cách nướng một chiếc bánh ngon theo cách chúng ta nên làm.

Vì vậy, ông chủ của chúng tôi cung cấp cho chúng tôi một danh sách các hướng dẫn, những gì chúng ta biết là một công thức.

Công thức sẽ cho chúng ta biết làm thế nào để làm cho một chiếc bánh. Một công thức được viết theo phong cách bắt buộc như vậy:

  1. Trộn 1 chén bột
  2. Thêm 1 quả trứng
  3. Thêm 1 chén đường
  4. Đổ hỗn hợp vào chảo
  5. Đặt chảo vào lò nướng trong 30 phút và 350 độ F.

Công thức khai báo sẽ làm như sau:

1 chén bột mì, 1 quả trứng, 1 chén đường - Trạng thái ban đầu

Quy tắc

  1. Nếu mọi thứ trộn đều, đặt vào chảo.
  2. Nếu mọi thứ không trộn lẫn, đặt vào bát.
  3. Nếu mọi thứ trong chảo, đặt trong lò nướng.

Vì vậy, phương pháp tiếp cận bắt buộc được đặc trưng bởi các phương pháp tiếp cận từng bước. Bạn bắt đầu với bước một và chuyển sang bước 2 và cứ thế.

Cuối cùng bạn kết thúc với một số sản phẩm cuối cùng. Vì vậy, làm chiếc bánh này, chúng tôi lấy những nguyên liệu này trộn chúng, cho vào chảo và trong lò nướng và bạn đã có sản phẩm cuối cùng.

Trong một thế giới khai báo, nó khác nhau. Trong công thức khai báo, chúng tôi sẽ tách công thức của chúng tôi thành hai phần riêng biệt, bắt đầu với một phần liệt kê trạng thái ban đầu của công thức, như các biến. Vì vậy, các biến của chúng tôi ở đây là số lượng thành phần của chúng tôi và loại của chúng.

Chúng tôi lấy trạng thái ban đầu hoặc thành phần ban đầu và áp dụng một số quy tắc cho chúng.

Vì vậy, chúng tôi lấy trạng thái ban đầu và vượt qua các quy tắc này nhiều lần cho đến khi chúng tôi sẵn sàng ăn bánh dâu tây đại hoàng hoặc bất cứ điều gì.

Vì vậy, trong một cách tiếp cận khai báo, chúng ta phải biết cách cấu trúc đúng các quy tắc này.

Vì vậy, các quy tắc chúng tôi có thể muốn kiểm tra các thành phần hoặc trạng thái của chúng tôi, nếu trộn, đặt chúng vào chảo.

Với trạng thái ban đầu của chúng tôi, điều đó không phù hợp vì chúng tôi chưa trộn các thành phần của chúng tôi.

Vì vậy, quy tắc 2 nói, nếu chúng không trộn thì trộn chúng vào một cái bát. Được rồi, quy tắc này được áp dụng.

Bây giờ chúng tôi có một bát các thành phần hỗn hợp như nhà nước của chúng tôi.

Bây giờ chúng tôi áp dụng trạng thái mới đó cho các quy tắc của chúng tôi một lần nữa.

Vì vậy, quy tắc 1 nói rằng nếu các thành phần được trộn chúng vào chảo, được rồi, bây giờ quy tắc 1 được áp dụng, hãy làm điều đó.

Bây giờ chúng ta có trạng thái mới này, nơi các thành phần được trộn và trong chảo. Quy tắc 1 không còn phù hợp, quy tắc 2 không áp dụng.

Quy tắc 3 nói rằng nếu các thành phần nằm trong chảo, hãy đặt chúng vào lò nướng, thật tuyệt, quy tắc đó là những gì áp dụng cho trạng thái mới này, hãy thực hiện nó.

Và chúng tôi kết thúc với một chiếc bánh táo nóng hổi thơm ngon hoặc bất cứ thứ gì.

Bây giờ, nếu bạn giống như tôi, bạn có thể nghĩ, tại sao chúng ta vẫn không làm chương trình bắt buộc. Điều này thật ý nghĩa.

Vâng, đối với các luồng đơn giản thì có, nhưng hầu hết các ứng dụng web có các luồng phức tạp hơn mà không thể nắm bắt chính xác bằng thiết kế lập trình bắt buộc.

Trong một cách tiếp cận khai báo, chúng ta có thể có một số thành phần ban đầu hoặc trạng thái ban đầu như textInput=“”, một biến duy nhất.

Có thể nhập văn bản bắt đầu như một chuỗi trống.

Chúng tôi lấy trạng thái ban đầu này và áp dụng nó cho một bộ quy tắc được xác định trong ứng dụng của bạn.

  1. Nếu người dùng nhập văn bản, cập nhật nhập văn bản. Vâng, ngay bây giờ không áp dụng.

  2. Nếu mẫu được hiển thị, tính toán các widget.

  3. Nếu textInput được cập nhật, hãy kết xuất lại mẫu.

Chà, không có cái nào trong số này áp dụng nên chương trình sẽ chỉ chờ một sự kiện xảy ra.

Vì vậy, tại một số điểm, người dùng cập nhật kiểu nhập văn bản và sau đó chúng tôi có thể áp dụng quy tắc số 1.

Chúng tôi có thể cập nhật điều đó thành “abcd”

Vì vậy, chúng tôi vừa cập nhật văn bản và cập nhật textInput, quy tắc số 2 không áp dụng, quy tắc số 3 cho biết nếu nhập văn bản là cập nhật, sau đó xảy ra, sau đó kết xuất lại mẫu và sau đó chúng tôi quay lại quy tắc 2 nói rằng nếu mẫu được hiển thị , tính toán các widget, okay cho phép tính toán các widget.

Nói chung, là lập trình viên, chúng tôi muốn phấn đấu cho các thiết kế lập trình khai báo nhiều hơn.

Bắt buộc có vẻ rõ ràng và rõ ràng hơn, nhưng một cách tiếp cận khai báo quy mô rất độc đáo cho các ứng dụng lớn hơn.


2

• Ngôn ngữ bắt buộc:

  • Thực hiện hiệu quả

  • Ngữ nghĩa phức tạp

  • Cú pháp phức tạp

  • Đồng thời được lập trình viên thiết kế

  • Thử nghiệm phức tạp, không có tính minh bạch tham chiếu, có tác dụng phụ

  • Có nhà nước

• Ngôn ngữ chức năng:

  • Ngữ nghĩa đơn giản

  • Cú pháp đơn giản

  • Thực thi kém hiệu quả

  • Các chương trình có thể tự động được thực hiện đồng thời

  • Thử nghiệm đơn giản, có tính minh bạch tham chiếu, không có tác dụng phụ

  • Không có nhà nước

1

Tôi nghĩ rằng có thể diễn đạt lập trình chức năng theo cách bắt buộc:

  • Sử dụng nhiều kiểm tra trạng thái của các đối tượng và if... else/ switchcâu lệnh
  • Một số cơ chế thời gian chờ / chờ đợi để chăm sóc sự không bình thường

Có những vấn đề lớn với cách tiếp cận như vậy:

  • Quy tắc / thủ tục được lặp lại
  • Trạng thái để lại cơ hội cho tác dụng phụ / sai lầm

Lập trình chức năng, xử lý các chức năng / phương pháp như đối tượng và chấp nhận trạng thái không trạng thái, được sinh ra để giải quyết những vấn đề mà tôi tin.

Ví dụ về cách sử dụng: các ứng dụng lối vào như Android, iOS hoặc logic của ứng dụng web bao gồm. giao tiếp với phụ trợ.

Những thách thức khác khi mô phỏng lập trình chức năng với mã bắt buộc / quy trình:

  • Điều kiện của cuộc đua
  • Sự kết hợp phức tạp và chuỗi các sự kiện. Ví dụ: người dùng cố gắng gửi tiền trong ứng dụng ngân hàng. Bước 1) Thực hiện song song tất cả các thao tác sau, chỉ tiến hành nếu tất cả đều tốt a) Kiểm tra xem người dùng có còn tốt không (lừa đảo, AML) b) kiểm tra xem người dùng có đủ số dư c) Kiểm tra xem người nhận có hợp lệ và tốt không (lừa đảo, AML) vv Bước 2) thực hiện thao tác chuyển Bước 3) Hiển thị cập nhật về số dư của người dùng và / hoặc một số loại theo dõi. Với RxJava chẳng hạn, mã này ngắn gọn và hợp lý. Không có nó, tôi có thể tưởng tượng sẽ có rất nhiều mã, mã lộn xộn và dễ bị lỗi

Tôi cũng tin rằng vào cuối ngày, mã chức năng sẽ được dịch sang mã lắp ráp hoặc mã máy là bắt buộc / thủ tục bởi các trình biên dịch. Tuy nhiên, trừ khi bạn viết lắp ráp, vì con người viết mã với ngôn ngữ cấp độ cao / dễ đọc của con người, lập trình chức năng là cách diễn đạt phù hợp hơn cho các tình huống được liệt kê


-1

Tôi biết câu hỏi này đã cũ hơn và những người khác đã giải thích nó tốt, tôi muốn đưa ra một vấn đề ví dụ giải thích tương tự bằng các thuật ngữ đơn giản.

Vấn đề: Viết bảng 1.

Giải pháp: -

Theo phong cách bắt buộc: =>

    1*1=1
    1*2=2
    1*3=3
    .
    .
    .
    1*n=n 

Theo kiểu chức năng: =>

    1
    2
    3
    .
    .
    .
    n

Giải thích theo phong cách Bắt buộc, chúng tôi viết các hướng dẫn rõ ràng hơn và có thể được gọi là theo cách đơn giản hơn.

Như trong phong cách Chức năng, những thứ tự giải thích sẽ bị bỏ qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.