Должен ли я делать такие вещи? - PullRequest
3 голосов
/ 11 декабря 2010

Я только начал изучать гуаву. Так что я не знаю лучших практик и т. Д. Вот код (он связывает некоторые классы и помещает их в Order by input):

public ImmutableList<ModelBean> toBean(Collection<Shape> model) {
    return ImmutableList.copyOf(Collections2.transform(Ordering.from(new Comparator<Shape>() {
        @Override
        public int compare(Shape o1, Shape o2) {
            return 0; //here placed some one line logic
        }
    }).sortedCopy(model), new Function<Shape, ModelBean>() {
        final ModelBeanCreator binder = new ModelBeanCreator();

        @Override
        public ModelBean apply(Shape input) {
            return binder.createModelBean(input);
        }
    }));
}

Итак, я должен разделить его на несколько операций?

UPD Что это делает? Требуется сбор. Сортирует это. Сопоставляет каждый объект другому. Создает новый ImmutableList и возвращает его.

Ответы [ 3 ]

5 голосов
/ 11 декабря 2010

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

Вместо этого объявляйте свои предикаты, упорядочения, проекции и т. Д. Как константы:

private static Function<Shape, ModelBean> MODEL_BEAN_PROJECTION =
    new Function<Shape, ModelBean>() {
    final ModelBeanCreator binder = new ModelBeanCreator();

    @Override
    public ModelBean apply(Shape input) {
        return binder.createModelBean(input);
    }
};

, затем вы можете использовать MODEL_BEAN_PROJECTION в своем вызове метода позже,Таким образом, вы можете получить код, который на самом деле достаточно прост для чтения, несмотря на большие усилия.

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

2 голосов
/ 11 декабря 2010

Как отметил Джон Скит, перемещение анонимных объектов в константы или отдельные объявления может сделать код более читабельным.Если вы используете те же анонимные объекты в другом месте, они могут быть ограничены областью действия на уровне класса, но вы также можете использовать их как заключительные объявления в методе, если вы действительно хотите предотвратить их повторное использование.

1 голос
/ 12 декабря 2010

Другой вопрос - использовать ли вообще функциональные программные конструкции, такие как Collections2.transform ().Вместо этого вы можете сказать:

ImmutableList.Builder<ModelBean> builder = ImmutableList.builder();
for (Shape shape : sortedShapes) {
  builder.add(binder.createModelBean(shape));
}
return builder.build();

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

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