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 |
||
4 | abstract class FlintRedisCacheFactory |
||
5 | { |
||
6 | const STRATEGY_REDIS = 1; |
||
7 | const STRATEGY_FLINTSTONE = 2; |
||
8 | |||
9 | private static $cachedInstances = []; |
||
10 | |||
11 | 15 | private static function getKey($realm, $strategy) |
|
15 | |||
16 | private static function getFullKey($key, $options) |
||
21 | |||
22 | /** |
||
23 | * Retrieves a new or previously created cache-instance for the provided |
||
24 | * parameters. |
||
25 | * |
||
26 | * If you previously created an instance for a collection 'foo' with a |
||
27 | * strategy [and options] and are later 'creating' in instance but only |
||
28 | * provide the realm 'foo', you will retreive your previously created instance. |
||
29 | * |
||
30 | * That way you only have to provide the strategy and options once per $realm. |
||
31 | * |
||
32 | * @param string $realm Your collections name |
||
33 | * @param number $strategy Either FlintRedisCacheFactory::STRATEGY_REDIS |
||
34 | * or FlintRedisCacheFactory:: STRATEGY_FLINTSTONE |
||
35 | * @param array $options Options you want to pass to predis/flintstone |
||
36 | * @return FlintRedisCache |
||
37 | */ |
||
38 | public static function create($realm, $strategy = false, $options = false) |
||
39 | { |
||
40 | 15 | $key = self::getKey($realm, $strategy); |
|
41 | 15 | $fullKey = self::getFullKey($key, $options); |
|
42 | |||
43 | 15 | if ($strategy && $options && isset(self::$cachedInstances[$fullKey])) { |
|
44 | 3 | return self::$cachedInstances[$fullKey]; |
|
45 | } |
||
46 | |||
47 | 15 | View Code Duplication | if ($strategy && !$options && isset(self::$cachedInstances[$key])) { |
48 | 6 | return self::$cachedInstances[$key]; |
|
49 | } |
||
50 | |||
51 | 15 | View Code Duplication | if (!$strategy && !$options && isset(self::$cachedInstances[$realm])) { |
52 | 9 | return self::$cachedInstances[$realm]; |
|
53 | } |
||
54 | |||
55 | // No instance available so far... Lets create one with default values |
||
56 | 15 | $strategy = $strategy ? $strategy : self::STRATEGY_REDIS; |
|
57 | 15 | $options = $options ? $options : []; |
|
58 | |||
59 | 15 | $key = self::getKey($realm, $strategy); |
|
60 | 15 | $fullKey = self::getFullKey($key, $options); |
|
61 | |||
62 | 15 | $instance = self::newCacheInstance($strategy, $realm, $options); |
|
63 | |||
64 | 15 | self::$cachedInstances[$fullKey] = &$instance; |
|
65 | 15 | self::$cachedInstances[$key] = &$instance; |
|
66 | 15 | self::$cachedInstances[$realm] = &$instance; |
|
67 | |||
68 | 15 | return $instance; |
|
69 | } |
||
70 | |||
71 | private static function newCacheInstance($strategy, $realm, $options) |
||
81 | } |
||
82 |