I dunno I think strictly tying data to particular code is in general not good.
In my experience it doesn't facilitate good code at all, in fact it often does the exact opposite when an inexperienced dev discovers inheritance. I've seen in production code really ridiculous stuff like 2DChart inheriting 2DPoint and weird shit like that or you have some monster IGodInterface with a bunch of methods having blank implementations for most concrete implementations.
Personally I've found once you get the hang of it a functional-first approach makes it way easier to do with the data what you want done without contorting your brain to fit an OOP model. You just do the stuff you want with the data, you don't have to think too hard where you'll put the data and where you'll put the code that churns the data.
I dunno I think strictly tying data to particular code is in general not good.
In my experience it doesn't facilitate good code at all, in fact it often does the exact opposite when an inexperienced dev discovers inheritance. I've seen in production code really ridiculous stuff like 2DChart inheriting 2DPoint and weird shit like that or you have some monster IGodInterface with a bunch of methods having blank implementations for most concrete implementations.
Personally I've found once you get the hang of it a functional-first approach makes it way easier to do with the data what you want done without contorting your brain to fit an OOP model. You just do the stuff you want with the data, you don't have to think too hard where you'll put the data and where you'll put the code that churns the data.