- Issue: (link or create and link and associated issue for discussion)
- Author: Jesse Mapel, Adam Paquette, & Austin Sanders
<!-- This is a comment block that is not visible. We provide some instructions in here. When submitting an RFC please copy this template into a new wiki page titled RFC#:Title, where the number is the next incrementing number. If you would like to submit an RFC, but are unable to edit the wiki, please open an issue and we will assist you in getting your RFC posted. Please fill in, to the largest extent possible, the template below describing your RFC. After that, be active on the associated issue and we can move the RFC through the process.-->
# Summary
Binary Large Objects (BLOBs) are how non-image binary data is attached to Cubes.
This includes ephemerides, footprints, processing history, and many other important
data sets. In the ISIS API, BLOBs are represented by a polymorphic class hierarchy
that inherits from the [Blob class](https://isis.astrogeology.usgs.gov/Object/Developer/class_isis_1_1_blob.html).
All Blob subclasses are responsible for two things: holding a specific type of data
in memory and reading that data from or writing it to a file. Some Blob subclasses
are also responsible for generating the data that they store. This RFC seeks to separate
these responsibilities. File I/O will be handled by the Blob class. Then, the classes
that currently inherit from the Blob class will no longer inherit from it and instead
pass their data to Blob object which can then perform file I/O. For the remainder
of this document, we will refer to these classes as the container classes. Finally,
the creation of data to be stored in the container classes will be moved into new
components.
The Blob class already neatly encapsulates performing file IO with generic binary
data. Unfortunately, accessing and storing data in a Blob object requires inheriting
from the Blob class and then only the code inside of that subclass can access it.
We propose changing this so that the Blob class allows direct access and
modification to the binary data that it stores. This way, Blob objects could be
used to generically perform binary data I/O on Cubes.
With the new Blob interface, the container classes can change from using inheritance
to using composition. This is a standard design paradigm described in the