Complex classes like DBConnRef 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 DBConnRef, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
10 | class DBConnRef implements IDatabase { |
||
11 | /** @var LoadBalancer */ |
||
12 | private $lb; |
||
13 | |||
14 | /** @var DatabaseBase|null */ |
||
15 | private $conn; |
||
16 | |||
17 | /** @var array|null */ |
||
18 | private $params; |
||
19 | |||
20 | /** |
||
21 | * @param LoadBalancer $lb |
||
22 | * @param DatabaseBase|array $conn Connection or (server index, group, wiki ID) array |
||
23 | */ |
||
24 | public function __construct( LoadBalancer $lb, $conn ) { |
||
32 | |||
33 | function __call( $name, array $arguments ) { |
||
41 | |||
42 | public function getServerInfo() { |
||
45 | |||
46 | public function bufferResults( $buffer = null ) { |
||
49 | |||
50 | public function trxLevel() { |
||
53 | |||
54 | public function trxTimestamp() { |
||
57 | |||
58 | public function explicitTrxActive() { |
||
59 | return $this->__call( __FUNCTION__, func_get_args() ); |
||
60 | } |
||
61 | |||
62 | public function tablePrefix( $prefix = null ) { |
||
65 | |||
66 | public function dbSchema( $schema = null ) { |
||
69 | |||
70 | public function getLBInfo( $name = null ) { |
||
73 | |||
74 | public function setLBInfo( $name, $value = null ) { |
||
77 | |||
78 | public function implicitGroupby() { |
||
81 | |||
82 | public function implicitOrderby() { |
||
85 | |||
86 | public function lastQuery() { |
||
89 | |||
90 | public function doneWrites() { |
||
93 | |||
94 | public function lastDoneWrites() { |
||
97 | |||
98 | public function writesPending() { |
||
101 | |||
102 | public function writesOrCallbacksPending() { |
||
105 | |||
106 | public function pendingWriteQueryDuration( $type = self::ESTIMATE_TOTAL ) { |
||
107 | return $this->__call( __FUNCTION__, func_get_args() ); |
||
108 | } |
||
109 | |||
110 | public function pendingWriteCallers() { |
||
113 | |||
114 | public function isOpen() { |
||
117 | |||
118 | public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) { |
||
121 | |||
122 | public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) { |
||
123 | return $this->__call( __FUNCTION__, func_get_args() ); |
||
124 | } |
||
125 | |||
126 | public function restoreFlags( $state = self::RESTORE_PRIOR ) { |
||
127 | return $this->__call( __FUNCTION__, func_get_args() ); |
||
128 | } |
||
129 | |||
130 | public function getFlag( $flag ) { |
||
133 | |||
134 | public function getProperty( $name ) { |
||
137 | |||
138 | public function getWikiID() { |
||
141 | |||
142 | public function getType() { |
||
145 | |||
146 | public function open( $server, $user, $password, $dbName ) { |
||
149 | |||
150 | public function fetchObject( $res ) { |
||
153 | |||
154 | public function fetchRow( $res ) { |
||
157 | |||
158 | public function numRows( $res ) { |
||
161 | |||
162 | public function numFields( $res ) { |
||
165 | |||
166 | public function fieldName( $res, $n ) { |
||
169 | |||
170 | public function insertId() { |
||
173 | |||
174 | public function dataSeek( $res, $row ) { |
||
177 | |||
178 | public function lastErrno() { |
||
181 | |||
182 | public function lastError() { |
||
185 | |||
186 | public function fieldInfo( $table, $field ) { |
||
189 | |||
190 | public function affectedRows() { |
||
193 | |||
194 | public function getSoftwareLink() { |
||
197 | |||
198 | public function getServerVersion() { |
||
201 | |||
202 | public function close() { |
||
205 | |||
206 | public function reportConnectionError( $error = 'Unknown error' ) { |
||
209 | |||
210 | public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) { |
||
213 | |||
214 | public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) { |
||
217 | |||
218 | public function freeResult( $res ) { |
||
221 | |||
222 | public function selectField( |
||
227 | |||
228 | public function selectFieldValues( |
||
233 | |||
234 | public function select( |
||
240 | |||
241 | public function selectSQLText( |
||
247 | |||
248 | public function selectRow( |
||
254 | |||
255 | public function estimateRowCount( |
||
260 | |||
261 | public function selectRowCount( |
||
266 | |||
267 | public function fieldExists( $table, $field, $fname = __METHOD__ ) { |
||
270 | |||
271 | public function indexExists( $table, $index, $fname = __METHOD__ ) { |
||
274 | |||
275 | public function tableExists( $table, $fname = __METHOD__ ) { |
||
278 | |||
279 | public function indexUnique( $table, $index ) { |
||
282 | |||
283 | public function insert( $table, $a, $fname = __METHOD__, $options = [] ) { |
||
286 | |||
287 | public function update( $table, $values, $conds, $fname = __METHOD__, $options = [] ) { |
||
290 | |||
291 | public function makeList( $a, $mode = LIST_COMMA ) { |
||
294 | |||
295 | public function makeWhereFrom2d( $data, $baseKey, $subKey ) { |
||
298 | |||
299 | public function bitNot( $field ) { |
||
302 | |||
303 | public function bitAnd( $fieldLeft, $fieldRight ) { |
||
306 | |||
307 | public function bitOr( $fieldLeft, $fieldRight ) { |
||
310 | |||
311 | public function buildConcat( $stringList ) { |
||
314 | |||
315 | public function buildGroupConcatField( |
||
320 | |||
321 | public function selectDB( $db ) { |
||
324 | |||
325 | public function getDBname() { |
||
328 | |||
329 | public function getServer() { |
||
332 | |||
333 | public function addQuotes( $s ) { |
||
336 | |||
337 | public function buildLike() { |
||
340 | |||
341 | public function anyChar() { |
||
344 | |||
345 | public function anyString() { |
||
348 | |||
349 | public function nextSequenceValue( $seqName ) { |
||
352 | |||
353 | public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) { |
||
356 | |||
357 | public function upsert( |
||
362 | |||
363 | public function deleteJoin( |
||
368 | |||
369 | public function delete( $table, $conds, $fname = __METHOD__ ) { |
||
372 | |||
373 | public function insertSelect( |
||
379 | |||
380 | public function unionSupportsOrderAndLimit() { |
||
383 | |||
384 | public function unionQueries( $sqls, $all ) { |
||
387 | |||
388 | public function conditional( $cond, $trueVal, $falseVal ) { |
||
391 | |||
392 | public function strreplace( $orig, $old, $new ) { |
||
395 | |||
396 | public function getServerUptime() { |
||
399 | |||
400 | public function wasDeadlock() { |
||
403 | |||
404 | public function wasLockTimeout() { |
||
407 | |||
408 | public function wasErrorReissuable() { |
||
411 | |||
412 | public function wasReadOnlyError() { |
||
415 | |||
416 | public function masterPosWait( DBMasterPos $pos, $timeout ) { |
||
419 | |||
420 | public function getSlavePos() { |
||
423 | |||
424 | public function getMasterPos() { |
||
427 | |||
428 | public function serverIsReadOnly() { |
||
431 | |||
432 | public function onTransactionResolution( callable $callback ) { |
||
435 | |||
436 | public function onTransactionIdle( callable $callback ) { |
||
439 | |||
440 | public function onTransactionPreCommitOrIdle( callable $callback ) { |
||
443 | |||
444 | public function setTransactionListener( $name, callable $callback = null ) { |
||
445 | return $this->__call( __FUNCTION__, func_get_args() ); |
||
446 | } |
||
447 | |||
448 | public function startAtomic( $fname = __METHOD__ ) { |
||
451 | |||
452 | public function endAtomic( $fname = __METHOD__ ) { |
||
455 | |||
456 | public function doAtomicSection( $fname, callable $callback ) { |
||
459 | |||
460 | public function begin( $fname = __METHOD__, $mode = IDatabase::TRANSACTION_EXPLICIT ) { |
||
463 | |||
464 | public function commit( $fname = __METHOD__, $flush = '' ) { |
||
467 | |||
468 | public function rollback( $fname = __METHOD__, $flush = '' ) { |
||
471 | |||
472 | public function listTables( $prefix = null, $fname = __METHOD__ ) { |
||
475 | |||
476 | public function timestamp( $ts = 0 ) { |
||
479 | |||
480 | public function timestampOrNull( $ts = null ) { |
||
483 | |||
484 | public function ping( &$rtt = null ) { |
||
489 | |||
490 | public function getLag() { |
||
493 | |||
494 | public function getSessionLagStatus() { |
||
497 | |||
498 | public function maxListLen() { |
||
501 | |||
502 | public function encodeBlob( $b ) { |
||
505 | |||
506 | public function decodeBlob( $b ) { |
||
509 | |||
510 | public function setSessionOptions( array $options ) { |
||
513 | |||
514 | public function setSchemaVars( $vars ) { |
||
517 | |||
518 | public function lockIsFree( $lockName, $method ) { |
||
521 | |||
522 | public function lock( $lockName, $method, $timeout = 5 ) { |
||
525 | |||
526 | public function unlock( $lockName, $method ) { |
||
529 | |||
530 | public function getScopedLockAndFlush( $lockKey, $fname, $timeout ) { |
||
533 | |||
534 | public function namedLocksEnqueue() { |
||
537 | |||
538 | public function getInfinity() { |
||
541 | |||
542 | public function encodeExpiry( $expiry ) { |
||
545 | |||
546 | public function decodeExpiry( $expiry, $format = TS_MW ) { |
||
549 | |||
550 | public function setBigSelects( $value = true ) { |
||
553 | |||
554 | public function isReadOnly() { |
||
557 | |||
558 | /** |
||
559 | * Clean up the connection when out of scope |
||
560 | */ |
||
561 | function __destruct() { |
||
566 | } |
||
567 |