Important
La 📖 documentación de esta librería está publicada aquí.
Esta librería proporciona herramientas para analizar y medir la estabilidad y calidad de una arquitectura de software, utilizando las métricas y principios definidos por Robert C. Martin, usando ArchUnit.
Para cada componente -donde en este contexto componente es un ensamblado- calcula las siguientes métricas:
-
Fan-in o acoplamiento aferente: cuántos otros componentes dependen del componente dado.
-
Fan-out o acoplamiento eferente: de cuántos otros componentes depende un componente dado.
-
Abstractness: Proporción de tipos abstractos o extensibles -interfaces, clases abstractas, registros abstractos, tipos genéricos- respecto del total de tipos
-
Instability: Medida de qué tan susceptible es el componente al cambio
$I = \frac{Ce}{Ca + Ce}$ -
Distance: Distancia de la secuencia principal
$D = |A + I - 1|$
Note
Para el cálculo de las métricas de abstracción se consideran tipos abstractos:
- Interfaces
interface - Clases abstractas
abstract class - Records abstractos
abstract record - Tipos genéricos
class<T>
ANDIS_ArchitectureMetrics/
├── src/
│ └── Ucu.Andis.ArchitectureMetrics/ # Librería principal
│ ├── Models/ # Modelos de datos
│ │ ├── Component.cs # Definición de componente
│ │ ├── ComponentMetrics.cs # Contenedor de métricas
│ │ ├── ComponentDependencies.cs # Grafo de dependencias
│ │ └── ComponentCouplings.cs # Métricas de acoplamiento
│ └── Calculators/ # Motores de cálculo
│ └── MetricsCalculator.cs # Calculador principal
│
├── tests/
│ └── Ucu.Andis.ArchitectureMetrics.Tests/ # Casos de prueba
│
├── docs/ # Documentación
├── README.md # Este archivo
└── ANDIS_ArchitectureMetrics.sln # Archivo de solución
using Ucu.Andis.ArchitectureMetrics;
using ArchUnitNET.Loader;
// Cargar assemblies
var architecture = new ArchLoader()
.LoadAssemblies(
typeof(Domain.Entity).Assembly,
typeof(Application.Command).Assembly,
typeof(Infrastructure.Repository).Assembly,
typeof(API.Controller).Assembly
)
.Build();
// Construir componentes desde los assemblies
var components = MetricsCalculator.BuildAssemblyComponents(
architecture,
"MyApp.Domain",
"MyApp.Application",
"MyApp.Infrastructure",
"MyApp.API"
);
// Calcular métricas
var metrics = MetricsCalculator.CalculateMetrics(components);
// Usar métricas para análisis
foreach (var metric in metrics)
{
Console.WriteLine($"{metric.Name}:");
Console.WriteLine($" Fan-In: {metric.FanIn}");
Console.WriteLine($" Fan-Out: {metric.FanOut}");
Console.WriteLine($" Abstractness: {metric.Abstractness:F4}");
Console.WriteLine($" Instability: {metric.Instability:F4}");
Console.WriteLine($" Distance: {metric.Distance:F4}");
}- .NET 8.0 o posterior
- TngTech.ArchUnitNET 0.13.3 o compatible
dotnet add package Ucu.Andis.ArchitectureMetricsO en tu archivo .csproj:
<ItemGroup>
<PackageReference Include="Ucu.Andis.ArchitectureMetrics" Version="1.0.0"/>
</ItemGroup>dotnet builddotnet testLos números de versión tienen la forma x.y.z donde x.y lo indica el
desarrollador y z se incrementa automáticamente. La publicación del paquete es
a través de una GitHub Action.
Esta acción se ejecuta automáticamente de la siguiente forma:
git tag v0.0
git push origin v0.0donde 0.0 es el número de versión deseado.
En caso de que el tag ya exista, eliminarlo primero con:
git tag -d v0.0
git push origin --delete v0.0La acción se puede ejecutar manualmente. En el momento de ejecutarla va a pedir
el numero de versión 0.0.
La documentación de la API se genera usando Doxygen. Consulte la carpeta docs/
para documentación detallada.
cd docs
doxygen