Як застосувати орієнтований на дані дизайн із об’єктно-орієнтованим програмуванням? [зачинено]


17

Я читав багато статей про орієнтований на дані дизайн (DOD) і розумію це, але не можу створити об'єктно-орієнтоване програмування (ООП) з урахуванням DOD, я думаю, що моя освіта OOP блокує мене. Як я повинен думати, щоб змішати два? Мета - мати приємний інтерфейс OOP під час використання DOD поза кадром.

Я теж бачив це, але не дуже допомогло: /programming/3872354/how-to-apply-dop-and-keep-a-nice-user-interface


3
Ви повинні відправити дещо - що набагато більш конкретні (і пов'язані з грою), це питання поки занадто загальний характер .
DeadMG

Ви маєте рацію, але я не бачив, щоб це обговорювалося в інших сферах, крім ігрового програмування.
Помбал

4
@DeadMG: Я ніколи не бачив, щоб термін, орієнтований на дані дизайну, використовувався поза розробкою ігор, за винятком випадків, коли йдеться про практики, що виникають у розробці ігор. Якщо ви думаєте про дизайн, керований даними, це не одне і те ж.

Відповіді:


16

Я б сказав, що блог Ноеля Льопіса - це, мабуть, найкраща інструкція для поєднання об'єктно-орієнтованого програмування та орієнтованого на дані дизайну. Він є одним із розробників терміну DOD, є сильним програмістом на C ++, і багато писав про свій стиль та про те, як він користується функціями O + C ++.

Я думаю, якби я назвав ключові елементи їх поєднання, згідно Ноелю:

  • Використовуйте функції POD і не-член, не є членами друзів, наскільки це можливо. Функції, що не належать до друзів, покращують інкапсуляцію і є ключовою частиною орієнтації на дані, оскільки вони зберігають дані, дані.
  • Уникайте збереження "тимчасового" стану на ваших об'єктах. Тимчасовий стан засмічує ваші дані. Якщо вам потрібно щось кеш-пам'ять (наприклад, для продуктивності), то це належить до нового класу, а функції, які не є членами, що не належать до друзів, пов'язують два типи, а не a-a, ні has-a.
  • Уникайте об'єктів, які можуть знаходитись у стані A або стані B. Віддайте перевагу перемиканню між двома об'єктами, одним з яких є A, а одним з яких є B.
  • Уникайте поліморфізму, уникайте віртуальних функцій, уникайте шаблонів, уникайте будь-чого, завдяки чому ваші дані мають синтаксичний вигляд однаковості, а не фактичну однаковість.

Інше велике ім'я в пропаганді DOD зараз - Майк Актон з Безсоння, але, читаючи те, що він написав, я б сказав, що він насправді не про-OO (або анти-OO, доки він все ще орієнтований на дані).


Дякую за відповідь, але те, що ви говорите, те, що я повинен зробити, щоб використовувати DOD, а не як я міг би використовувати OO з ним. Я читав блог Ноеля, рейтинги Майка Актона (: D), публікації DICE серед інших, і я розумію, як користуватися DOD, тільки не з змішаним OO.
Pombal

2
Як ви думаєте, що є ОО? Я б назвав більшість кодів Ноеля OO, наприклад - все ще існують класи та екземпляри, ще є диспетчерство на основі типу, все ще може бути спадкування (визначення параметра POD + C + 0x було змінено, щоб це допустити). Один все ще моделює проблеми, починаючи з даних, а не операцій.

Наприклад, поліморфізм є значною частиною ООП, як і стан об'єктів. Дизайн, орієнтований на дані, повинен надавати ігровим особам властивості, такі як анімувати, взаємодіяти, рухатися, здатні, ... використовуючи спадкування. Все залежить від розумного менеджера даних, який забезпечує лише необхідні об'єкти для кожного компонента, наприклад, для фізики або анімації.
danijar

@sharethis: Якщо я розумію ваше заперечення, поліморфізм підтипу є ключовою особливістю ОО. Я погоджуюся, що мова, яка стверджує, що є OO без підтримки, це було б дивно, але це не означає, що це інструмент в першу чергу для тих проблем, з якими стикаються ігри з програмуванням, навіть коли гра запрограмована в стилі OO . Я також зауважу, що DOD дійсно стосується уникнення певних видів поліморфізму (номінальне підтипу), але заохочення інших (у C ++, ad hoc поліморфізму з ADL або структурного поліморфізму через гарантії щодо представлення цінностей).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.