Data Oriented Design – first chapter (2018)
dataorienteddesign.com
dataorienteddesign.com
Data-Oriented Design (2018) - https://news.ycombinator.com/item?id=20380397 - July 2019 (37 comments)
Data-Oriented Design (2013) - https://news.ycombinator.com/item?id=11064762 - Feb 2016 (8 comments)
Data-oriented design or why you might shoot yourself in the foot with OOP (2009) - https://news.ycombinator.com/item?id=27658706 - June 2021 (362 comments)
I understand the main point that data is everything, but the author's arguments are hard to learn and go over my head.
The wording makes it seem like they are criticizing objects because encapsulation makes the contained data less reusable. Well… that’s the whole point of encapsulation. I think the author is trying to say some things and it’s just not coming through as clearly as they intended
Somewhere in this triangle of worlds, there is a optimum of speed, debug and reason ability and beautiful code with minimal repetition..
One of the advantages of a language like Erlang is that it mandates immutable data, and can both optimize for that and give the developer an easier time reasoning about where changes can and can’t occur.
Python teases with its newer functional features, but any time you pass a data structure off to code outside your control you have no guarantees about what will happen to it.
Isn't that just the keyword "const" in C++? Its not perfect but if you need const the keyword really helps ensuring you 'pass' the const concept all the way down your data to its roots.
You can also have immutable data in Java. Instead of implementing both "setFoo" and "getFoo", you simply implement "getFoo".
For example, again referencing Erlang since that's the only FP language I'm well-versed in, immutable data + pattern matching means that there are assertions on practically every line of code in production.
const int x = 20;
x = 30 ; // Compile Error, not a const operation.
int y = x + 20; // Allowed
If you have a class: class Foo{
public:
const int x;
int y;
Foo(int initial): x(initial), y(initial){
}
void setY(int value){
y = value;
}
int getXPlusY() const{
return x + y;
}
};
Foo f(20); // Allowed
f.x = 30; // Compile Error, not a const-operation
int y = f.x + 30; // Allowed
const Foo f2(20); // The f2 object is now const. Non-const routines are no longer allowed
f2.setY(30); // Not a const-routine.
int bar = f2.getXPlusY(); // Allowed, getXPlusY is a const-function
-----------------So yes. Every single line of code you write will be double-checked by the compiler to see if it is "const-correct". That's the advantage of multi-paradigm languages like C++. Its not "pure", but it implements ideas like immutability from other languages.
For a class with two properties, you can make a new constructor that initializes both, though it’s a bit unwieldy. It becomes unworkable when you have five or ten properties. A more data-oriented approach would be to use a key/value map, and have standard functions to “update” map members by returning new maps with the “updated” value(s). Those libraries probably exist for C++, but you have to enforce their use, whereas languages that are built around those concepts provide stronger guarantees from the outset.
get_exactly_n_or_crash(N) ->
{N, Data} = get_data(N).
Suppose get_data will get N or less pieces (if N pieces of data aren't available) of data and return, as a tuple, both the amount of data obtained and the data. The above assignment is actually part of Erlang's pattern matching, the second use of N (on the LHS of the =) is not actually an assignment, it's a check. If get_data returned less than N pieces of data, the program would crash (which you can catch and respond to) at that point.Without specificity, the merits of the design are not falsifiable.