Вопрос о группировке или разделении одинаковых функций / методов - PullRequest
0 голосов
/ 23 июля 2011

Я приведу реальный пример, который я должен реализовать в программе, которую я кодирую:

У меня есть база данных, в которой есть счет за каждую игру, сыгранную за последние три года в боулинг-центре. С помощью графического интерфейса вы можете выбрать либо поиск лучшего результата на каждой линии, либо поиск лучшего результата между двумя датами, либо лучшего результата за каждую неделю и т. Д.

Мне интересно, как лучше всего это реализовать. Должен ли я кодировать что-то вроде этого:

public Vector<Scores> grabMaxScores(sortType, param1, param2)
{
    if(sortType.equals("By lane"))
        ...
    else if(sortType.equals("Between given dates")
        ...
}

Или более уместно кодировать разные методы для каждого типа и вызывать правильный в слушателе?

public Vector<Scores> grabMaxScoresBetweenDates(startDate, endDate)
{
    ...
}

public Vector<Scores> grabMaxScoresByLane(minLane, maxLane)
{
    ...
}

Я не обязательно задаю эту конкретную проблему, это просто вопрос, который я часто задаю себе, когда кодирую несколько одинаковых методов, где принцип одинаков, но параметры разные.

Я вижу, что есть веские причины использовать каждый из них, но я хочу знать, существует ли "более правильный" или стандартный способ кодирования этого.

Ответы [ 2 ]

1 голос
/ 23 июля 2011

По моему личному мнению, я бы предпочел ваш второй вариант, чем первый. Это потому, что у вас есть возможность быть точным в таких вещах, как типы параметров. Например, 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, хотя вы также можете предоставить несколько вариантов по умолчанию.

0 голосов
/ 23 июля 2011

Подход, который вы использовали, также будет работать. Но если вы хотите добавить некоторые новые функции, такие как «получить наименьшее количество баллов в пятницу вечером», вам нужно будет добавить еще одну функцию, что не очень хорошая вещь.

Поскольку у вас уже есть данные в базе данных, вы можете генерировать запросы к базе данных, которые будут извлекать требуемые результаты и отображать их. Поэтому вам не нужно каждый раз изменять код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...