遵守下面4条原则会使我们的开发更加踏实、愉悦 ?:
对于我们自己和我们的开发团队,要不断的加强测试意识,形成我们的开发文化。
做好单元测试、集成测试,确保对于核心业务有足够测试。如果你的测试覆盖不足,那么客户早晚会帮你找出bug。
在团队中不断重复“没有测试过的代码就是坏代码”,直到沉淀为基本意识。
让我们看一个示例代码(不用细看):
function buildUrl(url, options) {
var queryString = [];
var key;
var builtUrl;
if (url === null) {
builtUrl = '';
} else if (typeof(url) === 'object') {
builtUrl = '';
options = url;
} else {
builtUrl = url;
}
if (options) {
if (options.path) {
builtUrl += '/' + options.path;
}
if (options.queryParams) {
for (key in options.queryParams) {
if (options.queryParams.hasOwnProperty(key)) {
queryString.push(key + '=' + options.queryParams[key]);
}
}
builtUrl += '?' + queryString.join('&');
}
if (options.hash) {
builtUrl += '#' + options.hash;
}
}
return builtUrl;
};
一眼看去是不是很难马上明白这个方法是干啥的?方法很长,又有那么多的 if else
,并且还嵌套,比较混乱。但实际上这段代码并不长,只有35行。
再看下面的改进版本:
主函数:
function buildUrl(url, options) {
const baseUrl = _getBaseUrl(url);
const opts = _getOptions(url, options);
if (!opts) {
return baseUrl;
}
urlWithPath = _appendPath(baseUrl, opts.path);
urlWithPathAndQueryParams =
_appendQueryParams(urlWithPath,
opts.queryParams)
urlWithPathQueryParamsAndHash =
_appendHash(urlWithPathAndQueryParams,
opts.hash);
return urlWithPathQueryParamsAndHash;
};
子函数:
function _getBaseUrl(url) {
if (url === null || typeof(url) === 'object') {
return '';
}
return url;
}
function _getOptions(url, options) {
if (typeof(url) === 'object') {
return url;
}
return options;
}
function _appendPath(baseUrl, path) {
if (!path) {
return baseUrl;
}
return baseUrl += '/' + path;
}
function _appendQueryParams(urlWithPath, queryParams) {
if (!queryParams) {
return urlWithPath
}
const keyValueStrings = Object.keys(queryParams).map(key => {
return `${key}=${queryParams[key]}`;
});
const joinedKeyValueStrings = keyValueStrings.join('&');
return `${urlWithPath}?${joinedKeyValueStrings}`;
}
function _appendHash(urlWithPathAndQueryParams, hash) {
if (!hash) {
return urlWithPathAndQueryParams;
}
return `${urlWithPathAndQueryParams}#${hash}`;
}
这个是不是就清晰多了,主函数只有14行代码,很容易理解,代码短、命名清晰,剩下的子函数需要时再细看就行了。
我们在开发时要养成好的习惯,方法是:
看看下面的代码,看你能不能找出缺点:
function getUserByEmailAndPassword(email,
password) {
let user = UserService.
getByEmailAndPassword(email, password);
if (user) {
// Log user in, add cookie
// (Side effect!!!!)
LoginService.loginUser(user);
}
return user;
}
从名字来看,这个方法是根据 email/password 来获取用户。再看代码,在获取了用户之后,还执行了一个登录操作,设置cookie。这个“登录”就是副作用。
总结下这段代码的缺点:
很多人认为起名字是小事儿,不值一提,但这个小事儿真的意义重大。
例如很多人的命名:data、foobar、myNumber、SomethingManager,他们对于程序的运行是正确的,但会成为团队的维护噩梦。
尽量让名字的含义精确,并尽可能简短,这样有利于代码的维护、代码 review,在 IDE 中可以根据名字快速查找代码。
我们是有追求的程序员 ?,牢记这4点:
内容翻译整理自:
https://engineering.videoblocks.com/these-four-clean-code-tips-will-dramatically-improve-your-engineering-teams-productivity-b5bd121dd150
点击阅读原文?,查看文章列表。