SetIterator   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 84
Duplicated Lines 14.29 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 6
c 1
b 0
f 0
lcom 1
cbo 3
dl 12
loc 84
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A next() 12 12 2
A hasNext() 0 4 1
A remove() 0 13 2

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
namespace Jmw\Collection\Set;
3
4
use Jmw\Collection\IteratorInterface;
5
use Jmw\Collection\Exception\NoSuchElementException;
6
use Jmw\Collection\Exception\IllegalStateException;
7
8
/**
9
 * An iterator on a set. It uses an array to keep track
10
 * of the current location of iteration. Any modification to
11
 * the set during iteration except by using the iterator's 
12
 * remove method will put the iterator into an
13
 * undefined state.
14
 * @author john
15
 *
16
 */
17
class SetIterator implements IteratorInterface
18
{
19
	/**
20
	 * @var array
21
	 */
22
	protected $array;
23
	
24
	/**
25
	 * @var SetInterface
26
	 */
27
	protected $set;
28
	
29
	/**
30
	 * @var int
31
	 */
32
	protected $index;
33
	
34
	/**
35
	 * @var boolean
36
	 */
37
	protected $canRemove;
38
	
39
	/**
40
	 * Constructs a new SetIterator
41
	 * @param SetInterface $set
42
	 */
43
	public function __construct(SetInterface $set)
44
	{
45
		$this->array = $set->toArray();
46
		$this->index = -1;
47
		$this->set = $set;
48
		$this->canRemove = false;
49
	}
50
	
51
	/**
52
	 * Returns the next element in the iteration.
53
	 * @return multitype
54
	 */
55 View Code Duplication
	public function next()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
56
	{
57
		if($this->hasNext())
58
		{
59
			$this->canRemove = true;
60
			return $this->array[++$this->index];
61
		}
62
		else
63
		{
64
			throw new NoSuchElementException();
65
		}
66
	}
67
68
	/**
69
	 * Returns true if the iteration has more elements. (In other words, returns
70
	 * true if next() would return an element rather than throwing an exception.)
71
	 * @return boolean
72
	 */
73
	public function hasNext()
74
	{
75
		return $this->index + 1 < $this->set->size();
76
	}
77
	
78
	/**
79
	 * Removes from the underlying collection the last
80
	 * element returned by this iterator (optional operation).
81
	 * This method can be called only once per call to next().
82
	 * The behavior of an iterator is unspecified if the underlying
83
	 * collection is modified while the iteration is in progress in any
84
	 * way other than by calling this method.
85
	 * @return boolean
86
	 */
87
	public function remove()
88
	{
89
		if($this->canRemove)
90
		{
91
			$removed = $this->set->remove($this->array[$this->index--]);
0 ignored issues
show
Unused Code introduced by
$removed is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
92
			$this->array = $this->set->toArray();
93
			$this->canRemove = false;
94
		}
95
		else
96
		{
97
			throw new IllegalStateException();
98
		}
99
	}
100
}