По моему личному мнению, я бы предпочел ваш второй вариант, чем первый. Это потому, что у вас есть возможность быть точным в таких вещах, как типы параметров. Например, minLane
и maxLane
могут быть просто целыми числами, но startDate
и endDate
вполне могут быть Date
объектами. Часто лучше, если вы действительно можете указать, что вы ожидаете, так как это уменьшает потребность в таких вещах, как приведение и проверка диапазона и т. Д. Кроме того, я считаю, что это более читабельно, поскольку имена функций просто говорят о том, что вы пытаетесь сделать.
Однако у меня может быть альтернативная идея, которая является разновидностью вашего первого примера (на самом деле я получил это вдохновение от Java Comparator, если вы с ним знакомы). Вместо того, чтобы передавать строку в качестве первого аргумента, передайте некоторый объект Selector
. Selector
будет именем класса или интерфейса, который будет выглядеть примерно так (в Java):
interface Selector {
public void select(Score next);
public Score getBest( );
}
Если метод select
"любит" значение next
, которое ему дано, он может сохранить это значение для дальнейшего использования. Если ему это не нравится, он может просто отказаться от него и сохранить то значение, которое у него уже есть. После того, как все данные обработаны, наилучшее значение останется, и его можно запросить, вызвав getBest
. Конечно, вы можете изменить интерфейс в соответствии с вашими конкретными потребностями (например, кажется, что вы ожидаете получить более одного значения. Кроме того, дженерики также могут сильно помочь).
Причина, по которой мне нравится эта идея, заключается в том, что теперь ваша функция имеет очень общее назначение. Чтобы добавить новую функциональность, вам не нужно добавлять функции, и вам не нужно изменять какие-либо функции, которые у вас уже есть. Вместо этого пользователь вашего кода может просто определить свою собственную реализацию Selector
по своему усмотрению. Это позволяет вашему коду быть гораздо более композиционным, что облегчает его использование. Единственное неудобство заключается в необходимости определения реализаций Selector
, хотя вы также можете предоставить несколько вариантов по умолчанию.