Hal\Pattern\Resolver\Anti\GodObject\GodObjectResolver::resolve PHP Method

resolve() public method

8 public methods or more (excluding getters and setters) lack of cohesion of methods instanciate 6 or more different classes
public resolve ( Hal\Pattern\Resolver\ResolvedClass $resolved )
$resolved Hal\Pattern\Resolver\ResolvedClass
    public function resolve(ResolvedClass $resolved)
    {
        $class = $resolved->getClass();
        $pattern = new GodObject($class->getFullname());
        // we don't look private methods
        $collection = (new Collection($class->getMethods()))->where('method => method.getVisibility() == "public"');
        // at least 8 public methods
        if (sizeof($collection) < 8) {
            return;
        }
        // lack of cohesion of methods
        $lcom = new LackOfCohesionOfMethods();
        $result = $lcom->calculate($class);
        if ($result->getLcom() < 3) {
            return;
        }
        // know everything (instanciate more than 8 different classes)
        $nb = 0;
        foreach ($collection as $method) {
            $instancied = array_diff($method->getInstanciedClasses(), array($class->getFullname()));
            $nb += sizeof($instancied);
        }
        if ($nb < 6) {
            return;
        }
        $resolved->pushPattern($pattern);
    }

Usage Example

 public function testGodObjectIsDetected()
 {
     $filename = __DIR__ . '/../../../../resources/patterns/godobject.php';
     $extractor = new Extractor(new Tokenizer());
     $result = $extractor->extract($filename);
     $classes = $result->getClasses();
     $resolver = new GodObjectResolver($classes);
     $resolved = new ResolvedClass($classes[0]);
     $resolver->resolve($resolved);
     $this->assertEquals(1, sizeof($resolved->getPatterns()));
     $resolved = new ResolvedClass($classes[1]);
     $resolver->resolve($resolved);
     $this->assertEquals(0, sizeof($resolved->getPatterns()));
 }
GodObjectResolver