В первом выпуске этой серии мы рассмотрели зловещий одиночный паттерн. Шаблон singleton может быть полезен в некоторых языках, таких как C++ или Java, однако в других, таких как Python, он не имеет особого смысла. Сегодня мы рассмотрим шаблон проектирования, более распространенный во многих языках, — sentinel.

Определение

Шаблон проектирования Sentinel используется для случаев, когда мы хотели бы указать недостающие данные.

Определение звучит довольно просто, не так ли? Зачем нужен шаблон проектирования для решения этой проблемы? Давайте представим очень простую реализацию кэша на Python:

Код довольно прост. С помощью функции `get_value` мы пытаемся получить значение из внутреннего словаря, и если мы не можем его найти, вместо этого мы вызываем пользовательское исключение. В чем проблема? Давайте попробуем это в оболочке!

Мы видим, что если мы хотим сохранить None в кеше, мы сталкиваемся с проблемой, когда мы все еще получаем исключение, даже если мы явно установили значение кеша. Если использовать Python, очень легко реализовать функции, возвращающие значение None (что может быть даже задумано), поэтому мы должны придумать решение для этого. Значит, часовой.

Идея Sentinel заключается в том, что вы создаете настраиваемый объект, который проверяется вместо нулевого значения, встроенного в язык. На практике:

Давайте попробуем это:

Чудесно. Теперь мы можем установить Нет в кеше!

Когда это полезно

Sentinel имеет четкий вариант использования кэша. Реализация Python короткая и элегантная, однако другие языки, такие как C++, используют часовой механизм для создания условий остановки итераторов. По сути, это может быть что угодно, но не реальное значение в вашем наборе данных.

Спасибо, что прочитали этот пост, до следующего раза.