如何发现代码的坏味道之SLAP原则

Long Method (代码的坏味道)

  • 可读性很差
  • 复用性差
  • 难以调试
  • 难以维护
  • 冗余代码多

SLAP(单一抽象原则)

定义

SLAP 是 Single Level of Abstraction 的缩写。解释:指定代码块上的代码应该在单一的抽象层上。

SLAP优势

  • 短方法的提取产生,会使得方法更加具有原子性,职责更加单一,更加的符合Unix的哲学 Do one thing, and do it well。
  • 短方法的复用性更强,使得编码更加便捷
  • 短方法可读性更强,更加便于理解
  • 实践表明,SLAP应用后,维护成本应该是降低的。

举例

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
<?php 
class User {
public static function getUserInfo() {
return [
'email' => '786188095@qq.com',
'password' => '232321312312'
];
}
}

function validateUser($user_info) {
$preg_email='/^[a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*@([a-zA-Z0-9]+[-.])+([a-z]{2,5})$/ims';
if (!preg_match($preg_email,$user_info['email'])) {
return false;
}

if (strlen($user_info['password']) <= 6) {
return false;
}

//验证用户名 不包含特殊符号

//验证银行卡号

//验证银行卡开户行信息

//以此类推 方法越来越长

}

validateUser(User::getUserInfo());

代码存在的问题

  • validateUser 方法中暴露了校验email和密码的具体实现
  • validateUser 方法应该只关心校验结果(第一层抽象),而不是具体实现(第二层抽象)
  • validateUser 违反了SLAP原则

修改后

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
<?php 
class User {
public static function getUserInfo() {
return [
'email' => '786188095@qq.com',
'password' => '232321312312'
];
}
}

class UserValidator {
protected static $preg_email = '/^[a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*@([a-zA-Z0-9]+[-.])+([a-z]{2,5})$/ims';

public static function validateEmail($email) {
if (!preg_match(self::$preg_email,$email)) {
return false;
}
return true;
}

public static function validatePassWord($password) {
if (strlen($password) <= 6) {
return false;
}
return true;
}
}

function vailUserInfo($user_info) {
return UserValidator::validateEmail($user_info['email']) && UserValidator::validatePassWord($user_info['password']);
}


var_dump(vailUserInfo(User::getUserInfo()));