基于 重构 简化条件逻辑 重构条件代码实现
1、现有的实现如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php namespace Modules\ThemeStoreDB\ThemeSetting; use Illuminate\Support\Str; class ThemeVersion { const SPECIAL_IDENTIFIER = '-h.' ; // 特殊版本标识 const HYPHEN = '-' ; // 连字符 public string $semantic ; function __construct(string $semantic ) { $this ->semantic = $semantic ; } /** * 对比两个「PHP 规范化」的版本数字字符串,添加例外:-h. * @param self $version * @return int 在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数 */ public function compare(self $version ): int { if (Str::contains( $this ->semantic, self::SPECIAL_IDENTIFIER) && !Str::contains( $version ->semantic, self::SPECIAL_IDENTIFIER) && Str::before( $this ->semantic, self::HYPHEN) == Str::before( $version ->semantic, self::HYPHEN)) { return 1; } elseif (!Str::contains( $this ->semantic, self::SPECIAL_IDENTIFIER) && Str::contains( $version ->semantic, self::SPECIAL_IDENTIFIER) && Str::before( $this ->semantic, self::HYPHEN) == Str::before( $version ->semantic, self::HYPHEN)) { return -1; } else { return version_compare( $this ->semantic, $version ->semantic); } } |
2、参考 10.1 分解条件表达式(Decompose Conditional),调整为如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | <?php namespace Modules\ThemeStoreDB\ThemeSetting; use Illuminate\Support\Str; class ThemeVersion { const SPECIAL_IDENTIFIER = '-h.' ; // 特殊版本标识 const HYPHEN = '-' ; // 连字符 public string $semantic ; function __construct(string $semantic ) { $this ->semantic = $semantic ; } /** * 对比两个「PHP 规范化」的版本数字字符串,添加例外:-h. * @param self $version * @return int 在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数 */ public function compare(self $version ): int { if (self::isSpecial( $this ->semantic) && !self::isSpecial( $version ->semantic) && self::isMainEqual( $this ->semantic, $version ->semantic)) { return 1; } elseif (!self::isSpecial( $this ->semantic) && self::isSpecial( $version ->semantic) && self::isMainEqual( $this ->semantic, $version ->semantic)) { return -1; } else { return version_compare( $this ->semantic, $version ->semantic); } } /** * 返回版本是否是特殊版本 * @param string $semantic * @return bool */ private static function isSpecial(string $semantic ): bool { return Str::contains( $semantic , self::SPECIAL_IDENTIFIER); } /** * 返回两个版本的主版本号是否相等 * @param string $semantic1 * @param string $semantic2 * @return bool */ private static function isMainEqual(string $semantic1 , string $semantic2 ): bool { return self::getMain( $semantic1 ) == self::getMain( $semantic2 ); } /** * 获取版本的主版本号 * @param string $semantic * @return string */ private static function getMain(string $semantic ): string { return Str::before( $semantic , self::HYPHEN); } } |
3、10.2 合并条件表达式(Consolidate Conditional Expression)。将检查条件提炼成一个独立的函数对于厘清代码意义非常有用,因为它把描述“做什么”的语句换成了“为什么这样做”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /** * 对比两个「PHP 规范化」的版本数字字符串,添加例外:-h. * @param self $version * @return int 在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数 */ public function compare(self $version ): int { if (self::isSpecialGt( $this ->semantic, $version ->semantic)) { return 1; } elseif (self::isSpecialLt( $this ->semantic, $version ->semantic)) { return -1; } else { return version_compare( $this ->semantic, $version ->semantic); } } /** * 当两个版本中仅存在一个特殊版本时,第一个版本大于第二个版本 * @param string $semantic1 * @param string $semantic2 * @return bool */ private static function isSpecialGt(string $semantic1 , string $semantic2 ): bool { return self::isSpecial( $semantic1 ) && !self::isSpecial( $semantic2 ) && self::isMainEqual( $semantic1 , $semantic2 ); } /** * 当两个版本中仅存在一个特殊版本时,第一个版本小于第二个版本 * @param string $semantic1 * @param string $semantic2 * @return bool */ private static function isSpecialLt(string $semantic1 , string $semantic2 ): bool { return !self::isSpecial( $semantic1 ) && self::isSpecial( $semantic2 ) && self::isMainEqual( $semantic1 , $semantic2 ); } } |
4、10.3 以卫语句取代嵌套条件表达式(Replace Nested Conditional with Guard Clauses)。如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句”(guard clauses)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | <?php namespace Modules\ThemeStoreDB\ThemeSetting; use Illuminate\Support\Str; class ThemeVersion { const SPECIAL_IDENTIFIER = '-h.' ; // 特殊版本标识 const HYPHEN = '-' ; // 连字符 public string $semantic ; function __construct(string $semantic ) { $this ->semantic = $semantic ; } /** * 对比两个「PHP 规范化」的版本数字字符串,添加例外:-h. * @param self $version * @return int 在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数 */ public function compare(self $version ): int { if (self::isSpecialGt( $this ->semantic, $version ->semantic)) { return 1; } if (self::isSpecialLt( $this ->semantic, $version ->semantic)) { return -1; } return version_compare( $this ->semantic, $version ->semantic); } /** * 返回版本是否是特殊版本 * @param string $semantic * @return bool */ private static function isSpecial(string $semantic ): bool { return Str::contains( $semantic , self::SPECIAL_IDENTIFIER); } /** * 返回两个版本的主版本号是否相等 * @param string $semantic1 * @param string $semantic2 * @return bool */ private static function isMainEqual(string $semantic1 , string $semantic2 ): bool { return self::getMain( $semantic1 ) == self::getMain( $semantic2 ); } /** * 获取版本的主版本号 * @param string $semantic * @return string */ private static function getMain(string $semantic ): string { return Str::before( $semantic , self::HYPHEN); } /** * 当两个版本中仅存在一个特殊版本时,第一个版本大于第二个版本 * @param string $semantic1 * @param string $semantic2 * @return bool */ private static function isSpecialGt(string $semantic1 , string $semantic2 ): bool { return self::isSpecial( $semantic1 ) && !self::isSpecial( $semantic2 ) && self::isMainEqual( $semantic1 , $semantic2 ); } /** * 当两个版本中仅存在一个特殊版本时,第一个版本小于第二个版本 * @param string $semantic1 * @param string $semantic2 * @return bool */ private static function isSpecialLt(string $semantic1 , string $semantic2 ): bool { return !self::isSpecial( $semantic1 ) && self::isSpecial( $semantic2 ) && self::isMainEqual( $semantic1 , $semantic2 ); } } |
近期评论