Есть класс книги.
Вот варианты использования:   
- Можно получить контент книги для прочтения ее.
- При редактировании контента, книга сохраняется в БД.
- Книгу можно получить только по заранее известному id (неважно откуда юзер узнает)
- Можно распечатать на принтере. Любую книгу можно печатать.
Что заранее известно:
Никогда в жизни не будет нескольких хранилищ книг, и оно никогда не изменится.
Вот код:
class Book {
    private int id;
    private String content;
    private Database database;
    private Printer printer;
    public Book(int id) {
        database = new Database("table-books");
        printer = new Printer();
        this.content = database.select(id);
    }
    public String getContent() {
        return this.content;
    }
    
    public void setContent(String content) {
        this.content = content;
        save();
    }
    public void print() {
        // предположим, что тут сложная логика из 15 строк для работы с принтером. Но больше ни один класс печататься не умеет
        printer.selectPrinterAndPrint(getContent());
    }
    public void save() {
        // предположим тут сложная логика сохранения в бд, но больше ни один класс не сохраняется
        database.updateOrInsert(id, getContent());
    }
}
Но как гласит принцип, у класса должна быть только одна причина для изменения. 
Получается, что любой чувак из интернетов, кто пишет умные статьи, меня с таким кодом пошлет куда подальше.
  
Какого черта мне здесь создавать отдельные классы Storage и PrintingSystem ради инкапсуляции логики туда? Если никто больше юзать не собирается их. Какого класс, который юзает Book я должен еще утяжелить знаниями о Storage и PrintingSystem?
Мне кажется, что все эти принципы должны учить только одному - здравому смыслу.
Перемещено leave из talks




