scoubidoubidou
Junior Member
Hôm nay có đọc được thread các bác so sánh giữa OOP và Functional Programming (FP), mình từng làm việc trên Java OOP, Elixir (chỉ có FP) và cũng khá thích dùng FP trên Java với Javascript nên mình nghĩ FP không thể so sánh với OOP vì bản chất 2 cái đó khác nhau, FP có thể dùng trong OOP được.
Một số điểm mạnh của FP (declarative programming) so với imperative programming: dễ hiểu, dễ sửa, dễ test, tránh được side effects, multi thread dễ
Học dễ nhất là qua ví dụ nên mình đưa ra những ví dụ cơ bản của 2 trường phái hoặc các bác post ví dụ của 1 trong hai trường phái lên rồi mọi người convert qua trường phái còn lại để xem cách nào hiệu quả hơn trong mỗi trường hợp
Ví dụ #1:
Cho list các posts của 1 forum, tính trung bình số từ của bài viết theo tác giả:
Imperative:
FP:
Ví dụ #2: Multi-threading (Java)
Tính tổng bình phương của các số chẵn, bài này để ví dụ việc dùng multi thread rất dễ trong java bằng FP
Imperative:
FP:
Đó là những ví dụ cơ bản còn trong thực tế mình dùng Elixir không có type nên nhiều khi rất là rối, phải chia ra các pure functions dễ hiểu và viết docs cho các function phức tạp nếu không thì nhìn vô cũng không khác gì imperative.
Một số điểm mạnh của FP (declarative programming) so với imperative programming: dễ hiểu, dễ sửa, dễ test, tránh được side effects, multi thread dễ
Học dễ nhất là qua ví dụ nên mình đưa ra những ví dụ cơ bản của 2 trường phái hoặc các bác post ví dụ của 1 trong hai trường phái lên rồi mọi người convert qua trường phái còn lại để xem cách nào hiệu quả hơn trong mỗi trường hợp
Ví dụ #1:
Cho list các posts của 1 forum, tính trung bình số từ của bài viết theo tác giả:
JavaScript:
const articles = [
{ author: 'Alice', title: 'Article 1', content: 'Lorem ipsum dolor sit amet.' },
{ author: 'Bob', title: 'Article 2', content: 'Consectetur adipiscing elit, sed do eiusmod.' },
{ author: 'Alice', title: 'Article 3', content: 'Ut enim ad minim veniam.' },
{ author: 'Charlie', title: 'Article 4', content: 'Quis nostrud exercitation ullamco laboris.' },
];
Imperative:
JavaScript:
function calculateAverageWordCountImperative(articles, author) {
let sum = 0;
let count = 0;
for (const article of articles) {
if (article.author === author) {
sum += article.content.split(/\s+/).length;
count++;
}
}
return count ? sum / count : 0;
}
FP:
JavaScript:
function calculateAverageWordCountFunctional(articles, author) {
const { sum, count } = articles
.filter(article => article.author === author)
.map(article => article.content.split(/\s+/).length)
.reduce((acc, nbWord) => ({ sum: acc.sum + nbWord, count: acc.count + 1 }), { sum: 0, count: 0 });
return count ? sum / count : 0;
}
Ví dụ #2: Multi-threading (Java)
Tính tổng bình phương của các số chẵn, bài này để ví dụ việc dùng multi thread rất dễ trong java bằng FP
Imperative:
Java:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
long sumOfSquaresOfEvens = 0;
for (int number : numbers) {
if (number % 2 == 0) {
sumOfSquaresOfEvens += number*number;
}
}
FP:
Java:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
long sumOfSquaresOfEvens = numbers.parallelStream()
.filter(number -> number % 2 == 0)
.mapToLong(number -> number * number)
.sum();
Đó là những ví dụ cơ bản còn trong thực tế mình dùng Elixir không có type nên nhiều khi rất là rối, phải chia ra các pure functions dễ hiểu và viết docs cho các function phức tạp nếu không thì nhìn vô cũng không khác gì imperative.