/** * Calculates two metrics. The number of added methods and the number of * overwritten methods. * * @param PHP_Depend_Code_Class $class The context class instance. * * @return void * @since 0.9.10 */ private function calculateNumberOfAddedAndOverwrittenMethods(PHP_Depend_Code_Class $class) { $parentClass = $class->getParentClass(); if ($parentClass === null) { return; } $parentMethodNames = array(); foreach ($parentClass->getAllMethods() as $method) { $parentMethodNames[$method->getName()] = $method->isAbstract(); } $numberOfAddedMethods = 0; $numberOfOverwrittenMethods = 0; foreach ($class->getAllMethods() as $method) { if ($method->getParent() !== $class) { continue; } if (isset($parentMethodNames[$method->getName()])) { if (!$parentMethodNames[$method->getName()]) { ++$numberOfOverwrittenMethods; } } else { ++$numberOfAddedMethods; } } $uuid = $class->getUuid(); $this->nodeMetrics[$uuid][self::M_NUMBER_OF_ADDED_METHODS] = $numberOfAddedMethods; $this->nodeMetrics[$uuid][self::M_NUMBER_OF_OVERWRITTEN_METHODS] = $numberOfOverwrittenMethods; }
/** * Initializes a empty metric container for the given class node. * * @param PHP_Depend_Code_Class $class The context class instance. * * @return void * @since 0.9.10 */ private function _initNodeMetricsForClass(PHP_Depend_Code_Class $class) { if (is_object($class->getParentClass())) { $this->_initNodeMetricsForClass($class->getParentClass()); } $uuid = $class->getUUID(); if (isset($this->_nodeMetrics[$uuid])) { return; } ++$this->_numberOfClasses; $this->_nodeMetrics[$uuid] = array(self::M_DEPTH_OF_INHERITANCE_TREE => 0, self::M_NUMBER_OF_ADDED_METHODS => 0, self::M_NUMBER_OF_DERIVED_CLASSES => 0, self::M_NUMBER_OF_OVERWRITTEN_METHODS => 0); }
/** * Calculates the Weight Method Per Class metric, this method only counts * protected and public methods of parent classes. * * @param PHP_Depend_Code_Class $class The context class instance. * * @return integer */ private function _calculateWMCi(PHP_Depend_Code_Class $class) { // List of methods, this method only counts not overwritten methods. $ccn = array(); // First collect all methods of the context class foreach ($class->getMethods() as $m) { $ccn[$m->getName()] = $this->_cyclomaticAnalyzer->getCCN2($m); } // Get parent class and collect all non private methods. $parent = $class->getParentClass(); while ($parent !== null) { // Count all methods foreach ($parent->getMethods() as $m) { if (!$m->isPrivate() && !isset($methods[$m->getName()])) { $ccn[$m->getName()] = $this->_cyclomaticAnalyzer->getCCN2($m); } } // Fetch parent class $parent = $parent->getParentClass(); } return array_sum($ccn); }