软编码和硬编码

416 阅读5分钟

软编码在灵活性和可维护性、可配置性、耦合度等方面都强于硬编码。

软编码

通常指的是将常量值、固定数值、字符串等通过变量、配置文件或常量定义等方式进行动态设置,使得程序更易维护、更具有可配置性和可扩展性。

软编码在JavaScript中有许多应用示例,在日常开发中使用也很频繁,包括但不限于如下:

配置文件

将程序中的配置信息提取到单独的配置文件中,例如数据库连接信息、API端点、文件路径等。通过软编码,可以使得配置信息更易于修改和管理,而不需要直接修改源代码。为了更安全,还可以对敏感信息使用密文,在使用的时候解密出原文

  1. 从配置文件中读取:

配置文件 config.js 包含了一些常量和配置信息:

// config.js

export const apiUrl = 'https://api.example.com';
export const timeout = 5000;
export const apiKey = 'your_api_key';

然后在 main.js 中,通过导入 config.js 中的内容来使用这些信息:

// main.js

import { apiUrl, timeout } from './config.js';

console.log('API URL:', apiUrl);
console.log('Timeout:', timeout);

// 外部传入信息
function fetchData(url) {
    // 根据外部传入的URL获取数据
    console.log('Fetching data from:', url);
}

fetchData(apiUrl);

解密

var ConnectionConfig = {
  "url":EncryptUtil.decrypt(PropertiesUtil.get("connection.ur1"),
  "username": EncryptUtil.decrypt(PropertiesUtil.get("connection.username")),
  "password": EncryptUtil.decrypt (PropertiesUtil.get("connection.password"))
}

国际化和本地化

将应用中的文本信息、日期格式、货币单位等硬编码到代码中可能会导致代码难以维护和适应不同语言环境。通过软编码,可以将这些文本信息提取到翻译文件或配置文件中,从而实现国际化和本地化。

  1. 准备多语言资源文件:首先创建多个语言版本的资源文件,例如 en.json(英文)、zh.json(中文)等,每个文件包含对应语言的翻译信息。示例内容如下:

en.json:

{
    "welcomeMessage": "Welcome to our website!",
    "error": {
        "notFound": "Error: Page not found",
        "serverError": "Error: Server is down"
    }
}

zh.json:

{
    "welcomeMessage": "欢迎访问我们的网站!",
    "error": {
        "notFound": "错误:页面未找到",
        "serverError": "错误:服务器出现问题"
    }
}
  1. 引入多语言资源文件:在JavaScript代码中引入多语言资源文件,并根据用户选择的语言加载对应的翻译信息。示例代码如下:
// 根据用户选择的语言加载对应的翻译信息
let lang = 'en'; // 默认英文
let translations;

if (lang === 'en') {
    translations = require('./en.json');
} else if (lang === 'zh') {
    translations = require('./zh.json');
}

// 使用软编码的方式输出文本信息
console.log(translations.welcomeMessage);
console.log(translations.error.notFound);

动态切换语言

在用户界面上提供语言切换功能,根据用户选择切换应用程序的显示语言。示例代码如下:

// 模拟用户切换语言为中文
lang = 'zh';
translations = require('./zh.json');

// 使用软编码的方式输出文本信息(已切换至中文)
console.log(translations.welcomeMessage);
console.log(translations.error.serverError);

通过以上示例,可以实现基本的JavaScript软编码国际化功能,使应用程序支持多语言,提升用户体验和应用的可扩展性。在实际项目中,可以结合现有的国际化库或框架来更便捷地实现国际化功能。

错误代码和提示信息

将应用中的错误代码、提示信息、日志级别等提取到单独的文件或配置对象中。这样做可以使得修改和管理这些信息更加方便,并且方便进行国际化处理。

// 定义错误代码和提示信息
const errorMessages = {
    notFound: {
        code: 404,
        message: "Error: Page not found"
    },
    serverError: {
        code: 500,
        message: "Error: Server is down"
    }
};

// 函数示例:根据错误类型返回相应的提示信息
function getErrorMessage(errorType) {
    if (errorMessages[errorType]) {
        return errorMessages[errorType].message;
    } else {
        return "Error: Unknown error";
    }
}

// 示例用法
console.log(getErrorMessage('notFound')); // 输出: Error: Page not found
console.log(getErrorMessage('serverError')); // 输出: Error: Server is down
console.log(getErrorMessage('unknownError')); // 输出: Error: Unknown error

常量定义

将程序中使用的固定数值、常量字符串等提取到常量定义中,例如状态码、最大尝试次数、常用颜色等。通过软编码,可以提高代码的可维护性和可读性。

// 使用常量定义
const MAX_ATTEMPTS = 3;
const API_URL = 'https://api.example.com';
const TIMEOUT = 5000;

// 在代码中使用常量
let attemptCount = 0;

function fetchData() {
    attemptCount++;
    console.log('Fetching data, attempt', attemptCount);
    
    // 模拟网络请求
    setTimeout(() => {
        if (attemptCount <= MAX_ATTEMPTS) {
            console.log('Data fetched successfully');
        } else {
            console.log('Maximum number of attempts reached');
        }
    }, TIMEOUT);
}

// 测试 fetchData 函数
fetchData();

模块导入和配置对象

通过导入外部模块或配置对象,将程序中的依赖关系和配置信息解耦。这样做可以使得代码更加灵活和可配置,并且方便进行单元测试和模块化开发。

  1. 模块导入
// 导入模块
const userService = require('./userService');
const authService = require('./authService');

// 使用模块提供的功能
userService.createUser({ username: 'john', email: 'john@example.com' });
authService.login({ username: 'john', password: 'password' });
  1. 配置对象
// 配置对象
const config = {
    apiUrl: 'https://api.example.com',
    apiKey: 'your-api-key'
};

// 在应用程序中使用配置对象
function fetchData(endpoint) {
    // 使用配置对象中的 apiUrl 和 apiKey
    const url = `${config.apiUrl}/${endpoint}?key=${config.apiKey}`;
    
    // 发起网络请求...
}

// 示例用法
fetchData('users'); // 使用配置的 apiUrl 和 apiKey 发起请求
fetchData('products'); // 使用配置的 apiUrl 和 apiKey 发起请求

动态生成代码

在一些特定场景下,可能需要根据条件动态生成一些代码片段。通过软编码,可以将这些动态生成的代码片段抽象成函数或配置对象,使得代码更具有可读性和可维护性。

// 定义一个函数,根据传入的数字生成相应的加法或乘法代码
function generateMathOperationCode(number, operation) {
    let code = '';

    // 根据操作类型生成相应的代码
    if (operation === 'addition') {
        code += `function add${number}(x) {
            return x + ${number};
        }\n`;
    } else if (operation === 'multiplication') {
        code += `function multiply${number}(x) {
            return x * ${number};
        }\n`;
    } else {
        code += `// Unknown operation\n`;
    }

    return code;
}

// 生成加法和乘法的代码
const additionCode = generateMathOperationCode(5, 'addition');
const multiplicationCode = generateMathOperationCode(10, 'multiplication');

// 输出生成的代码
console.log(additionCode);
// function add5(x) {return x + 5;}
console.log(multiplicationCode);
// function multiply10(x) {return x * 10;}

// 在某个地方执行生成的代码
eval(additionCode);
eval(multiplicationCode);

// 使用生成的函数
console.log(add5(3)); // 输出: 8
console.log(multiply10(4)); // 输出: 40

硬编码

是指在代码中直接使用具体的数值、字符串或其他常量,而不是将其提取出来作为变量或参数。下面是一个简单的 JavaScript 硬编码示例:

// 硬编码示例:直接在代码中使用具体的数值和字符串

// 计算圆的面积
const radius = 5;
const area = Math.PI * radius * radius;
console.log('圆的面积为:' + area);

// 打印一条消息
console.log('Hello, world!');

// 计算两个数的和
const num1 = 10;
const num2 = 20;
const sum = num1 + num2;
console.log('两个数的和为:' + sum);

// 执行一个简单的条件判断
const age = 25;
if (age >= 18) {
    console.log('你已经成年了!');
} else {
    console.log('你还未成年!');
}

我是 甜点cc,个人网站: blog.i-xiao.space/

《共产党宣言》:全世界无产者,联合起来!

公众号:【看见另一种可能】