نیم‌نگاهی به Data-Oriented Programming

نیم‌نگاهی به Data-Oriented Programming


مفهوم برنامه‌نویسی داده‌گرا (DOP) الگوییه داده رو محور قرار می‌ده و اولویت اصلیش سازماندهی کارآمد داده‌ها است. درسته که ریشه‌هاش به LISP (1958) برمی‌گرده، اما در دهه ۲۰۱۰ با ساختارهای داده مدرن، پایدار و کارآمد، مورد توجه قرار گرفت. برخلاف برنامه‌نویسی شی‌گرا (OOP) که داده‌ها و رفتار رو درون اشیاء محصور می‌کنه، «DOP کد رو از داده‌ها جدا می‌کنه» و از ساختارهای داده عمومی و تغییرناپذیر استفاده می‌کنه.


مفهوم DOP اولین‌بار در جوامع خاصی مثل توسعه‌دهنده‌های بازی‌های ویدیویی (game devs) و سیستم‌های real-time مطرح شد. توی این حوزه‌ها، ساختار داده و نحوه‌ی دسترسی به حافظه (memory layout) نقش مهمی در عملکرد و کارایی داره. بعدها این تفکر توسط توسعه‌دهنده‌هایی مثل Yehonathan Sharvit در حوزه‌ی طراحی سیستم‌های تجاری (business systems) مطرح و ترویج شد.


کتاب “Data-Oriented Programming” (از انتشارات Manning)، یکی از منابع مرجع برای معرفی و آموزش این پارادایمه که توسط Yehonathan نوشته شده.


🔑 اصول کلیدی برنامه‌نویسی داده‌محور (DOP)


۱: داده رو از رفتار جدا کنید

در OOP، داده‌ها و متدها در کنار هم درون کلاس‌ها قرار می‌گیرن ولی در DOP، داده‌ها معمولاً به صورت ساختارهای ساده مثل JSON یا map/record تعریف می‌شون و توابع (behavior) جداگانه بر روی این داده‌ها عمل می‌شن.


۲: استفاده از داده‌های ساده (plain data)

داده‌ها باید قابل عبور بین سرویس‌ها، قابل سریال‌سازی، قابل لاگ‌کردن و قابل ذخیره باشند. این یعنی نباید شامل توابع، متدها، یا ویژگی‌هایی مثل اینترفیس‌های پیچیده باشن.


۳: عدم اعتماد به وضعیت پنهان (hidden state)

اشیای OOP ممکنه stateهای مخفی داشته باشن که باعث ایجاد باگ و رفتار غیرمنتظره بشه. در DOP، داده‌ها باید شفاف و قابل مشاهده باشن.


۴: تبدیل داده به داده

در DOP، توابع از نوع Data → Data هستند. مثل JSON in → JSON out. این باعث تست‌پذیری بسیار بالا می‌شه.


۵: همیشه داده‌ها را جداگانه بررسی کن

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


⚖️ مقایسه با برنامه‌نویسی تابعی (FP)

در نگاه اول، DOP شباهت زیادی به FP داره:

- هر دو داده رو immutable در نظر می‌گیرن.

- توابع pure رو ترجیح می‌دن.


اما تفاوت مهمی وجود دارد:

- در FP تمرکز روی توابع و محاسبات ریاضی است. در حالی که توی DOP تمرکز اصلی روی ساختار داده و سادگیه.

- توی FP گاهی تمایل به انتزاع‌های سنگین مثل monad و functor است. ولی DOP از این انتزاع‌ها دوری می‌کنه و مدل خودش رو تا حد ممکن ساده و نزدیک به JSON نگه می‌داره.


⚖️ فرقش با Go و سبک داده‌محور

زبان Go خودش یک زبان شی‌گرا نیست و کلاس نداره، به همین دلیل خیلی از برنامه‌نویس‌های Go به طور ضمنی به سبک داده‌محور نزدیک هستن:


- داده‌ها struct هستند و بدون منطق پیچیده درون آن‌ها.

- تابع‌ها به صورت مستقل تعریف می‌شن و گاهی روی struct گیرنده دارن (methods) ولی معمولاً ساده‌ان.

- سریال‌سازی (JSON, protobuf) بسیار رایجه.


با این حال، Go هنوز هم اجازه‌ی مدل‌های ترکیبی می‌ده، و استفاده‌ی بیش از حد از interfaceها ممکنه باعث پنهان شدن رفتار بشه!


💪 مزیای عملی DOP

- قابلیت لاگ‌گیری بهتر: چون داده‌ها ساده‌ان، می‌شه بدون نگرانی در لاگ ثبتشون کرد.

- سازگاری بهتر با پایگاه‌داده و APIها

- تست‌پذیری بالا: توابعی که ورودی و خروجی ساده دارن، راحت‌تر تست می‌شن.

- توسعه‌پذیری توی تیم‌های بزرگ: توسعه‌دهنده‌ها بدون درگیری با کلاس‌ها و رفتارهای پیچیده می‌تونن داده رو بررسی و اصلاح کنن.


جمع‌بندی:

برنامه‌نویسی داده‌محور قرار نیست جای OOP یا FP را بگیره، جوگیر نشیم از فردا راه بیوفتیم و «امروزه، عصر داده‌محور است! راه بندازیم»! بلکه یک رویکرد مکمل برای حل مشکلات پیچیدگی و مدیریت داده‌هاست. اگر تا الان درگیر کلاس‌های پیچیده، تست‌نشدن رفتارها، و ساختارهای مبهم بودید، شاید شاید و شاید بد نباشه به داده‌محور فکر کنید.


💬 نظر؟ سوال؟ گپ؟