Последовательность, ясность и удобство API, основанные на симметрии

Приверженность API-симметрии

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

Методы изменяемого конвертера

У нас были в основном изменяемые методы конвертера в Eclipse Collections, начиная с версии 1.0.

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

Давайте посмотрим на следующий пример из Колоды карт Ката:

private ImmutableList<Card> cards;
private ImmutableListMultimap<Suit, Card> cardsBySuit;
public EclipseCollectionsDeckOfCardsAsList()
{
    this.cards = Card.lazyCards().toList().toImmutable();
    this.cardsBySuit = this.cards.groupBy(Card::suit);
}

В этом примере нам нужно создать ImmutableList<Card> из LazyIterable<Card>, которое является декартовым произведением Rank и Suit. Сначала мы вызываем Card.lazyCards, который возвращает LazyIterable<Card>. Затем мы вызываем toList, который возвращает MutableList<Card>, и, наконец, вызываем toImmutable, который возвращает ImmutableList<Card>.

Долгое время я находил этот двухэтапный процесс преобразования одного типа в неизменяемую версию другого типа в Eclipse Collections незначительным, но постоянным раздражением. Мне также пришлось объяснять разработчикам, использующим Eclipse Collections, что не существует эквивалентных методов с именами toImmutableList, toImmutableSet, toImmutableBag и т. Д.

Теперь это изменится в Eclipse Collections 11.0. Теперь мы сможем написать следующий код.

public EclipseCollectionsDeckOfCardsAsImmutableList()
{
    this.cards = Card.lazyCards().toImmutableList();
    this.cardsBySuit = this.cards.groupBy(Card::suit);
}

В Eclipse Collections 11.0 у нас будет toImmutableList, toImmutableSet и toImmutableBag на RichIterable. Это только начало пути к лучшей симметрии.

Визуализация симметрии методов конвертера

Вот как будет выглядеть API метода конвертера Eclipse Collections в будущем.

Пока что я добавил toImmutableList, toImmutableSet и toImmutableBag в интерфейс RichIterable. Изображение выше показывает нам четкий путь, по которому мы должны следовать со стороны toImmutable, чтобы улучшить симметрию API-интерфейсов методов конвертера.

Прогулка пешком

Я люблю говорить, что симметрия подобна гравитации. Когда я вижу недостающие или непохожие модели, я чувствую тяжесть симметрии. Это работа, которую еще предстоит сделать.

Это была цитата из моего первого блога на Medium под названием Симметричная симпатия. Хотя может оказаться непрактичным иметь идеальную симметрию в API, столь же богатом и полном, как Eclipse Collections, мы можем продолжать совершенствоваться, когда увидим отсутствие ясности, согласованности и удобства. Это прогулка пешком. Важно соответствовать потребностям и ожиданиям сообщества пользователей Eclipse Collections. Я видел, как разработчики пытались вызывать toImmutableList и toImmutableSet для типов в коллекциях Eclipse и находили сбивающим с толку отсутствие эквивалента методов to (Mutable) для неизменяемых типов. Теперь их ожидания оправдаются благодаря API, которые они искали.

Следите за обновлениями, симметрия постоянно улучшается.

Требуется помощь

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



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

Я руководитель проекта и ответственный за проект OSS Коллекции Eclipse в Eclipse Foundation. Eclipse Collections открыта для пожертвований. Если вам нравится библиотека, вы можете сообщить нам об этом, отметив ее на GitHub.

Другие статьи о Java, которые могут вам понравиться