public function testCouplingTakesCareOfReturnedValues() { $filename = __DIR__ . '/../../../../../resources/coupling/f1.php'; $extractor = new Extractor(new Tokenizer()); $classmap = new ClassMap(); $classmap->push($filename, $extractor->extract($filename)); $coupling = new Coupling(); $this->result = $coupling->calculate($classmap); $this->assertEquals(0, $this->result->get('\\ClassWhoUseAnother')->getAfferentCoupling()); $this->assertEquals(1, $this->result->get('\\ClassWhoUseAnother')->getEfferentCoupling()); $this->assertEquals(1, $this->result->get('\\ClassWhoIsUsed')->getAfferentCoupling()); $this->assertEquals(0, $this->result->get('\\ClassWhoIsUsed')->getEfferentCoupling()); }
/** * Calculates lcom for file (and not for class) * * @param string $filename * @return Result */ public function calculate($filename) { $rOOP = $this->classMap->getClassesIn($filename); $result = new Result($filename); $n = 0; $lcom = new LackOfCohesionOfMethods(); foreach ($rOOP->getClasses() as $class) { $r = $lcom->calculate($class); $n += $r->getLcom(); } $result->setLcom($n); return $result; }
/** * Calculates system complexity * * @param string $filename * @return Result */ public function calculate($filename) { $rOOP = $this->classMap->getClassesIn($filename); $result = new Result($filename); $len = 0; $sy = $dc = $sc = array(); $calculator = new SystemComplexity(); foreach ($rOOP->getClasses() as $class) { $r = $calculator->calculate($class); $len += sizeof($class->getMethods(), COUNT_NORMAL); $sy[] = $r->getTotalSystemComplexity(); $dc[] = $r->getTotalDataComplexity(); $sc[] = $r->getTotalStructuralComplexity(); } if ($len > 0 && sizeof($dc, COUNT_NORMAL) > 0) { $result->setRelativeStructuralComplexity(round(array_sum($sc) / $len, 2))->setRelativeDataComplexity(round(array_sum($dc) / $len, 2))->setRelativeSystemComplexity(round(array_sum($sy) / $len, 2))->setTotalStructuralComplexity(array_sum($sc))->setTotalDataComplexity(array_sum($dc))->setTotalSystemComplexity(array_sum($dc) + array_sum($sc)); } return $result; }
/** * Calculates coupling for file (and not for class) * * @param string $filename * @return Result */ public function calculate($filename) { $rOOP = $this->classMap->getClassesIn($filename); $result = new Result($filename); // case of file doesn't contain any class if (null === $rOOP) { return $result; } $instability = $ce = $ca = 0; $classes = $rOOP->getClasses(); foreach ($classes as $declaredClass) { $declaredClassCoupling = $this->couplingMap->get($declaredClass->getFullname()); $ce += $declaredClassCoupling->getEfferentCoupling(); $ca += $declaredClassCoupling->getAfferentCoupling(); } if ($ca + $ce > 0) { $instability = $ce / ($ca + $ce); } $result->setAfferentCoupling($ca)->setEfferentCoupling($ce)->setInstability($instability); return $result; }
/** * Extracts afferent and efferent coupling * * @param ClassMap $result * @return array */ private function extractCoupling(ClassMap $result) { $results = $result->all(); $classes = array(); foreach ($results as $result) { $classes = array_merge($classes, $result->getClasses()); } $map = array(); foreach ($classes as $class) { if (!isset($map[$class->getFullname()])) { $map[$class->getFullname()] = new Result($class->getFullname()); } $dependencies = $class->getDependencies(); $map[$class->getFullname()]->setEfferentCoupling(sizeof($dependencies, COUNT_NORMAL)); foreach ($dependencies as $dependency) { if (!isset($map[$dependency])) { $map[$dependency] = new Result($dependency); } $map[$dependency]->setAfferentCoupling($map[$dependency]->getAfferentCoupling() + 1); } } return $map; }
/** * Run analyze * * @param $filename * @return \Hal\Component\Result\ResultSet */ public function execute($filename) { $rHalstead = $this->halstead->calculate($filename); $rLoc = $this->loc->calculate($filename); $rMcCabe = $this->mcCabe->calculate($filename); $rMyer = $this->myer->calculate($filename); $rMaintenability = $this->maintenabilityIndex->calculate($rHalstead, $rLoc, $rMcCabe); $resultSet = new \Hal\Component\Result\ResultSet($filename); $resultSet->setLoc($rLoc)->setMcCabe($rMcCabe)->setMyer($rMyer)->setHalstead($rHalstead)->setMaintenabilityIndex($rMaintenability); if ($this->withOOP) { $rOOP = $this->extractor->extract($filename); $this->classMap->push($filename, $rOOP); $resultSet->setOOP($rOOP); } return $resultSet; }