干净代码架构的特点 | Node.js
目标:让我们的代码能够随着时间的推移而保持弹性
建筑学简介
软件架构主要是指将软件组件的结构安排在一个有目的、高效的系统中。软件架构的目标是最大限度地减少构建和维护软件系统所需的人力。软件开发周期中最耗费精力的过程之一就是适应变化。在软件开发中,处理系统变化的主要方法是在软件各层之间创建关注点分离。这正是罗伯特·塞西尔·马丁(又名鲍勃大叔)创建的“整洁代码架构”的闪光点所在。
以下是使用节点应用程序的片段实现干净的代码架构的好处。
框架独立性
大量使用框架进行操作很容易导致我们的代码严重依赖于所使用的框架。代码与底层框架之间紧密耦合,会导致未来难以更改框架。例如,如果你想从“express”迁移到“sails”
解决此问题:
-
我们尽可能地限制对框架的依赖。
-
我们通过在框架和项目代码之间使用适配器设计模式来实现这一点。
-
相同的方法也用于调整 Response 对象。
在 MERN 堆栈应用程序中,我们创建了一个 adaptRequest() 函数,作为Express 框架和应用程序代码(即内层代码)之间的中间适配器。请查看下面的示例代码片段。
function adaptRequest(req = {}) { | |
return Object.freeze({ | |
path: req.path, | |
// adaptedRequest key : express' request key | |
method: req.method, | |
pathParams: req.params, | |
queryParams: req.query, | |
body: req.body, | |
url: req.originalUrl, | |
user: req.user, | |
session: req.session, | |
}); | |
} | |
module.exports = adaptRequest; |
const express = require('express'); | |
const router = express.Router(); | |
const propertyController = require('../../controller/admin/property'); | |
const adaptRequest = require('../../helpers/adaptRequest'); | |
const sendResponse = require('../../helpers/sendResponse'); | |
const auth = require('../../middleware/auth'); | |
router.post('/admin/property/create', auth(…['createByAdminInAdminPlatform']), (req, res, next) => { | |
req = adaptRequest(req); | |
propertyController.addProperty({ | |
data: req.body, | |
loggedInUser: req.user | |
}) | |
.then((result) => { | |
sendResponse(res, result); | |
a | |
}) | |
.catch((e) => { | |
sendResponse(res, e); | |
}); | |
}); | |
// ... |
function sendResponse(response, result){ | |
return response | |
.set(result.headers) | |
.status(result.statusCode) | |
.send(result.data); | |
}; | |
module.exports = sendResponse; |
独立于数据库
我们使用类似的适配器设计模式使您的代码(在内层)独立于我们正在使用的数据库。
基本上,我们可以创建一个包含所有通用数据库操作的数据库服务接口。然后为项目中使用的每种数据库类型实现一个数据库服务。举个例子,假设我们需要在一个项目中使用多个异构数据库(比如 DynamoDB 和 MongoDb),我们将为每个使用的数据库创建数据库服务,并将数据库服务(DynamoDbService.js)作为依赖注入传递给需要对该数据库(DynamoDB)执行操作的服务(比如 FileUploadService.js)。
您可以将 dbConnectionInstance 作为数据库服务的依赖项传递,从而更深入地了解数据库连接。这样,您只需更改 dbConnectionInstance 即可在项目内建立/切换数据库连接。
(我建议仅在您需要从单个应用程序连接到多个数据库实例时才这样做。)
避免因第三方库而导致的重大变更
-
第三方库通常是导致开发寿命较长的项目发生变化的原因。
-
从寻找更好的替代库到升级现有库的所有事情都可能导致代码改变,并且经常会破坏代码。
-
再次,我们的适配器设计模式可以在这里实现来解决这个问题。
-
我们只需创建一个服务(例如 ThirdPartyLib.js),导入第三方库,用你自己的函数包装第三方函数,并在必要时添加任何额外的逻辑。然后,在需要使用第三方方法的地方使用这个 ThirdPartyLib.js 库。
依赖注入
依赖注入、依赖注入、依赖注入——你可能已经听过这个词很多次了。但是依赖注入到底是什么呢?
“依赖注入”这个说法听起来很荒谬,但其实它只是一个价值 5 美分的概念……依赖注入的意思是将实例变量赋给一个对象。真的。就是这样。—— [3]
我们为什么首先使用依赖注入?
-
创建可测试性
依赖注入是一种非常有用的测试技术,因为它允许模拟或消除依赖关系。[4] -
实现松耦合
松耦合的明显优势在于,它提供了灵活性,让我们可以在不修改底层业务逻辑的情况下更改依赖关系。这让我们能够更好地在开发和测试阶段尝试新的替代方案,而无需承担更改内层代码的风险。
创建干净的代码样板
虽然使用简洁的代码架构创建项目有很多好处,但创建样板代码一直是一项艰巨的任务。网上的示例代码非常适合学习;然而,创建实际应用程序却截然不同。一个简单的方法是使用一个名为DhiWise的全新在线代码生成平台。
您可以使用表格视图添加模型,单击构建应用程序,从组合框中选择干净的代码架构,然后Boom!