Арыентаваны на дадзеныя дадзеныя супраць аб'ектна-арыентаванага дызайну

Відэагульні прагныя. Яны могуць запатрабаваць велізарнай колькасці аператыўнай памяці, магутнасці апрацоўкі і, як правіла, пакласці тону напружання на фізічнае абсталяванне, якое адказвае за атрыманне, маніпуляванне і вяртанне дадзеных. Па гэтай прычыне шэраг прыхільнікаў дызайну, арыентаванага на дадзеныя, заяўляюць, што, магчыма, аб'ектна-арыентаваны дызайн - не лепшы спосаб арганізацыі кода, які працуе з гэтымі маналітнымі прыкладаннямі.

Такім чынам, што такое арыентаваны на дадзеныя дызайн, чым ён адрозніваецца ад OOP і якія правілы звязаны з тым, як думаць пра напісанне кода DOP?

Чым ён адрозніваецца ад OOP?

Як вынікае з назвы, аб'ектна-арыентаванае праграмаванне сканцэнтравана на вызначэнні, вытворчасці і эксплуатацыі аб'ектаў. Ён накіроўвае кодэры на:

  1. Усталюйце, якія аб'екты.
  2. Вызначце, якія тыпы дадзеных належаць да аб'екта.
  3. Апішыце функцыянальнасць аб'екта.

Затым гэтыя аб'екты ўзаемадзейнічаюць з іншымі аб'ектамі праз функцыі, якімі валодае кожны аб'ект.

Як працуюць аб'екты ў OOP

Адна з вялікіх пераваг OOP - тое, наколькі цесна здаецца люстэрка, як мы ўзаемадзейнічаем з рэальным светам. Напрыклад, ведаючы нешта пра клас “Табліцы”, я магу зэканоміць шмат часу, ведаючы, што я магу, а што нельга рабіць са сталом. Вы ніколі не будзеце ўказваць на табліцу табліцы і пытацца: "Якую капучыну робіць гэтая табліца?", Бо клас табліц не дае табліцам функцыяналу рабіць капучына.

З гэтага паняцця мы таксама атрымліваем карысць палімарфізму (Poly - Many; Morph - Forms), які апісвае ўзор у аб'ектна-арыентаваным праграмаванні, у якім класы маюць розную функцыянальнасць пры сумесным выкарыстанні агульнага інтэрфейсу. Калі вы думаеце пра класіфікацыю жывёл, ведаючы, што кошка і тыгр ўваходзяць у клас "каціных", я аўтаматычна ведаю шмат пра кожнага з іх, не апускаючыся ў канкрэтныя асаблівасці іх класаў. Яны абодва "ўспадкоўваюць" пэўныя атрыбуты і дадзеныя з вышэйшага кацінага класа.

Але з дапамогай гэтай парадыгмы функцыі абмежаваныя пэўнымі дадзенымі і не могуць быць выкарыстаны паўторна. Калі вы хочаце, каб функцыя працавала з іншым фрагментам дадзеных у аб'екце, гэтая функцыя павінна быць у спадчыну з бацькоўскага класа альбо павінна быць перапісана. Важна падумаць пра тое, як у гэтай парадыгме можна атрымаць доступ да дадзеных, якія захоўваюцца ў бацькоўскім класе. Дадзеныя павінны быць атрыманы праз некалькі класаў, каб атрымаць доступ да працэсара, што можа быць неэфектыўна.

Прыклад працы працэсара, магчыма, у сістэме OOP.

Праграмаванне, арыентаванае на дадзеныя, падыходзіць да кадавання некалькі інакш. Замест аб'ектаў усё - гэта дадзеныя, і ўсё можна дзейнічаць. Гэта падзяляе функцыянал і дадзеныя. Яны больш не пераплятаюцца пэўным наборам правілаў. У DOP вашы функцыі маюць агульнае прызначэнне і прымяняюцца да вялікіх кавалкаў дадзеных. У ідэале вы маглі б структураваць дадзеныя максімальна набліжана да выходных дадзеных, каб забяспечыць як мінімум намаганняў, зробленых самой функцыяй.

"Дызайн-арыентаваны праект зрушае перспектыву праграмавання з аб'ектаў на самі дадзеныя: тып дадзеных, як яны закладаюцца ў памяць і як яны будуць счытвацца і апрацоўвацца ў гульні".
Прыклад паслядоўнасці выкліку DOP. Значна менш працы для працэсара.

Чаму DOP?

Адказ просты, таму што працэсары любяць пункт адліку. Гэтыя правілы дыктуюць шмат іншых пераваг, якія дае нам DOP. Напрыклад, напісанне кода, які аптымізуе месца адліку, дае нам значна больш просты спосаб рэалізацыі Паралелізацыі. Паралелізацыя спрабуе выкарыстоўваць больш аднаго ядра працэсара кампутараў для выканання задач адначасова. Гэта можа быць вельмі складана зрабіць з OOP, таму што вы рызыкуеце атрымаць некалькі патокаў працэсара, спрабуючы адначасова атрымаць доступ да тых жа дадзеных. Аднак, калі вы аб'ядноўваеце аднадумцы і пішаце код, арыентуючыся на дадзеныя, якія ўвогуле будуць апрацоўвацца, значна лягчэй выкарыстоўваць некалькі патокаў працэсара для апрацоўкі гэтых функцый.

Яшчэ адна перавага DOP - гэта эфектыўнае выкарыстанне кэшавання памяці. Паколькі DOP зноў і зноў выкарыстоўвае аднолькавыя функцыі, кэш не вымушаны працягваць захоўваць усё новыя і новыя, але не зусім новыя блокі навучання.

Крыніцы

https://www.danielsefton.com/2016/05/developing-a-data-oriented-game-engine-part-1/

https://www.packtpub.com/books/content/what-difference-between-functional-and-object-oriented-programming

https://www.gamasutra.com/view/news/126498/Opinion_What_You_Need_To_Give_Up_When_Going_Data_Oriented.php

https://prateekvjoshi.com/2013/11/30/programming-paradigms-object-oriented-vs-data-oriented/

http://gamesfromwithin.com/data-oriented-design