Понимание возможностей Scala
Во-первых, нам необходимо понять возможности и ограничения каждой стратегии модульности.
Пакеты
Они работают так же, как в Java. Вы можете использовать много файлов для объявления различных частей одного пакета, и вы можете вкладывать много уровней. Это обеспечивает максимальную гибкость с вашим макетом. Тем не менее, поскольку загрузчики классов по умолчанию ожидают найти только классы и интерфейсы в пакетах, это все, что Scala позволяет вам там разместить. (Классы, черты и объекты.)
Предметы
Объекты могут содержать что угодно - методы, поля, другие объекты, классы, признаки и т. Д. Подклассы, признаки и объекты на самом деле являются их собственными отдельными сущностями, в которых содержащий объект является префиксом с именами (если JVM обеспокоен). Объект должен содержаться целиком в одном файле, и хотя вы можете вкладывать подклассы сколь угодно глубоко, это делается путем искажения все более длинных имен, а не добавления в путь для загрузчика классов.
Объекты упаковки
Проблема с наличием только объектов и пакетов заключается в том, что вам может понадобиться вложенная структура:
scala.xml
scala.xml.include
scala.xml.include.sax
так что вам нужно использовать пакеты (чтобы не было одного гигантского файла и беспорядочно длинных имен классов). Но вы также можете захотеть
import scala.xml._
чтобы сделать доступными различные константы и неявные преобразования, чтобы вам приходилось использовать объект. Пакетные объекты приходят на помощь; по сути, они такие же, как обычные объекты, но когда вы говорите
import scala.xml._
вы получаете как все в пакете (scala.xml._
), так и все в соответствующем объекте пакета (scala.xml.package
).
Как модулировать ваш код
Теперь, когда мы знаем, как работает каждая часть, существуют довольно очевидные правила организации:
- Поместите связанный код в пакет
- Если есть много связанных частей, поместите их в подпакеты
- Если пакет требует имплицитов или констант, поместите их в объект пакета для этого пакета
- Если у вас есть терминальная ветвь вашей иерархии пакетов, вы можете выбрать, должен ли это быть объект или объект пакета. Есть несколько вещей, которые объектам пакета запрещается делать (хотя список все меньше и меньше - я не уверен, что что-то осталось, кроме запрета на скрытие других имен в пакете), поэтому обычный объект может быть лучшим выбором. Пока вы не беспокоитесь о бинарной совместимости, потом легко передумаете - просто измените
object
на package object
в большинстве случаев.