Интерфейс для получения прямоугольника для коллекции элементов


Как я могу улучшить этот код? Я использовал интерфейс установки, чтобы избежать дублирования кода, можно ли это сделать лучше? Можно ли как-то уменьшить количество кода?

interface PositionInterface
{
    double getPosition(PageAreaInterface pArea);
}

private double getMinPosition(Collection<PageAreaInterface> pAreas, PositionInterface pPosition)
{
    double lMinPosition = Double.MAX_VALUE;
    for (PageAreaInterface lArea : pAreas) 
    {
        lMinPosition = Math.min(lMinPosition, pPosition.getPosition(lArea));
    }
    return lMinPosition;
}

private double getTop(Collection<PageAreaInterface> pAreas)
{
    return getMinPosition(
                pAreas, 
                new PositionInterface() 
                {
                    @Override
                    public double getPosition(PageAreaInterface pArea)
                    {
                        return pArea.getBoundingBox().getTop();
                    }
                }
    );
}

private double getLeft(Collection<PageAreaInterface> pAreas)
{
    return getMinPosition(
                pAreas, 
                new PositionInterface() 
                {
                    @Override
                    public double getPosition(PageAreaInterface pArea)
                    {
                        return pArea.getBoundingBox().getLeft();
                    }
                }
    );
}

private double getMaxPosition(Collection<PageAreaInterface> pAreas, PositionInterface pPosition)
{
    double lMaxPosition = Double.MIN_VALUE;
    for (PageAreaInterface lArea : pAreas) 
    {
        lMaxPosition = Math.max(lMaxPosition, pPosition.getPosition(lArea));
    }
    return lMaxPosition;
}

private double getBottom(Collection<PageAreaInterface> pAreas)
{
    return getMaxPosition(
                pAreas, 
                new PositionInterface() 
                {
                    @Override
                    public double getPosition(PageAreaInterface pArea)
                    {
                        return pArea.getBoundingBox().getBottom();
                    }
                }
    );
}

private double getRight(Collection<PageAreaInterface> pAreas)
{
    return getMaxPosition(
                pAreas, 
                new PositionInterface() 
                {
                    @Override
                    public double getPosition(PageAreaInterface pArea)
                    {
                        return pArea.getBoundingBox().getRight();
                    }
                }
    );
}


488
3
задан 27 ноября 2011 в 12:11 Источник Поделиться
Комментарии
2 ответа

Другой альтернативой.

Двух словах


  1. Не вводите в имя (PageAreaInterface и т. д.)

  2. Потерять венгерский; надлежащим образом-короткие способы удалить свою полезность.

  3. Создать перечислимый и способ получить точные координаты.

  4. Создать getMinimum и getMaximum методов в PageAreaCollection принимая перечисление.


Обоснования (работа назад)

PageAreaCollection

Статические служебные методы кажутся мне ООН-ОО, особенно когда есть другие варианты.

Создать тип, со-соответствующих методов: код сжимается, и читается лучше:

min = PageAreaUtils.findMinimum(pageAreas, TOP); // Contrast with...
min = pageAreas.findMinimum(TOP);

Короче хорошо, но читает лучше? Что более общительный?

С статический импорт, в тебе еще остались:

min = findMinimum(pageAreas, TOP);    // Minimum pageAreas?! No...
min = findMinimumTop(pageAreas); // Doesn't read right.
min = findMinimumTopIn(pageAreas); // Better?
min = findMinimum(TOP).in(pageAreas); // Better?

ИМО количество дополнительной работы/код для удаления метода из ее законное место (методом область_страницы коллекции) не стоит усилий.

Перечисление в рамку

На перечисление и коммунальные метод мог бы жить в коллекции, тоже, если ограничивающий прямоугольник класс не для тебя надувать.

// In bounding box, collection, or standalone.
public enum POSITION { TOP, LEFT, BOTTOM, RIGHT }

// In bounding box or collection.
public double getPosition(POSITION pos) {
switch (pos) {
case TOP: return getTop();
case LEFT: return getLeft();
case BOTTOM: return getBottom();
case RIGHT: return getRight();
}
throw new RuntimeException("Bad position provided: " + pos);
}

Мин/макс установки локаторов в PageAreaCollection класс

Это, по существу, таким же, как предыдущее предложение использовать коллекции.мин/макс, но я бы еще обернуть все это так по хребтине код не должен видеть, как он реализован. Таким образом, она значительно чище, с соответствующим названием компаратора.

Collection<PageArea> pageAreas;

public double getMinimumPosition(MyRect.POSITION pos) {
double min = Double.MAX_VALUE;
for (PageArea area : pageAreas) {
min = Math.min(min, area.getBoundingBox().getPosition(pos));
}
return min;
}

public double getMaximumPosition(MyRect.POSITION pos) {
double max = Double.MIN_VALUE;
for (PageArea area : pageAreas) {
max = Math.min(max, area.getBoundingBox().getPosition(pos));
}
return max;
}

По существу же, если getPosition() должен быть в коллекции. Моя придирка метода в ограничивающий прямоугольник является то, что она делает получение должности немного громоздкий, я бы предпочел это:

area.getBoundingBox(pos) // or area.getBoundingBoxPosition(pos)?

Венгерский

РЭБ. Метод это десяток строк не требуется дифференциация между параметрами и местные жители; это очевидно. На большинство я видел именования переменных-членов, но даже это... мэээ.

Именование интерфейс

В PageAreaInterface просто Область_страницы. В реализации могут заслуживать особого названия, но это было бы "особых" Область_страницы в том, что он реализует определенную функциональность, вероятно, стоит даже упоминать. По этой же причине мы не имя вещи IWhatever больше. Интерфейс - это то , что, реализация обеспечивала специфику и заслуживают именования.

4
ответ дан 27 ноября 2011 в 03:11 Источник Поделиться

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

Другой возможностью является создание четыре компаратораС и называя коллекций.мин() и коллекций.Макс(). Это может быть абстрактный PareAreaComparator с четырьмя подклассами:

public abstract class PareAreaComparator implements Comparator<PageAreaInterface> {

public PareAreaComparator() {
}

@Override
public int compare(final PageAreaInterface o1, final PageAreaInterface o2) {
final BouningBox boundingBox1 = o1.getBoundingBox();
final BouningBox boundingBox2 = o2.getBoundingBox();
return compare(boundingBox1, boundingBox2);
}

protected abstract int compare(BouningBox boundingBox1, BouningBox boundingBox2);
}

Все (должны) знать компараторС, поэтому новичкам, вероятно, более знакомы с ними, чем пользовательский интерфейс, который означает немного более легкое обслуживание.

2
ответ дан 27 ноября 2011 в 01:11 Источник Поделиться