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 |
||
15 | class JWTParameter extends Parameter |
||
16 | { |
||
17 | // registered parameter names |
||
18 | const PARAM_ALGORITHM = "alg"; |
||
19 | const PARAM_JWK_SET_URL = "jku"; |
||
20 | const PARAM_JSON_WEB_KEY = "jwk"; |
||
21 | const PARAM_KEY_ID = "kid"; |
||
22 | const PARAM_X509_URL = "x5u"; |
||
23 | const PARAM_X509_CERTIFICATE_CHAIN = "x5c"; |
||
24 | const PARAM_X509_CERTIFICATE_SHA1_THUMBPRINT = "x5t"; |
||
25 | const PARAM_X509_CERTIFICATE_SHA256_THUMBPRINT = "x5t#S256"; |
||
26 | const PARAM_TYPE = "typ"; |
||
27 | const PARAM_CONTENT_TYPE = "cty"; |
||
28 | const PARAM_CRITICAL = "crit"; |
||
29 | const PARAM_ENCRYPTION_ALGORITHM = "enc"; |
||
30 | const PARAM_COMPRESSION_ALGORITHM = "zip"; |
||
31 | const PARAM_EPHEMERAL_PUBLIC_KEY = "epk"; |
||
32 | const PARAM_AGREEMENT_PARTYUINFO = "apu"; |
||
33 | const PARAM_AGREEMENT_PARTYVINFO = "apv"; |
||
34 | const PARAM_INITIALIZATION_VECTOR = "iv"; |
||
35 | const PARAM_AUTHENTICATION_TAG = "tag"; |
||
36 | const PARAM_PBES2_SALT_INPUT = "p2s"; |
||
37 | const PARAM_PBES2_COUNT = "p2c"; |
||
38 | const PARAM_BASE64URL_ENCODE_PAYLOAD = "b64"; |
||
39 | |||
40 | // shorthand aliases for parameter names |
||
41 | const P_ALG = self::PARAM_ALGORITHM; |
||
42 | const P_JKU = self::PARAM_JWK_SET_URL; |
||
43 | const P_JWK = self::PARAM_JSON_WEB_KEY; |
||
44 | const P_KID = self::PARAM_KEY_ID; |
||
45 | const P_X5U = self::PARAM_X509_URL; |
||
46 | const P_X5C = self::PARAM_X509_CERTIFICATE_CHAIN; |
||
47 | const P_X5T = self::PARAM_X509_CERTIFICATE_SHA1_THUMBPRINT; |
||
48 | const P_X5TS256 = self::PARAM_X509_CERTIFICATE_SHA256_THUMBPRINT; |
||
49 | const P_TYP = self::PARAM_TYPE; |
||
50 | const P_CTY = self::PARAM_CONTENT_TYPE; |
||
51 | const P_CRIT = self::PARAM_CRITICAL; |
||
52 | const P_ENC = self::PARAM_ENCRYPTION_ALGORITHM; |
||
53 | const P_ZIP = self::PARAM_COMPRESSION_ALGORITHM; |
||
54 | const P_EPK = self::PARAM_EPHEMERAL_PUBLIC_KEY; |
||
55 | const P_APU = self::PARAM_AGREEMENT_PARTYUINFO; |
||
56 | const P_APV = self::PARAM_AGREEMENT_PARTYVINFO; |
||
57 | const P_IV = self::PARAM_INITIALIZATION_VECTOR; |
||
58 | const P_TAG = self::PARAM_AUTHENTICATION_TAG; |
||
59 | const P_P2S = self::PARAM_PBES2_SALT_INPUT; |
||
60 | const P_P2C = self::PARAM_PBES2_COUNT; |
||
61 | const P_B64 = self::PARAM_BASE64URL_ENCODE_PAYLOAD; |
||
62 | |||
63 | /** |
||
64 | * Mapping from registered JWT parameter name to class name. |
||
65 | * |
||
66 | * @internal |
||
67 | * |
||
68 | * @var array |
||
69 | */ |
||
70 | const MAP_NAME_TO_CLASS = array( |
||
71 | /* @formatter:off */ |
||
72 | self::P_ALG => AlgorithmParameter::class, |
||
73 | self::P_JKU => JWKSetURLParameter::class, |
||
74 | self::P_JWK => JSONWebKeyParameter::class, |
||
75 | self::P_KID => KeyIDParameter::class, |
||
76 | self::P_X5U => X509URLParameter::class, |
||
77 | self::P_X5C => X509CertificateChainParameter::class, |
||
78 | self::P_X5T => X509CertificateSHA1ThumbprintParameter::class, |
||
79 | self::P_X5TS256 => X509CertificateSHA256ThumbprintParameter::class, |
||
80 | self::P_TYP => TypeParameter::class, |
||
81 | self::P_CTY => ContentTypeParameter::class, |
||
82 | self::P_CRIT => CriticalParameter::class, |
||
83 | self::P_ENC => EncryptionAlgorithmParameter::class, |
||
84 | self::P_ZIP => CompressionAlgorithmParameter::class, |
||
85 | self::P_IV => InitializationVectorParameter::class, |
||
86 | self::P_TAG => AuthenticationTagParameter::class, |
||
87 | self::P_P2S => PBES2SaltInputParameter::class, |
||
88 | self::P_P2C => PBES2CountParameter::class, |
||
89 | self::P_B64 => B64PayloadParameter::class |
||
90 | /* @formatter:on */ |
||
91 | ); |
||
92 | |||
93 | /** |
||
94 | * Constructor. |
||
95 | * |
||
96 | * @param string $name Parameter name |
||
97 | * @param mixed $value Parameter value |
||
98 | */ |
||
99 | 168 | public function __construct($name, $value) { |
|
103 | |||
104 | /** |
||
105 | * Initialize from a name and a value. |
||
106 | * |
||
107 | * Returns a parameter specific object if one is implemented. |
||
108 | * |
||
109 | * @param string $name Parameter name |
||
110 | * @param mixed $value Parameter value |
||
111 | * @return self |
||
112 | */ |
||
113 | 53 | View Code Duplication | public static function fromNameAndValue($name, $value) { |
120 | |||
121 | /** |
||
122 | * Initialize a concrete JWT parameter instance from a JSON value. |
||
123 | * |
||
124 | * @param mixed $value |
||
125 | * @return self |
||
126 | */ |
||
127 | 52 | public static function fromJSONValue($value) { |
|
130 | } |
||
131 |
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.