2011-01-14 3 views
4

Характеристика Traversable имеет методы, такие как toList, toMap, ToSeq. Учитывая, что List, Map, Seq являются подклассами Traversable, это создает круговую зависимость, которая составляет , как правило, не является желательным шаблоном проектирования.Циркулярная зависимость в коллекциях Scala

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

Был ли другой альтернативный проект рассмотрен? Например, класс «полезность» или добавление методов преобразования в Predef?

Скажем, я хочу добавить новый класс: class RandomList extends List {...}. Было бы неплохо иметь способ toRandomList, доступный для всех классов Traversable, но для этого мне нужно было бы «сутенер моей библиотеки» с неявным на Traversable? Это кажется немного излишним. С дизайном класса утилиты я мог бы просто расширить этот класс (или Predef), чтобы добавить мой метод преобразования. Какой был бы рекомендованный дизайн здесь?

+0

Спасибо @retronym и Daniel. Тем не менее, я в основном ищу ответ на первую часть вопроса. Является ли циклическая зависимость молчаливо принятой в качестве шаблона проектирования в библиотеках Scala? – Adrian

+0

Адриан: Да. Ответ Андрея правильный. –

+0

Существует обоснованный случай, когда коллекции Scala являются автономным модулем и, следовательно, имеют «разрешенные» значения круговых зависимостей. Тем не менее, это - биг-модуль, и он активно развивается, поэтому более чистый дизайн будет хорошим. Это несколько похоже на подход функционального программирования извне, с императивным кодом внутри (в частных методах). Я предполагаю, что для избежания циклической зависимости требуется абстрагирование по типам (т. Е. Передача классов к методу, подобному (T), а не toList(), toMap() и т. Д.), Который Scala не поддерживает (пока?). – Adrian

ответ

5

Чтобы добавить toRandomClass, вам придётся прибегнуть к сутенерам в моей библиотеке. Однако, почему вы думаете, что это слишком много? Накладные расходы незначительны. И это не будет работы, расширяющие класс утилиты - почему Scala заглянет в ваш новый класс для этого метода? Не говоря уже о том, что вам нужно создать экземпляр такого класса, чтобы иметь доступ к его методам.

5

Здесь нет круговой зависимости. Циркулярная зависимость - это то, что происходит, когда есть несколько независимых компонентов, которые ссылаются друг на друга. Стандартная библиотека Scala - это один из компонентов. Поскольку он построен всегда за один шаг, проблем нет.

+0

Не было бы странным считать такой сложный и сложный агрегат, как библиотека Скалы, атомной сущностью? Циклическая зависимость может проявляться на любом уровне граничащих между компонентами. Вы в основном стираете вопрос, сделав его «Внутренние детали» того, что не является областью интересов. Он спрашивает именно об этих внутренних деталях :-) http://en.wikipedia.org/wiki/Circular_dependency –

4

Вы правы. Давайте удалим toString из класса String ...

Смежные вопросы