Caches are sexy. They are a one-night stand. We need to avoid them in a long-term relationship.
TL;DR: Any junior student can create a cache. Almost no senior developer can debug and invalidate them.
-
Coupling
-
Testability
-
Cache invalidation.
-
Maintainability
-
Premature Optimization
-
Erratic Behavior
-
Lack of transparency
-
Non-Deterministic behavior
-
If you have a conclusive benchmark and are willing to pay for some coupling: Put an object in the middle.
-
Unit test all your invalidation scenarios. Experience shows we face them in an incremental way.
-
Look for a real-world cache metaphor and model it.
<?
final class Book {
private $cachedBooks;
public function getBooksFromDatabaseByTitle(string $title) {
if (!isset($this->cachedBooks[$title])) {
$this->cachedBooks[$title] =
$this->doGetBooksFromDatabaseByTitle($title);
}
return $this->cachedBooks[$title];
}
private function doGetBooksFromDatabaseByTitle(string $title) {
globalDatabase()->selectFrom('Books', 'WHERE TITLE = ' . $title);
}
}
<?
final class Book {
// Just Book related Stuff
}
interface BookRetriever {
public function bookByTitle(string $title);
}
final class DatabaseLibrarian implements BookRetriever {
public function bookByTitle(string $title) {
// Go to the database (not global hopefully)
}
}
final class HotSpotLibrarian implements BookRetriever {
// You always look for real life metaphors
private $inbox;
private $realRetriever;
public function bookByTitle(string $title) {
if ($this->inbox->includesTitle($title)) {
// You are lucky. Someone has just returned the book copy.
return $this->inbox->retrieveAndRemove($title);
} else {
return $this->realRetriever->bookByTitle($title);
}
}
}
This is a design smell.
It will be difficult to enforce by policy.
- Premature Optimization
Caches should be functional and intelligent
In this way we can manage invalidation.
General purpose caches are suitable only for low level objects like operating systems, files and streams.
We shouldn't cache domain objects.
This page is hosted on a cached website.
Code Smell 20 - Premature Optimization
Code Smell 167 - Hashing Comparison
Photo by Aimee Vogelsang on Unsplash
There are only two hard things in Computer Science: cache invalidation and naming things.
Phil Karlton
Software Engineering Great Quotes
This article is part of the CodeSmell Series.