Facebook Pixel
Searching...
فارسی
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Functional JavaScript

Functional JavaScript

Introducing Functional Programming with Underscore.js
توسط Michael Fogus 2013 258 صفحات
4.07
100+ امتیازها
گوش دادن
Listen to Summary

نکات کلیدی

1. جاوااسکریپت از برنامه‌نویسی تابعی از طریق توابع درجه یک پشتیبانی می‌کند

یک تابع درجه یک تابعی است که می‌تواند در هر جایی که هر مقدار دیگری می‌تواند قرار گیرد—محدودیت‌های کمی وجود دارد.

توابع به عنوان مقادیر. در جاوااسکریپت، توابع می‌توانند به متغیرها اختصاص داده شوند، به عنوان آرگومان به توابع دیگر منتقل شوند، از توابع بازگردانده شوند و در ساختارهای داده ذخیره شوند. این انعطاف‌پذیری تکنیک‌های برنامه‌نویسی تابعی را ممکن می‌سازد. به عنوان مثال:

  • اختصاص یک تابع به یک متغیر: var square = function(x) { return x * x; }
  • انتقال یک تابع به عنوان آرگومان: [1, 2, 3].map(function(x) { return x * 2; })
  • بازگرداندن یک تابع: function makeAdder(x) { return function(y) { return x + y; }; }

این ویژگی درجه یک توابع، پایه‌گذار بسیاری از الگوهای برنامه‌نویسی تابعی در جاوااسکریپت است.

2. توابع مرتبه بالاتر کلید برنامه‌نویسی تابعی در جاوااسکریپت هستند

توابع مرتبه بالاتر که توابع دیگر را در بر می‌گیرند، تکنیک بسیار قدرتمندی برای ساخت انتزاعات هستند.

انتزاعات قدرتمند. توابع مرتبه بالاتر یا توابع را به عنوان آرگومان می‌پذیرند یا توابع را به عنوان نتیجه بازمی‌گردانند. این امکان را برای انتزاعات قدرتمند و استفاده مجدد از کد فراهم می‌کند. مثال‌های رایج شامل:

  • map: تبدیل هر عنصر در یک مجموعه
  • reduce: ترکیب عناصر یک مجموعه به یک مقدار واحد
  • filter: انتخاب عناصر از یک مجموعه بر اساس یک پیش‌شرط

این توابع به شما اجازه می‌دهند عملیات پیچیده را به طور مختصر بیان کنید و رفتارها را ترکیب کنید. به عنوان مثال:

const numbers = [1, 2, 3, 4, 5];
const evenSquares = numbers
  .filter(x => x % 2 === 0)
  .map(x => x * x);

این کد به وضوح نیت انتخاب اعداد زوج و مربع کردن آن‌ها را بیان می‌کند، بدون اینکه به طور صریح حلقه‌ها یا آرایه‌های میانی را مدیریت کند.

3. بستن‌ها تکنیک‌های قدرتمند تابعی را در جاوااسکریپت امکان‌پذیر می‌سازند

یک بستن، تابعی است که پیوندهای خارجی (یعنی نه آرگومان‌های خود) را که در دامنه‌ای که در آن تعریف شده است برای استفاده بعدی (حتی پس از اتمام آن دامنه) در بر می‌گیرد.

محصورسازی و حالت. بستن‌ها به توابع اجازه می‌دهند که متغیرها را از دامنه خارجی خود "به خاطر بسپارند" و به آن‌ها دسترسی داشته باشند، حتی پس از اتمام اجرای آن دامنه. این امکان را فراهم می‌کند:

  • حالت خصوصی: ایجاد متغیرهایی که تنها از طریق توابع خاص قابل دسترسی هستند
  • کارخانه‌های تابعی: تولید توابع تخصصی بر اساس پارامترها
  • کاربرد جزئی: ایجاد توابع جدید با ثابت کردن برخی آرگومان‌های توابع موجود

مثالی از یک بستن که حالت خصوصی را حفظ می‌کند:

function counter() {
  let count = 0;
  return function() {
    return ++count;
  };
}

const increment = counter();
increment(); // 1
increment(); // 2

متغیر count به طور مستقیم قابل دسترسی نیست، اما تابع بازگشتی می‌تواند به آن دسترسی پیدا کند و آن را تغییر دهد.

4. ترکیب توابع اجازه می‌دهد رفتارهای پیچیده از اجزای ساده ساخته شوند

برنامه‌نویسی تابعی درباره جدا کردن برنامه‌ها و دوباره سرهم کردن آن‌ها از همان اجزا، که پشت مرزهای تابعی انتزاع شده‌اند، است.

ساخت پیچیدگی. ترکیب توابع فرآیند ترکیب دو یا چند تابع برای ایجاد یک تابع جدید است. این امکان را به شما می‌دهد:

  • ایجاد رفتارهای پیچیده از اجزای ساده و قابل استفاده مجدد
  • بهبود خوانایی کد با شکستن عملیات پیچیده
  • افزایش قابلیت نگهداری با جداسازی و آزمایش واحدهای کوچک‌تر عملکرد

ترکیب می‌تواند از طریق روش‌های مختلفی انجام شود:

  • ترکیب دستی: const f = x => h(g(x))
  • توابع کمکی: const compose = (f, g) => x => f(g(x))
  • کتابخانه‌هایی مانند Ramda یا Lodash/FP

مثالی از ساخت یک خط پردازش داده از طریق ترکیب:

const processData = compose(
  summarize,
  filterOutliers,
  normalize,
  parseInput
);

این به وضوح مراحل پردازش داده را بدون شلوغ کردن کد با جزئیات پیاده‌سازی نشان می‌دهد.

5. توابع خالص و عدم تغییر منجر به کدهای قابل پیش‌بینی‌تر می‌شوند

برنامه‌نویسی با توابع خالص ممکن است به شدت محدودکننده به نظر برسد. [...] با این حال، زمانی که دیدگاه لیبرالی نسبت به تغییر حالت را اعمال می‌کنید، در واقع امکانات خود را در ترکیب محدود می‌کنید، توانایی خود را برای استدلال در مورد اثرات هر بیانیه خاص پیچیده‌تر می‌کنید و آزمایش کد خود را دشوارتر می‌سازید.

قابلیت پیش‌بینی و آزمایش‌پذیری. توابع خالص همیشه برای ورودی‌های مشخص همان خروجی را تولید می‌کنند و هیچ اثر جانبی ندارند. این، همراه با داده‌های غیرقابل تغییر:

  • استدلال درباره رفتار کد را ساده‌تر می‌کند
  • آزمایش و اشکال‌زدایی را آسان‌تر می‌سازد
  • امکان موازی‌سازی و ذخیره‌سازی ایمن را فراهم می‌کند

استراتژی‌هایی برای حفظ خلوص و عدم تغییر:

  • استفاده از const برای متغیرهایی که نباید تغییر کنند
  • ایجاد اشیاء/آرایه‌های جدید به جای تغییر اشیاء موجود
  • استفاده از کتابخانه‌هایی مانند Immutable.js برای ساختارهای داده غیرقابل تغییر کارآمد

مثالی از یک تابع خالص:

function addToCart(cart, item) {
  return [...cart, item];
}

این تابع اصل سبد خرید را تغییر نمی‌دهد و پیگیری تغییرات و پیش‌بینی رفتار را آسان‌تر می‌کند.

6. بازگشت یک جایگزین برای حلقه‌ها در برنامه‌نویسی تابعی فراهم می‌کند

با استفاده از بازگشت، حالت از طریق آرگومان‌های تابع مدیریت می‌شود و تغییر از طریق آرگومان‌ها از یک فراخوانی بازگشتی به بعدی مدل‌سازی می‌شود.

راه‌حل‌های زیبا. بازگشت اغلب منجر به راه‌حل‌های زیباتر و مختصرتر برای مشکلاتی می‌شود که شامل ساختارهای سلسله‌مراتبی یا تکراری هستند. مزایا شامل:

  • بیان طبیعی برخی الگوریتم‌ها (مانند پیمایش درخت)
  • اجتناب از حالت قابل تغییر که معمولاً با حلقه‌ها همراه است
  • پتانسیل بهینه‌سازی‌های کامپایلر (بهینه‌سازی فراخوانی دمی)

با این حال، باید از خطرات سرریز پشته در جاوااسکریپت آگاه باشید، که در بیشتر محیط‌ها بهینه‌سازی فراخوانی دمی را ندارد. تکنیک‌هایی برای کاهش این خطرات شامل:

  • ترامپولین: بسته‌بندی فراخوانی‌های بازگشتی در thunkها
  • سبک انتقال ادامه: مدیریت صریح پشته فراخوانی

مثالی از یک تابع بازگشتی برای صاف کردن یک آرایه تو در تو:

function flatten(arr) {
  return arr.reduce((flat, next) => 
    flat.concat(Array.isArray(next) ? flatten(next) : next), 
  []);
}

7. برنامه‌نویسی تابعی جریان داده و خطوط تبدیل را تسهیل می‌کند

خطوط تبدیل باید خالص باشند—هیچ داده‌ای با عبور از آن آسیب نمی‌بیند.

تبدیلات داده واضح. برنامه‌نویسی تابعی تفکر در مورد جریان داده از طریق یک سری تبدیل‌ها را تشویق می‌کند. این رویکرد:

  • خوانایی کد را با نشان دادن مراحل پردازش داده بهبود می‌بخشد
  • قابلیت نگهداری را با جداسازی نگرانی‌ها افزایش می‌دهد
  • موازی‌سازی و بهینه‌سازی را تسهیل می‌کند

تکنیک‌هایی برای ساخت خطوط تبدیل:

  • زنجیره‌سازی متد (به عنوان مثال، با lodash)
  • ترکیب توابع خالص
  • کتابخانه‌های تخصصی مانند RxJS برای جریان‌های داده ناهمزمان

مثالی از یک خط پردازش داده:

const processOrders = pipe(
  fetchOrders,
  filterValidOrders,
  calculateTotals,
  generateReport
);

این به وضوح مراحل پردازش سفارشات را بدون غرق شدن در جزئیات پیاده‌سازی نشان می‌دهد.

8. طراحی مبتنی بر میکسین رویکردی تابعی به ترکیب اشیاء ارائه می‌دهد

داده‌های ساده بهترین هستند. انواع داده‌های تخصصی باید، خوب، خاص باشند.

ترکیب انعطاف‌پذیر. میکسین‌ها راهی برای ترکیب رفتار اشیاء بدون تکیه بر وراثت کلاسیک فراهم می‌کنند. این رویکرد:

  • اجازه می‌دهد طراحی کد انعطاف‌پذیر و مدولارتر باشد
  • از مشکلات مربوط به سلسله‌مراتب وراثتی عمیق جلوگیری می‌کند
  • سبک برنامه‌نویسی شیءگرا را به سمت تابعی‌تر تسهیل می‌کند

پیاده‌سازی میکسین‌ها در جاوااسکریپت:

  • استفاده از Object.assign() برای کپی کردن متدها به پروتوتایپ‌های اشیاء
  • به کارگیری توابع مرتبه بالاتر برای ایجاد توابع کارخانه‌ای که میکسین‌ها را اعمال می‌کنند

مثالی از ایجاد یک شیء با میکسین‌ها:

const withLogging = (obj) => ({
  ...obj,
  log: (msg) => console.log(`[${obj.name}]: ${msg}`)
});

const withValidator = (obj) => ({
  ...obj,
  validate: () => { /* validation logic */ }
});

const createUser = (name) => 
  withValidator(withLogging({ name, data: {} }));

این رویکرد اجازه می‌دهد رفتار اشیاء به طور انعطاف‌پذیر ترکیب شود بدون اینکه به سلسله‌مراتب کلاس‌های سخت‌گیرانه وابسته باشد.

آخرین به‌روزرسانی::

نقد و بررسی

4.07 از 5
میانگین از 100+ امتیازات از Goodreads و Amazon.

کتاب جاوااسکریپت تابعی عمدتاً نقدهای مثبتی دریافت کرده است و میانگین امتیاز 4.07 از 5 را کسب کرده است. خوانندگان از توضیحات واضح آن درباره‌ی مفاهیم برنامه‌نویسی تابعی در جاوااسکریپت قدردانی می‌کنند و رویکرد مستقیم و مثال‌های عملی آن را تحسین می‌کنند. بسیاری آن را چشم‌گشا و ارزشمند برای بهبود مهارت‌های کدنویسی خود می‌دانند. برخی از منتقدان به تراکم مطالب اشاره کرده و آن را برای برنامه‌نویسان متوسط تا پیشرفته توصیه می‌کنند. در حالی که عده‌ای به وابستگی آن به Underscore.js انتقاد کرده و کاربرد آن در دنیای واقعی را زیر سوال می‌برند، اکثر افراد توافق دارند که این کتاب مقدمه‌ای محکم برای تکنیک‌های برنامه‌نویسی تابعی در جاوااسکریپت ارائه می‌دهد.

درباره نویسنده

مایکل فوگوس یک توسعه‌دهنده نرم‌افزار با تجربه و نویسنده‌ای است که به خاطر تخصصش در برنامه‌نویسی تابعی شناخته می‌شود. او چندین کتاب در زمینه برنامه‌نویسی نوشته است، از جمله "لذت کلوجر" و "جاوااسکریپت تابعی". فوگوس به دلیل توانایی‌اش در توضیح مفاهیم پیچیده به صورت واضح و مختصر مورد احترام است. کارهای او اغلب بر کاربرد اصول برنامه‌نویسی تابعی در زبان‌های مختلف، به ویژه جاوااسکریپت، تمرکز دارد. فوگوس همچنین به خاطر مشارکت‌هایش در جامعه کلوجر و دخالتش در توسعه زبان‌های برنامه‌نویسی شناخته می‌شود. سبک نوشتاری او به خاطر سادگی و روشنگری‌اش تحسین می‌شود و موضوعات دشوار را برای خوانندگانی با سطوح مختلف تجربه قابل دسترس می‌سازد.

0:00
-0:00
1x
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Recommendations: Get personalized suggestions
Ratings: Rate books & see your ratings
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
All summaries are free to read in 40 languages
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 10
📜 Unlimited History
Free users are limited to 10
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Mar 22,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
100,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.
Settings
Appearance
Black Friday Sale 🎉
$20 off Lifetime Access
$79.99 $59.99
Upgrade Now →