DRY 原则
Don’t repeat yourself
1. 实现逻辑的重复
public class UserAuthenticator {
public void authenticate(String username, String password) {
if (!isValidUsername(username)) {
// ...throw InvalidUsernameException...
}
if (!isValidPassword(password)) {
// ...throw InvalidPasswordException...
}
//...省略其他代码...
}
private boolean isValidUsername(String username) {
// check not null, not empty
if (StringUtils.isBlank(username)) {
return false;
}
// check length: 4~64
int length = username.length();
if (length < 4 || length > 64) {
return false;
}
// contains only lowcase characters
if (!StringUtils.isAllLowerCase(username)) {
return false;
}
// contains only a~z,0~9,dot
for (int i = 0; i < length; ++i) {
char c = username.charAt(i);
if (!(c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '.') {
return false;
}
}
return true;
}
private boolean isValidPassword(String password) {
// check not null, not empty
if (StringUtils.isBlank(password)) {
return false;
}
// check length: 4~64
int length = password.length();
if (length < 4 || length > 64) {
return false;
}
// contains only lowcase characters
if (!StringUtils.isAllLowerCase(password)) {
return false;
}
// contains only a~z,0~9,dot
for (int i = 0; i < length; ++i) {
char c = password.charAt(i);
if (!(c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '.') {
return false;
}
}
return true;
}
}
这里想强调的是不一定完全一样的代码就意味着他们是需要合并的,比如上述的代码当中,isValidPassword还有isValidUsername有着基本上相同的逻辑结构,但是他们本身代表的是不同的意思的,虽然一样的逻辑,但是我们无法保证在接下来的一段时间以内,他们还能这样子一致下去。
所以合并为isValidUserOrPassword是不可以的,逻辑上讲不通,但是我们可以将上面在这个函数内部调用的方法进行分割的方式,来复用一些代码。
其实有一些使用组合的味道在里面了。
2. 功能语义的重复
对于功能语义重复的理解,是指一个代码包里在多个地方为了实现同样的功能,设定了不同的方法体。这大部分情况下都是因为沟通等方面的问题,不管里面使用的方法有什么不同,如果他们都是为了达成一样的,那么我们认为其实违反了DRY原则的,是需要清除多余的方法体的。
3. 代码执行重复
看代码的内部逻辑,减少多次重复调用的代码。
注意IO操作,因为IO非常费时…
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 stone2paul@gmail.com
文章标题:DRY 原则
文章字数:563
本文作者:Leilei Chen
发布时间:2020-03-22, 11:01:51
最后更新:2020-03-22, 11:02:11
原始链接:https://www.llchen60.com/DRY-%E5%8E%9F%E5%88%99/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。