What relationship it has with object orientation?
In fact it is easy to confuse with the data-driven project which is something related to object orientation, unlike the project oriented the data in question here, which opposes OO.
Is a paradigm?
It’s actually a style or approach to programming, at least officially it’s not a paradigm, If it were, it would be secondary.
So what is the data-driven project?
It seeks to organize the data in the way that makes sense for the application to take better advantage of the hardware, regardless of whether the code is more organized or not.
It is opposed to other styles that look for a way to write "better" the codes, it really puts the data first to be able to manipulate it efficiently is priority, even if eventually the code gets weird.
Your goal is to organize the fields into data structures for the better take advantage of memory, the cache, transport and processing. In general it decreases the idleness of the machine avoiding the Von Neumann bottlenecking which prevents the processor from exercising its potential because of the way the data that are structured.
Why should we adopt it and in what cases?
So of course it’s more useful in applications that require maximum performance, and games is an example often cited as DOD.
Because data is something to be used in a database? It can be used in another context?
It is also adopted in databases where data organization helps in the performance of queries. We often model using the data-oriented design without even realizing it, at least in relational databases.
In fact the applications that use this approach usually privilege a set of lists or simple data tables (Sounds) than complete object lists (Aos), so the related data gets together and access is optimized.
Database normalization usually does this a little bit in some cases.
It has how to prove its effectiveness?
There are easy metrics since we’re talking about performance. It is possible to measure using the two models, OOP and DOD, the second nobody can question that there was gain, has clear and incontestable numbers. Whether gain is necessary is another story. The gain in doing OOP can always be questioned, they have never managed to publish a conclusive study of gain.
You can give a very short example of code where it’s different?
In the OS there are examples of how it is in OOP:
class Ball {
Point position;
Color color;
double radius;
void draw();
};
vector<Ball> balls;
And how it is in DOD:
class Balls {
vector<Point> position;
vector<Color> color;
vector<double> radius;
void draw();
};
I put in the Github for future reference.
More information
Mike Acton is the main proponent and discovered the subject as something more or less formalized in his lecture.
There are texts that detonate OOP (another). Of course in the specific context, but it’s good to open the eye of what might be hurting you, even if you don’t have to.
It shows how harmful is a simple polymorphism that seems harmless, since it is only one indirect simple pointer, but that harms the locality and even cause a slowness of more than an order of magnitude, which is absurd, just because the information is not in the cache. He comes to propose, as far as possible that polymorphism be generated within functions and not within objects, or that everything be solved at compile time.
The style abhors the use of exceptions, multiple inheritance, abstractions, among other typical techniques of applications Nterprise.
Obviously this applies better in C++. Other languages practically make DOD useless because they already have their own bottlenecks. C or Assembly are at a lower level of abstraction.
There’s a website with practically a book on the subject.
Scott Myers lecture on cache.
Many people must have been disappointed because they wanted to see those patterns-filled architectures that make the code huge and confusing to achieve a goal that is often not even necessary.