上次笔者翻译了一篇图解 SOLID 原则javascript
原文见: 图解你身边的 SOLID 原则
过了两天发现有人为那篇文章补充了 JavaScript 例子,看了下例子还不错,此次就顺便也翻译一下哈,部分例子有删改~java
关于概念部分就很少说了,看上一篇或者看图就好~ 那么直接进入正题:数据库
咱们假设须要验证一个表单,而后将用户保存到数据库中。segmentfault
不推荐api
/** * 这个函数的名字就明显违背了单一职责原则 * 对于表单的验证和用户建立被耦合在一块儿了 * 这样写是不推荐的! */ function validateAndSaveUser (req) { // 调用外部函数来验证用户表单 const isFormValid = validateForm(req.name, req.password, req.email) // 若是表单合法 if (isFormValid) { doCreateUser(req.name, req.password, req.email) // 建立用户的具体实现 } }
推荐架构
// 验证请求的函数 function validateRequest (req) { // 调用外部函数来验证用户表单 const isFormValid = validateForm(req.name, req.password, req.email) // 若是表单合法 if (isFormValid) { createUser(req) // 在另外一个模块中实现 } } // 仅仅用来将用户存储到数据库 function createUser (req) { doCreateUser(req.name, req.password, req.email) // 具体实现代码 }
上面的修改虽然看起来很小,可是将验证逻辑和用户建立逻辑进行了解耦,而用户建立貌似是个会常常更改的功能,这就为未来的修改提供了遍历。函数
假设咱们有如下的权限验证函数:测试
const roles = ["ADMIN", "USER"] function checkRole (user) { if (roles.includes(user.role)) { return true } return false } // 角色校验 checkRole("ADMIN") // true checkRole("Savo") // false
若是咱们想要添加一个超级管理员,为了避免修改以前的代码(或者说咱们原本就没法修改遗留代码),咱们能够添加一个新增权限函数:this
// 此处的代码没法修改! const roles = ["ADMIN", "USER"] function checkRole (user) { if (roles.includes(user.role)) { return true } return false } // 此处的代码没法修改! // 咱们能够定义一个函数专门用来新增角色 function addRole (role) { roles.push(role) } // 调用新函数来添加角色 addRole("SUPERUSER") // 验证角色 checkRole("ADMIN") // true checkRole("Savo") // false checkRole("SUPERUSER") // true
下面以工程师为例子,初级工程师其实就能够被高级工程师替换掉。(没毛病==)url
class Engineer { constructor (coder) { this.coder = coder this.writeCode = function () { console.log("Coding") // 工程师都会写代码 } } // 初级工程师 Simple (coder) { this.writeCode(coder) } // 高级工程师 Pro (coder) { this.writeCode(coder) console.log("Design Architecture") // 高级工程师还须要设计架构~ } } const a = new Engineer("Savokiss") a.Simple() // 输出: // Coding a.Pro() // 输出: // Coding // Design Architecture...
不推荐
// 什么状况下都进行验证 class User { constructor (username, password) { this.initUser(username, password) } initUser (username, password) { this.username = username this.password = password this.validateUser() } validateUser () { console.log("验证中...") // 添加验证逻辑 } } const user = new User("Savokiss", "123456") console.log(user) // 验证中... // User { // validateUser: [Function: validateUser], // username: 'Savokiss', // password: '123456' // }
推荐
// 将验证当作一个可选接口 class User { constructor (username, password, validate) { this.initUser(username, password, validate) if (validate) { this.validateUser() } else { console.log("不须要验证逻辑") } } initUser (username, password, validate) { this.username = username this.password = password this.validate = validate } validateUser () { console.log("验证中...") } } // 须要验证的用户 console.log(new User("Savokiss", "123456", true)) // 验证中... // User { // validateUser: [Function: validateUser], // username: 'Francesco', // password: '123456', // validate: true // } // 不须要验证的用户 console.log(new User("Guest", "guest", false)) // 不须要验证逻辑 // User { // validateUser: [Function: validateUser], // username: 'guest', // password: 'guest', // validate: false // }
不推荐
// http 请求依赖了 setState 函数,即依赖了一个细节 http.get("http://address/api/examples", (res) => { this.setState({ key1: res.value1, key2: res.value2, key3: res.value3 }) })
推荐
// http 请求 const httpRequest = (url, state) => { http.get(url, (res) => state.setValues(res)) } // 在另外一个函数中设置状态 const state = { setValues: (res) => { this.setState({ key1: res.value1, key2: res.value2, key3: res.value3 }) } } // 请求时,将 state 做为抽象注入进去 httpRequest("http://address/api/examples", state)
SOLID 原则的主要目标是让任何软件都应该更容易更改,而且更易于理解。
SOLID 原则同时也让你的代码:
好啦~ 但愿本文对你有帮助~
本文首发于公众号:码力全开(codingonfire)
本文随意转载哈,注明原文连接便可,公号文章转载联系我开白名单就好~