I’m comming from an scientific background and I’m having trouble to think object oriented. I’m always thinking of functions not objects.
For example I’ve got a Dataset containing multiple 2D arrays and I like to extract Regions of Interest out of these arrays. So my first Design was something like a RoIFinder class to whom I pass a reference to the Dataset object. The RoIFinder object did its magic and returned the RoI’s.
But this gives me a bad feeling since it looks more like a function than an object.It’s more like a Blackbox. But I have no Idea how it is done properly.
How would you do something like that?
To me it sounds like in the specific situation you describe, this could be a fine OO design.
OO in brief is about bundling together
Whenever you have data which represents the state of (a part of) the system, and you have behaviour tied to (typically manipulating) that data, you have a candidate for an object. Optionally, these objects may also have an identity, but this may not be always necessary.
If you potentially have multiple different criteria to pick regions of interests out of the Dataset, you may implement these as distinct
*Finderclasses, implementing a common base interface. There you have an OO class hierarchy! From then on, the Finders can even be used as interchangeable Strategies in your code.The alternative would be to put the finder functionality in the Dataset. This might be OK if you are absolutely sure you won’t have more different criteria to extract regions. Even then, your Dataset has two distinct responsibilities, which is usually not a good idea. It is better to have each class be responsible for one thing, and do it well.
We don’t know what you are supposed to do with the data in the arrays – there may be some possibility to find more abstractions there and build some OO types and objects on these too.
Note though, that these all are just possibilities. Implement them only if they are actually useful (for solving problems, simplifying your code, or – last but not least – helping you gain practical experience with new concepts).