for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace Hal\Metric\Package;
use Hal\Metric\Metrics;
use Hal\Metric\PackageMetric;
class PackageInstability
{
public function calculate(Metrics $metrics)
/* @var $packages PackageMetric[] */
$packages = array_filter($metrics->all(), function ($metric) {
return $metric instanceof PackageMetric;
});
// Calculate instability
$instabilitiesByPackage = [];
foreach ($packages as $eachPackage) {
$afferentCoupling = count($eachPackage->getIncomingClassDependencies());
$efferentCoupling = count($eachPackage->getOutgoingClassDependencies());
if ($afferentCoupling + $efferentCoupling !== 0) {
$eachPackage->setInstability(
$efferentCoupling / ($afferentCoupling + $efferentCoupling)
);
$instabilitiesByPackage[$eachPackage->getName()] = $eachPackage->getInstability();
}
// Set depending instabilities
$dependentInstabilities = array_map(function ($packageName) use ($instabilitiesByPackage) {
return isset($instabilitiesByPackage[$packageName]) ? $instabilitiesByPackage[$packageName] : null;
}, $eachPackage->getOutgoingPackageDependencies());
$dependentInstabilities = array_combine(
$eachPackage->getOutgoingPackageDependencies(),
$dependentInstabilities
$dependentInstabilities = array_filter($dependentInstabilities, 'is_float');
$eachPackage->setDependentInstabilities($dependentInstabilities);