2.1.13 Data/Metadata Model
Motivation
A Data/Metadata Model separates information in two categories:
- data: slow, heavyweight information that represents the content
- metadata: fast, lightweight information that describes the content
This distinction is often driven by the need for a Model object to present lean access to information needed for browsing, and resource consuming access to information needed for processing.
Design
The Model class implement getters for both data and metadata.
- Data methods retrieve the information lazily, possibly in chunks. Caching may not be possible if the size of the information is excessive.
- Metadata methods may or may not be lazily retrieved, and may use caching, especially when backed by network.
Clarity in documentation is essential to communicate the associated cost of retrieval.
Practical Example
An image processing program may have a Movie
Model object
to represent an image file on disk
class Movie(Model):
def __init__(self, filename):
self._filename = filename
self._thumbnail = _extract_thumbnail(filename)
self._length = _extract_length(filename)
self._name = _extract_name(filename)
# Metadata
def thumbnail(self):
return self._thumbnail
# <similar getters for the remaining metadata>
# Data
def contents(self):
# <...>
Properties such as thumbnail
, length
and name
represent lean
information useful for a movie browser. This information is extracted
from the file at object instantiation and kept in memory.
The contents()
method, on the other hand, retrieves the movie data
directly from the disk and makes it available for additional processing
(e.g. decoding and displaying).