Completed
Pull Request — master (#448)
by
unknown
08:31
created

PackageInstability::calculate()   B

Complexity

Conditions 6
Paths 9

Size

Total Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
nc 9
nop 1
dl 0
loc 38
rs 8.6897
c 0
b 0
f 0
1
<?php
2
3
namespace Hal\Metric\Package;
4
5
use Hal\Metric\Metrics;
6
use Hal\Metric\PackageMetric;
7
use Hal\ShouldNotHappenException;
8
9
class PackageInstability
10
{
11
    /** @return void */
12
    public function calculate(Metrics $metrics)
13
    {
14
        /* @var $packages PackageMetric[] */
15
        $packages = array_filter($metrics->all(), function ($metric) {
16
            return $metric instanceof PackageMetric;
17
        });
18
19
        // Calculate instability
20
        $instabilitiesByPackage = [];
21
        foreach ($packages as $eachPackage) {
22
            $afferentCoupling = count($eachPackage->getIncomingClassDependencies());
23
            $efferentCoupling = count($eachPackage->getOutgoingClassDependencies());
24
            if ($afferentCoupling + $efferentCoupling !== 0) {
25
                $eachPackage->setInstability(
26
                    $efferentCoupling / ($afferentCoupling + $efferentCoupling)
27
                );
28
                $instabilitiesByPackage[$eachPackage->getName()] = $eachPackage->getInstability();
0 ignored issues
show
Bug introduced by
Consider using $eachPackage->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
29
            }
30
        }
31
        // Set depending instabilities
32
        foreach ($packages as $eachPackage) {
33
            $dependentInstabilities = array_map(function ($packageName) use ($instabilitiesByPackage) {
34
                return isset($instabilitiesByPackage[$packageName]) ? $instabilitiesByPackage[$packageName] : null;
35
            }, $eachPackage->getOutgoingPackageDependencies());
36
37
            $dependentInstabilities = array_combine(
38
                $eachPackage->getOutgoingPackageDependencies(),
39
                $dependentInstabilities
40
            );
41
42
            if ($dependentInstabilities === false) {
43
                throw new ShouldNotHappenException('$dependentInstabilities is false');
44
            }
45
46
            $dependentInstabilities = array_filter($dependentInstabilities, 'is_float');
47
            $eachPackage->setDependentInstabilities($dependentInstabilities);
48
        }
49
    }
50
}
51