Укажите порядок для метода DAO - PullRequest
2 голосов
/ 07 ноября 2011

Предположим, у меня есть следующий интерфейс DAO:

public interface CountryData {
    /**
     * Get All Countries.
     *
     * @return A Collection of Countries.
     * @throws DataAccessException Thrown if there is an error communicating with the data store. The Exception's
     *                             Cause Exception can usually be examined to determine the exact nature of the
     *                             error.
     * @since 1.0.0
     */
    public List<Country> getAll();
}

Далее предположим, что я абстрагирую этот DAO, потому что я мог бы предоставить 2 реализации, одну для базы данных и одну для веб-службы.

Я хочу перегрузить метод getAll , чтобы принять какой-то параметр упорядочения, указывающий порядок упорядочения возвращаемого значения.

Однако я не хочу связывать интерфейс с конкретной реализацией. Например, реализация базы данных будет использовать предложение ORDER BY и будет нуждаться в списке столбцов базы данных и направлении заказа, таком как «ASC» или «DESC», где реализация веб-службы не будет.

Каков наилучший способ предоставления такого параметра без привязки вызывающего к конкретной реализации?

EDIT

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

Например, предположим, что моя модель Страны была определена следующим образом:

public final class Country implements Serializable {
    private int id;
    private String name;

    public Country() {
    }

    public Country(Country countryToCopy) {
        this.id = countryToCopy.getId();
        this.name = countryToCopy.getName();
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

И я хочу, чтобы возвращаемое значение было упорядочено по name в порядке возрастания. Я мог бы использовать ENUM, как предложено, для направления заказа, но что было бы лучше всего указать свойство для заказа, не раскрывая особенности реализации?

1 Ответ

2 голосов
/ 07 ноября 2011

Либо логическое значение:

public List<Country> getAll(boolean ascending);

Или перечисление:

enum SortOrder {
    ASCENDING,
    DESCENDING,
    RANDOM,
    NONE
}

public List<Country> getAll(SortOrder order);

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

...