Complex classes like AbstractUpdateAction 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 AbstractUpdateAction, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
11 | class AbstractUpdateAction extends Param |
||
12 | { |
||
13 | /** |
||
14 | * @var Document |
||
15 | */ |
||
16 | protected $_upsert; |
||
17 | |||
18 | /** |
||
19 | * Sets the id of the document. |
||
20 | */ |
||
21 | public function setId(?string $id = null): self |
||
25 | |||
26 | /** |
||
27 | * Returns document id. |
||
28 | * |
||
29 | * @return string|null Document id |
||
30 | */ |
||
31 | public function getId(): ?string |
||
35 | |||
36 | public function hasId(): bool |
||
40 | |||
41 | /** |
||
42 | * Sets the document index name. |
||
43 | * |
||
44 | * @param Index|string $index Index name |
||
45 | */ |
||
46 | public function setIndex($index): self |
||
54 | |||
55 | /** |
||
56 | * Get the document index name. |
||
57 | * |
||
58 | * @throws \Elastica\Exception\InvalidException |
||
59 | * |
||
60 | * @return string Index name |
||
61 | */ |
||
62 | public function getIndex(): string |
||
66 | |||
67 | /** |
||
68 | * Sets the version parameters of a document for use with optimistic concurrency control. |
||
69 | * |
||
70 | * @return $this |
||
71 | */ |
||
72 | public function setVersionParams(array $responseData): self |
||
73 | { |
||
74 | if (isset($responseData['_version'])) { |
||
75 | $this->setVersion($responseData['_version']); |
||
76 | } |
||
77 | |||
78 | if (isset($data['_seq_no'])) { |
||
|
|||
79 | $this->setSequenceNumber($responseData['_seq_no']); |
||
80 | } |
||
81 | |||
82 | if (isset($data['_primary_term'])) { |
||
83 | $this->setPrimaryTerm($responseData['_primary_term']); |
||
84 | } |
||
85 | |||
86 | return $this; |
||
87 | } |
||
88 | |||
89 | /** |
||
90 | * Sets the sequence number of a document for use with optimistic concurrency control. |
||
91 | * |
||
92 | * @param int $number Sequence Number |
||
93 | * |
||
94 | * @return $this |
||
95 | * |
||
96 | * @see https://www.elastic.co/guide/en/elasticsearch/reference/6.8/optimistic-concurrency-control.html |
||
97 | */ |
||
98 | public function setSequenceNumber(int $number): self |
||
99 | { |
||
100 | return $this->setParam('if_seq_no', $number); |
||
101 | } |
||
102 | |||
103 | /** |
||
104 | * Returns document version. |
||
105 | * |
||
106 | * @return int Document version |
||
107 | */ |
||
108 | public function getSequenceNumber(): int |
||
109 | { |
||
110 | return $this->getParam('if_seq_no'); |
||
111 | } |
||
112 | |||
113 | public function hasSequenceNumber(): bool |
||
114 | { |
||
115 | return $this->hasParam('if_seq_no'); |
||
116 | } |
||
117 | |||
118 | /** |
||
119 | * Sets the primary term of a document for use with optimistic concurrency control. |
||
120 | * |
||
121 | * @param int $term Primary Term |
||
122 | * |
||
123 | * @return $this |
||
124 | * |
||
125 | * @see https://www.elastic.co/guide/en/elasticsearch/reference/6.8/optimistic-concurrency-control.html |
||
126 | */ |
||
127 | public function setPrimaryTerm(int $term): self |
||
128 | { |
||
129 | return $this->setParam('if_primary_term', $term); |
||
130 | } |
||
131 | |||
132 | /** |
||
133 | * Returns document version. |
||
134 | * |
||
135 | * @return int Document version |
||
136 | */ |
||
137 | public function getPrimaryTerm(): int |
||
138 | { |
||
139 | return $this->getParam('if_primary_term'); |
||
140 | } |
||
141 | |||
142 | public function hasPrimaryTerm(): bool |
||
143 | { |
||
144 | return $this->hasParam('if_primary_term'); |
||
145 | } |
||
146 | |||
147 | /** |
||
148 | * Sets the version of a document. |
||
149 | * |
||
150 | * @param int $version Document version |
||
151 | * |
||
152 | * @return $this |
||
153 | * |
||
154 | * @see https://www.elastic.co/blog/versioning |
||
155 | */ |
||
156 | public function setVersion(int $version): self |
||
157 | { |
||
158 | return $this->setParam('_version', $version); |
||
159 | } |
||
160 | |||
161 | /** |
||
162 | * Returns document version. |
||
163 | * |
||
164 | * @return int Document version |
||
165 | */ |
||
166 | public function getVersion(): int |
||
167 | { |
||
168 | return $this->getParam('_version'); |
||
169 | } |
||
170 | |||
171 | public function hasVersion(): bool |
||
172 | { |
||
173 | return $this->hasParam('_version'); |
||
174 | } |
||
175 | |||
176 | /** |
||
177 | * Set operation type. |
||
178 | * |
||
179 | * @param string $opType Only accept create |
||
180 | * |
||
181 | * @return $this |
||
182 | */ |
||
183 | public function setOpType(string $opType): self |
||
184 | { |
||
185 | return $this->setParam('op_type', $opType); |
||
186 | } |
||
187 | |||
188 | /** |
||
189 | * Get operation type. |
||
190 | */ |
||
191 | public function getOpType(): string |
||
192 | { |
||
193 | return $this->getParam('op_type'); |
||
194 | } |
||
195 | |||
196 | public function hasOpType(): bool |
||
197 | { |
||
198 | return $this->hasParam('op_type'); |
||
199 | } |
||
200 | |||
201 | /** |
||
202 | * Set routing query param. |
||
203 | * |
||
204 | * @param string $value routing |
||
205 | * |
||
206 | * @return $this |
||
207 | */ |
||
208 | public function setRouting(string $value): self |
||
209 | { |
||
210 | return $this->setParam('routing', $value); |
||
211 | } |
||
212 | |||
213 | /** |
||
214 | * Get routing parameter. |
||
215 | */ |
||
216 | public function getRouting(): string |
||
217 | { |
||
218 | return $this->getParam('_routing'); |
||
219 | } |
||
220 | |||
221 | public function hasRouting(): bool |
||
222 | { |
||
223 | return $this->hasParam('_routing'); |
||
224 | } |
||
225 | |||
226 | /** |
||
227 | * @param array|string $fields |
||
228 | * |
||
229 | * @return $this |
||
230 | */ |
||
231 | public function setFields($fields): self |
||
232 | { |
||
233 | if (\is_array($fields)) { |
||
234 | $fields = \implode(',', $fields); |
||
235 | } |
||
236 | |||
237 | return $this->setParam('fields', (string) $fields); |
||
238 | } |
||
239 | |||
240 | /** |
||
241 | * @return $this |
||
242 | */ |
||
243 | public function setFieldsSource(): self |
||
244 | { |
||
245 | return $this->setFields('_source'); |
||
246 | } |
||
247 | |||
248 | public function getFields(): string |
||
249 | { |
||
250 | return $this->getParam('fields'); |
||
251 | } |
||
252 | |||
253 | public function hasFields(): bool |
||
254 | { |
||
255 | return $this->hasParam('fields'); |
||
256 | } |
||
257 | |||
258 | /** |
||
259 | * @return $this |
||
260 | */ |
||
261 | public function setRetryOnConflict(int $num): self |
||
262 | { |
||
263 | return $this->setParam('retry_on_conflict', (int) $num); |
||
264 | } |
||
265 | |||
266 | public function getRetryOnConflict(): int |
||
267 | { |
||
268 | return $this->getParam('retry_on_conflict'); |
||
269 | } |
||
270 | |||
271 | public function hasRetryOnConflict(): bool |
||
272 | { |
||
273 | return $this->hasParam('_retry_on_conflict'); |
||
274 | } |
||
275 | |||
276 | /** |
||
277 | * @param bool|string $refresh |
||
278 | * |
||
279 | * @return $this |
||
280 | */ |
||
281 | public function setRefresh($refresh = true) |
||
282 | { |
||
283 | \is_bool($refresh) && $refresh = $refresh |
||
284 | ? Reindex::REFRESH_TRUE |
||
285 | : Reindex::REFRESH_FALSE; |
||
286 | |||
287 | return $this->setParam(Reindex::REFRESH, $refresh); |
||
288 | } |
||
289 | |||
290 | /** |
||
291 | * @return bool|string |
||
292 | */ |
||
293 | public function getRefresh() |
||
294 | { |
||
295 | $refresh = $this->getParam('refresh'); |
||
296 | |||
297 | return \in_array($refresh, [Reindex::REFRESH_TRUE, Reindex::REFRESH_FALSE]) |
||
298 | ? Reindex::REFRESH_TRUE === $refresh |
||
299 | : $refresh; |
||
300 | } |
||
301 | |||
302 | public function hasRefresh(): bool |
||
303 | { |
||
304 | return $this->hasParam('refresh'); |
||
305 | } |
||
306 | |||
307 | /** |
||
308 | * @return $this |
||
309 | */ |
||
310 | public function setTimeout(string $timeout): self |
||
311 | { |
||
312 | return $this->setParam('timeout', $timeout); |
||
313 | } |
||
314 | |||
315 | public function getTimeout(): string |
||
316 | { |
||
317 | return $this->getParam('timeout'); |
||
318 | } |
||
319 | |||
320 | public function hasTimeout(): bool |
||
321 | { |
||
322 | return $this->hasParam('timeout'); |
||
323 | } |
||
324 | |||
325 | /** |
||
326 | * @return $this |
||
327 | */ |
||
328 | public function setConsistency(string $timeout): self |
||
329 | { |
||
330 | return $this->setParam('consistency', $timeout); |
||
331 | } |
||
332 | |||
333 | public function getConsistency(): string |
||
334 | { |
||
335 | return $this->getParam('consistency'); |
||
336 | } |
||
337 | |||
338 | public function hasConsistency(): bool |
||
339 | { |
||
340 | return $this->hasParam('consistency'); |
||
341 | } |
||
342 | |||
343 | /** |
||
344 | * @return $this |
||
345 | */ |
||
346 | public function setReplication(string $timeout): self |
||
347 | { |
||
348 | return $this->setParam('replication', $timeout); |
||
349 | } |
||
350 | |||
351 | public function getReplication(): string |
||
352 | { |
||
353 | return $this->getParam('replication'); |
||
354 | } |
||
355 | |||
356 | public function hasReplication(): bool |
||
357 | { |
||
358 | return $this->hasParam('replication'); |
||
359 | } |
||
360 | |||
361 | /** |
||
362 | * @param array|Document $data |
||
363 | * |
||
364 | * @return $this |
||
365 | */ |
||
366 | public function setUpsert($data): self |
||
367 | { |
||
368 | $document = Document::create($data); |
||
369 | $this->_upsert = $document; |
||
370 | |||
371 | return $this; |
||
372 | } |
||
373 | |||
374 | public function getUpsert(): Document |
||
378 | |||
379 | public function hasUpsert(): bool |
||
380 | { |
||
381 | return null !== $this->_upsert; |
||
382 | } |
||
383 | |||
384 | /** |
||
385 | * @param array $fields if empty array all options will be returned |
||
386 | */ |
||
387 | public function getOptions(array $fields = []): array |
||
388 | { |
||
389 | if (!empty($fields)) { |
||
390 | return \array_filter(\array_intersect_key($this->getParams(), \array_flip($fields))); |
||
391 | } |
||
392 | |||
393 | return \array_filter($this->getParams()); |
||
394 | } |
||
395 | } |
||
396 |
This check looks for calls to
isset(...)
orempty()
on variables that are yet undefined. These calls will always produce the same result and can be removed.This is most likely caused by the renaming of a variable or the removal of a function/method parameter.