Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
18 / 18
CouplingMaker
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
8
100.00% covered (success)
100.00%
18 / 18
 createReducedGraph()
100.00% covered (success)
100.00%
1 / 1
8
100.00% covered (success)
100.00%
18 / 18
<?php
/*
 * Mondrian
 */
namespace Trismegiste\Mondrian\Analysis;
use Trismegiste\Mondrian\Graph\Algorithm;
use Trismegiste\Mondrian\Transform\Vertex\InterfaceVertex;
use Trismegiste\Mondrian\Transform\Vertex\MethodVertex;
use Trismegiste\Mondrian\Transform\Vertex\ParamVertex;
use Trismegiste\Mondrian\Transform\Vertex\ClassVertex;
/**
 * CouplingMaker searches for interface with class in its methods parameters.
 *
 * This is bad because each time you inherit from these interface, you create
 * coupling between concrete classes and god kills a kitten.
 *
 * That's why these interfaces are literally "coupling generators", this is
 * a seed for spaghetti coupling.
 */
class CouplingMaker extends Algorithm implements Generator
{
    public function createReducedGraph()
    {
        $reduced = new \Trismegiste\Mondrian\Graph\Digraph();
        foreach ($this->getEdgeSet() as $declaring) {
            // we search for methods declared in interfaces
            if (($declaring->getSource() instanceof InterfaceVertex)
                    && ($declaring->getTarget() instanceof MethodVertex)) {
                $method = $declaring->getTarget();
                // scan for all parameters
                foreach ($this->getEdgeIterator($method) as $param) {
                    if ($param instanceof ParamVertex) {
                        // we find a param, we scan for type hint
                        foreach ($this->getEdgeIterator($param) as $typeHint) {
                            if ($typeHint instanceof ClassVertex) {
                                // we find a typed parameter with a class : evil
                                // we add the shortcut path (skip the parameter, not relevant)
                                $reduced->addEdge($declaring->getSource(), $method);
                                $reduced->addEdge($method, $typeHint);
                            }
                        }
                    }
                }
            }
        } // I love this ^o^
        return $reduced;
    }
}