JS优化:减少前端代码耦合

避免全局耦合

场景

<script>
    var PAGE = 20;
</script>
<script src="main.js">
</script>

全局变量跨了两个文件使用,html和main.js,对于维护main.js的开发很难去理解PAGE变量的含义。
不利于维护

JS/CSS/HTML的耦合

场景

//bad
$('.bar').css({
    position:fixed;
    top:0;
    left:0;
})

//good
$('.bar').addClass('fixed');

尽量不要在js中给元素添加样式,把样式统一放到css中去维护,js中的样式其它开发很难在浏览器中发现来源。

减少重复代码

场景

ajax请求的封装

//bad
$('#search').on("click",function(){
    var formData = getFormData();
    $.ajax({
        url:'./search',
        data:formData,
        success:function(data){
            showResult(data);
        }
    })
});

$('input').on("change",function(){
    //把用户的搜索条件展示进行改变
    changeInputFilterShow();
    var formData = getFormData();
    $.ajax({
        url:'./search',
        data:formData,
        success:function(data){
            showResult(data);
        }
    })
});

//better
function getAndShowData(){
    var formData = getFormData();
    $.ajax({
        url:'./search',
        data:formData,
        success:function(data){
            showResult(data);
        }
    })
}
$('#search').on("click",function(){
    var formData = getFormData();
    getAndShowData()
});

$('input').on("change",function(){
    //把用户的搜索条件展示进行改变
    changeInputFilterShow();
    getAndShowData()
});

进一步可以将ajax请求封装成一个公共模块,所有发请求的处理都可以使用该模板,传参数,返回结果。

整体思路:出现了重复代码 --> 封装成一个函数 --> 封装成一个模块 --> 封装成一个插件

使用策略模式

场景

//bad
function popCallback(popType){
    switch(popType){
        case "register":
            //do nothing
            break;
        case "favHouse":
            favHouse();
            break;
        case "saveSearch":
            saveSearch();
            break;
    }
}

//good

//pop-callback.js
var popCallback = {
    favHouse: function(){

    },
    saveSearch: function(){

    }
}
//main.js
var popCallback = require("pop-callback");
if(typeof popCallback[popType] === "function"){
    popCallback[popType]();
}

对扩展开发,对修改封闭,面向对象的开闭原则。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是粒子群优化算法耦合随机森林的 Python 代码示例: ```python import numpy as np from sklearn.ensemble import RandomForestRegressor class PSO_RF: def __init__(self, n_particles, n_features, n_trees, max_iter): self.n_particles = n_particles self.n_features = n_features self.n_trees = n_trees self.max_iter = max_iter self.swarm_pos = np.random.uniform(-1, 1, size=(n_particles, n_features)) self.swarm_vel = np.zeros((n_particles, n_features)) self.pbest_pos = self.swarm_pos.copy() self.pbest_fitness = np.inf * np.ones(n_particles) self.gbest_pos = np.zeros(n_features) self.gbest_fitness = np.inf self.rf_models = [] def _fitness(self, pos, X_train, y_train, X_valid, y_valid): rf_model = RandomForestRegressor(n_estimators=self.n_trees, max_features=pos) rf_model.fit(X_train, y_train) y_pred = rf_model.predict(X_valid) mse = np.mean((y_pred - y_valid)**2) return mse, rf_model def optimize(self, X_train, y_train, X_valid, y_valid): for i in range(self.max_iter): for j in range(self.n_particles): fitness, rf_model = self._fitness(self.swarm_pos[j], X_train, y_train, X_valid, y_valid) if fitness < self.pbest_fitness[j]: self.pbest_fitness[j] = fitness self.pbest_pos[j] = self.swarm_pos[j].copy() if fitness < self.gbest_fitness: self.gbest_fitness = fitness self.gbest_pos = self.swarm_pos[j].copy() self.rf_models.append(rf_model) w = 0.7298 c1 = 1.49618 c2 = 1.49618 r1 = np.random.uniform(size=(self.n_particles, self.n_features)) r2 = np.random.uniform(size=(self.n_particles, self.n_features)) self.swarm_vel = w*self.swarm_vel + c1*r1*(self.pbest_pos - self.swarm_pos) + c2*r2*(self.gbest_pos - self.swarm_pos) self.swarm_pos = self.swarm_pos + self.swarm_vel def predict(self, X_test): y_pred = np.zeros(X_test.shape[0]) for model in self.rf_models: y_pred += model.predict(X_test) y_pred /= len(self.rf_models) return y_pred ``` 其中,`PSO_RF` 类包含以下方法: - `__init__`: 初始化粒子群优化算法相关参数,并生成初始粒子群位置和速度。 - `_fitness`: 计算粒子的适应度,并返回用该粒子位置训练出的随机森林模型。 - `optimize`: 使用粒子群优化算法优化粒子群,并在优化过程中记录每个粒子的最佳位置和全局最佳位置所对应的随机森林模型。 - `predict`: 对测试数据进行预测,返回所有随机森林模型的预测结果的平均值作为最终预测结果。 在使用该类时,需要先实例化一个 `PSO_RF` 对象,然后调用 `optimize` 方法进行优化,最后调用 `predict` 方法进行预测。以下是一个示例: ```python from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 加载数据集 X, y = load_boston(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=42) # 定义 PSO_RF 模型 model = PSO_RF(n_particles=20, n_features=X.shape[1], n_trees=100, max_iter=50) # 优化模型 model.optimize(X_train, y_train, X_valid, y_valid) # 预测并计算均方误差 y_pred = model.predict(X_valid) mse = mean_squared_error(y_valid, y_pred) print("MSE:", mse) ``` 在这个示例中,我们使用波士顿房价数据集进行训练和测试,实例化一个 `PSO_RF` 对象,并调用 `optimize` 方法进行优化。最后,我们使用 `predict` 方法对测试数据进行预测,并计算均方误差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值