Как проверить пакетные зависимости в Scala? - PullRequest
1 голос
/ 12 декабря 2010

В моем проекте Scala у меня достаточно широкая и глубокая иерархия классов и пакетов.Очевидно, я хочу свести к минимуму зависимости пакетов.

Я не знаю, могу ли я использовать для этого компилятор, поэтому мне было интересно, как я могу использовать модульные тесты для проверки независимостипакетов?

PS: Подход, вероятно, должен работать на уровне байт-кода, так как я использую Scala, а не Java.

Ответы [ 4 ]

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

Этого нельзя сделать с помощью модульных тестов, но компилятор здесь ваш друг. Используйте private [PACKAGENAME], чтобы сделать класс видимым только внутри пакета. В отличие от Java, этот класс также будет виден в подпакетах.

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

Я настоятельно рекомендую Classycle . Он отлично работает в моем смешанном проекте Scala / Java. Он работает на уровне байт-кода, и у меня никогда не было проблем, связанных с Scala.

В небольшом проекте вы можете просто написать свой конфигурационный файл вручную. Наш проект большой, поэтому я написал скрипт Scala, который генерирует файл конфигурации. Раздел файла, сгенерированного каждым пакетом, выглядит так:

[agent] = org.nlogo.agent.* excluding org.nlogo.agent.*.*
[agent+] = [agent] [api+]
[agent-] = org.nlogo.* excluding [agent+]
check [agent] independentOf [agent-]

Это говорит о том, что org.nlogo.agent может зависеть от org.nlogo.api (и рекурсивно от разрешенных зависимостей org.nlogo.api), но не от другого пакета.

Вы также можете написать правила, которые проверяют внешние зависимости, например, вот как я проверяю, что мы зависим только от JOGL от определенных пакетов:

[JOGL-free-zone] = org.nlogo.* excluding [gl.render] [gl.view]
[JOGL] = net.java.games.* javax.media.opengl.*
check [JOGL-free-zone] independentOf [JOGL]
1 голос
/ 12 декабря 2010

Компилятор scala может сгенерировать для вас графики зависимостей, которые вы затем можете проверить с помощью домашнего инструмента.Вот как вы бы назвали это:

scalac -make:transitive -dependencyfile dep.txt *.scala

И что он генерирует:

.;C:\Progra~2\Java\jre6\lib\ext\QTJava.zip;C:\Program Files (x86)\Java\jre6\lib\ext\QTJava.zip
-------
Aposta.scala -> Aposta.scala
Aposta.scala -> Premio.scala
Aposta.scala -> Bilhete.scala
Premio.scala -> Premio.scala
Premio.scala -> Sorteio.scala
Bilhete.scala -> Aposta.scala
Bilhete.scala -> Bilhete.scala
Bilhete.scala -> Sorteio.scala
Browser.scala -> Browser.scala
Megasena.scala -> Browser.scala
Megasena.scala -> Bilhete.scala
Megasena.scala -> Sorteio.scala
Megasena.scala -> Megasena.scala
Sorteio.scala -> Premio.scala
Sorteio.scala -> Sorteio.scala
-------
Aposta.scala -> megasena\Aposta$.class
Aposta.scala -> megasena\Aposta$$anonfun$1.class
Aposta.scala -> megasena\Aposta$$anonfun$toString$1.class
Aposta.scala -> megasena\Aposta$$anonfun$toString$2.class
Aposta.scala -> megasena\Aposta.class
Premio.scala -> megasena\Premio$.class
...

Кроме того, sbt делает это автоматически (ищите файл с именем analysis/dependencies, а такжеanalysis/external в целевой директории).Вот как они выглядят:

#Source Dependencies
#Mon Jan 04 18:31:56 BRST 2010
Sorteio.scala=Megasena.scala;Premio.scala;Bilhete.scala
Premio.scala=Sorteio.scala;Aposta.scala
Browser.scala=Megasena.scala
Aposta.scala=Bilhete.scala
Bilhete.scala=Megasena.scala;Aposta.scala
Megasena.scala=
RedBlackTree.scala=

и

#External Dependencies
#Mon Jan 04 18:31:56 BRST 2010
C\:\\Workset\\megasena\\project\\boot\\scala-2.7.4\\lib\\scala-library.jar=Browser.scala;RedBlackTree.scala;Premio.scala
;Bilhete.scala;Sorteio.scala;Megasena.scala;Aposta.scala
C\:\\Arquivos\ de\ programas\\Java\\jdk1.6.0_16\\jre\\lib\\rt.jar=Browser.scala;RedBlackTree.scala;Premio.scala;Bilhete.
scala;Sorteio.scala;Megasena.scala;Aposta.scala
1 голос
/ 12 декабря 2010

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

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