Completed
Push — master ( 04a13a...fed072 )
by James
05:24 queued 02:50
created

Campaign   B

Complexity

Total Complexity 51

Size/Duplication

Total Lines 306
Duplicated Lines 2.29 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 7
loc 306
ccs 118
cts 118
cp 1
rs 8.3206
c 1
b 0
f 0
wmc 51
lcom 1
cbo 3

30 Methods

Rating   Name   Duplication   Size   Complexity  
A getProjectId() 0 4 1
A setProjectId() 0 4 1
A getChanges() 0 4 1
A setChanges() 0 4 1
A getCreated() 0 4 1
A setCreated() 0 4 1
A getEarliest() 0 4 1
A setEarliest() 0 4 1
A getExperimentIds() 0 4 1
A setExperimentIds() 0 4 1
A getHoldback() 0 4 1
A setHoldback() 0 4 1
A getLastModified() 0 4 1
A setLastModified() 0 4 1
A getLatest() 0 4 1
A setLatest() 0 4 1
A getMetrics() 0 4 1
A setMetrics() 0 4 1
A getName() 0 4 1
A setName() 0 4 1
A getPageIds() 0 4 1
A setPageIds() 0 4 1
A getStatus() 0 4 1
A setStatus() 0 4 1
A getType() 0 4 1
A setType() 0 4 1
A getId() 0 4 1
A setId() 0 4 1
D __construct() 7 35 18
B toArray() 0 36 5

How to fix   Duplicated Code    Complexity   

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:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like Campaign often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Campaign, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * @author Oleg Krivtsov <[email protected]>
4
 * @date 06 October 2016
5
 * @copyright (c) 2016, Web Marketing ROI
6
 */
7
namespace WebMarketingROI\OptimizelyPHP\Resource\v2;
8
9
use WebMarketingROI\OptimizelyPHP\Exception;
10
use WebMarketingROI\OptimizelyPHP\Resource\v2\Change;
11
use WebMarketingROI\OptimizelyPHP\Resource\v2\Metric;
12
13
/**
14
 * An Optimizely campaign.
15
 */
16
class Campaign
17
{
18
    /**
19
     * The Project ID the Campaign is in
20
     * @var integer
21
     */
22
    private $projectId;
23
    
24
    /**
25
     * A list of changes to apply to the Campaign
26
     * @var array 
27
     */
28
    private $changes;
29
    
30
    /**
31
     * The time the Experiment was initially created
32
     * @var string
33
     */
34
    private $created;
35
    
36
    /**
37
     * The first time the Experiment was activated
38
     * @var string
39
     */
40
    private $earliest;
41
    
42
    /**
43
     * An ordered list of Experiment IDs used by the Campaign
44
     * @var array
45
     */
46
    private $experimentIds;
47
    
48
    /**
49
     * Percentage expressed as a number from 0-10000 to holdback from being 
50
     * included in the experiment.
51
     * @var integer
52
     */
53
    private $holdback;
54
    
55
    /**
56
     * The last time the Experiment was modified
57
     * @var string
58
     */
59
    private $lastModified;
60
    
61
    /**
62
     * The last time the Experiment was activated (not present if it is still activated)
63
     * @var string 
64
     */
65
    private $latest;
66
    
67
    /**
68
     * An ordered list of Metrics to track for the Campaign
69
     * @var array
70
     */
71
    private $metrics;
72
    
73
    /**
74
     * The name of the Campaign
75
     * @var string
76
     */
77
    private $name;
78
    
79
    /**
80
     * A list of Page IDs used in the Campaign.
81
     * @var array
82
     */
83
    private $pageIds;
84
    
85
    /**
86
     * Current state of the Campaign. Can be 'active', 'paused' or 'archived'
87
     * @var string
88
     */
89
    private $status;
90
    
91
    /**
92
     * The type of the Campaign. Can be a/b or personalization.
93
     * @var string
94
     */
95
    private $type;
96
    
97
    /**
98
     * The unique identifier for the Campaign
99
     * @var integer
100
     */
101
    private $id;
102
    
103
    /**
104
     * Constructor.
105
     */
106 7
    public function __construct($options = array())
107
    {
108 7
        foreach ($options as $name=>$value) {
109
            switch ($name) {                
110 6
                case 'project_id': $this->setProjectId($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
111 6 View Code Duplication
                case 'changes': {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
Coding Style introduced by
case statements should be defined using a colon.

As per the PSR-2 coding standard, case statements should not be wrapped in curly braces. There is no need for braces, since each case is terminated by the next break.

There is also the option to use a semicolon instead of a colon, this is discouraged because many programmers do not even know it works and the colon is universal between programming languages.

switch ($expr) {
    case "A": { //wrong
        doSomething();
        break;
    }
    case "B"; //wrong
        doSomething();
        break;
    case "C": //right
        doSomething();
        break;
}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
112 6
                    $changes = array();
113 6
                    foreach ($value as $changeInfo) {
114 6
                        $changes[] = new Change($changeInfo);
115
                    }
116 6
                    $this->setChanges($changes); break;
117
                }
118 6
                case 'created': $this->setCreated($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
119 6
                case 'earliest': $this->setEarliest($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
120 6
                case 'experiment_ids': $this->setExperimentIds($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
121 6
                case 'holdback': $this->setHoldback($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
122 6
                case 'last_modified': $this->setLastModified($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
123 6
                case 'latest': $this->setLatest($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
124 6
                case 'metrics': {
0 ignored issues
show
Coding Style introduced by
case statements should be defined using a colon.

As per the PSR-2 coding standard, case statements should not be wrapped in curly braces. There is no need for braces, since each case is terminated by the next break.

There is also the option to use a semicolon instead of a colon, this is discouraged because many programmers do not even know it works and the colon is universal between programming languages.

switch ($expr) {
    case "A": { //wrong
        doSomething();
        break;
    }
    case "B"; //wrong
        doSomething();
        break;
    case "C": //right
        doSomething();
        break;
}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
125 6
                    $metrics = array();
126 6
                    foreach ($value as $metricInfo) {
127 6
                        $metrics[] = new Metric($metricInfo);
128
                    }
129 6
                    $this->setMetrics($metrics); break;
130
                }
131 6
                case 'name': $this->setName($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
132 6
                case 'page_ids': $this->setPageIds($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
133 6
                case 'status': $this->setStatus($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
134 6
                case 'type': $this->setType($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
135 4
                case 'id': $this->setId($value); break;
0 ignored issues
show
Coding Style introduced by
The case body in a switch statement must start on the line following the statement.

According to the PSR-2, the body of a case statement must start on the line immediately following the case statement.

switch ($expr) {
case "A":
    doSomething(); //right
    break;
case "B":

    doSomethingElse(); //wrong
    break;

}

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
Coding Style introduced by
Terminating statement must be on a line by itself

As per the PSR-2 coding standard, the break (or other terminating) statement must be on a line of its own.

switch ($expr) {
     case "A":
         doSomething();
         break; //wrong
     case "B":
         doSomething();
         break; //right
     case "C:":
         doSomething();
         return true; //right
 }

To learn more about the PSR-2 coding standard, please refer to the PHP-Fig.

Loading history...
136
                default:
137 6
                    throw new Exception('Unknown option: ' . $name);
138
            }
139
        }
140 7
    }
141
    
142
    /**
143
     * Returns this object as array.
144
     */
145 3
    public function toArray()
146
    {
147
        $options = array(
148 3
            'project_id' => $this->getProjectId(),
149
            'changes' => array(),
150 3
            'created' => $this->getCreated(),
151 3
            'earliest' => $this->getEarliest(),
152 3
            'experiment_ids' => $this->getExperimentIds(),
153 3
            'holdback' => $this->getHoldback(),
154 3
            'last_modified' => $this->getLastModified(),
155 3
            'latest' => $this->getLatest(),
156
            'metrics' => array(),
157 3
            'name' => $this->getName(),
158 3
            'page_ids' => $this->getPageIds(),
159 3
            'status' => $this->getStatus(),
160 3
            'type' => $this->getType(),
161 3
            'id' => $this->getId()
162
        );
163
        
164 3
        foreach ($this->getChanges() as $change) {
165 3
            $options['changes'][] = $change->toArray();
166
        }
167
        
168 3
        foreach ($this->getMetrics() as $metric) {
169 3
            $options['metrics'][] = $metric->toArray();
170
        }
171
        
172
        // Remove options with empty values
173 3
        $cleanedOptions = array();
174 3
        foreach ($options as $name=>$value) {
175 3
            if ($value!==null)
176 3
                $cleanedOptions[$name] = $value;
177
        }
178
        
179 3
        return $cleanedOptions;
180
    }
181
    
182 5
    public function getProjectId()
183
    {
184 5
        return $this->projectId;
185
    }
186
    
187 7
    public function setProjectId($projectId)
188
    {
189 7
        $this->projectId = $projectId;
190 7
    }
191
    
192 5
    public function getChanges()
193
    {
194 5
        return $this->changes;
195
    }
196
    
197 7
    public function setChanges($changes)
198
    {
199 7
        $this->changes = $changes;
200 7
    }
201
    
202 4
    public function getCreated()
203
    {
204 4
        return $this->created;
205
    }
206
    
207 7
    public function setCreated($created)
208
    {
209 7
        $this->created = $created;
210 7
    }
211
    
212 3
    public function getEarliest()
213
    {
214 3
        return $this->earliest;
215
    }
216
    
217 7
    public function setEarliest($earliest)
218
    {
219 7
        $this->earliest = $earliest;
220 7
    }
221
    
222 3
    public function getExperimentIds()
223
    {
224 3
        return $this->experimentIds;
225
    }
226
    
227 7
    public function setExperimentIds($experimentIds)
228
    {
229 7
        $this->experimentIds = $experimentIds;
230 7
    }
231
    
232 3
    public function getHoldback()
233
    {
234 3
        return $this->holdback;
235
    }
236
    
237 7
    public function setHoldback($holdback)
238
    {
239 7
        $this->holdback = $holdback;
240 7
    }
241
    
242 3
    public function getLastModified()
243
    {
244 3
        return $this->lastModified;
245
    }
246
    
247 7
    public function setLastModified($lastModified)
248
    {
249 7
        $this->lastModified = $lastModified;
250 7
    }
251
    
252 3
    public function getLatest()
253
    {
254 3
        return $this->latest;
255
    }
256
    
257 7
    public function setLatest($latest)
258
    {
259 7
        $this->latest = $latest;
260 7
    }
261
    
262 5
    public function getMetrics()
263
    {
264 5
        return $this->metrics;
265
    }
266
    
267 7
    public function setMetrics($metrics)
268
    {
269 7
        $this->metrics = $metrics;
270 7
    }
271
    
272 6
    public function getName()
273
    {
274 6
        return $this->name;
275
    }
276
    
277 7
    public function setName($name)
278
    {
279 7
        $this->name = $name;
280 7
    }
281
    
282 3
    public function getPageIds()
283
    {
284 3
        return $this->pageIds;
285
    }
286
    
287 7
    public function setPageIds($pageIds)
288
    {
289 7
        $this->pageIds = $pageIds;
290 7
    }
291
    
292 3
    public function getStatus()
293
    {
294 3
        return $this->status;
295
    }
296
    
297 7
    public function setStatus($status)
298
    {
299 7
        $this->status = $status;
300 7
    }
301
    
302 4
    public function getType()
303
    {
304 4
        return $this->type;
305
    }
306
    
307 7
    public function setType($type)
308
    {
309 7
        $this->type = $type;
310 7
    }
311
    
312 4
    public function getId()
313
    {
314 4
        return $this->id;
315
    }
316
    
317 5
    public function setId($id)
318
    {
319 5
        $this->id = $id;
320 5
    }
321
}
322
323
324
325
326