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