Во-первых, вы никогда не должны иметь побочных эффектов в запросе. Это худшая практика. Запросы должны отвечать на вопрос, а не давать эффект.
Ответ на ваш вопрос: вернуть запрос, когда вызывающий ожидает запрос; вернуть список, когда вызывающий ожидает список. Когда вы разрабатываете свой метод, решите, что с большей вероятностью понадобится вызывающей стороне, реализуйте это, а затем document it.
При рассмотрении вопроса о том, хочет ли вызывающий запрос запрос или список, подумайте о различиях между запросами и списками:
запросов всегда актуальны. Если объекты / базы данных / все, что запрашивает запрос, изменяет его содержимое, то результаты запроса изменятся, если вы снова запустите запрос. Списки не меняют своего содержимого, поэтому списки устаревают . Если вашему абоненту требуются самые последние данные , отправьте ему запрос. Если им требуется снимок данных, которые они могут просмотреть в свободное время , предоставьте им список.
запросов потенциально дорого выполнять для получения своих результатов. Списки дешевы, чтобы получить их результаты. Если вызывающий абонент, скорее всего, захочет запросить результат много раз и ожидает, что каждый раз получит одинаковые результаты, предоставьте им список.
Построение запроса: fast . Выполнение запроса для построения списка: медленно . Список всегда получает все результаты запроса. Вызывающий может захотеть дополнительно ограничить запрос, скажем, взяв только первые десять элементов. Если вызывающая сторона не хочет или нуждается в полной итерации по всему запросу, тогда дайте им запрос; не принимайте это решение от их имени и не предоставьте им список.
запросов крошечные . Списки большие . Многие запросы могут быть повторены по n элементам в пространстве O (1); список из n элементов занимает O (n) места. Если результирующий набор огромен, то помещение его в список, вероятно, неэффективно.
и так далее.
Нет простого ответа. Ответ совпадает с ответом на любую другую проблему проектирования: Рассмотрите все плюсы и минусы каждого возможного решения в контексте того, что наиболее вероятно требуется пользователю функции, а затем выберите разумное компромиссное решение. .