代码要写成别人看不懂的样子(三)

模型剪枝实战 | Torch-Pruning 库在YOLOv8上的应用指南 本文详细介绍了如何使用Torch-Pruning库对YOLOv8模型进行结构化剪枝,以实现模型“瘦身”。通过DepGraph(依赖图)技术自动处理层间依赖,确保剪枝安全。文章提供了从环境搭建、核心原理理解到完整剪枝流程的实战指南,并强调了剪枝后的微调与性能评估,帮助开发者在保持精度的同时显著提升模型推理速度。 阅读详情

前言

  书接上回,我们学习了装饰器模式,不知各位道友是否还有印象,本集,我们来学一学工厂相关的设计模式,分为三部, 简单工厂 , 工厂方法 和 抽象工厂 。

  先个大家打个预防针,工厂相关的设计模式,都是需要面向对象来实现的,而面向对象只是一种思想上的转变,平时我们实现某个功能,是想着如何操作 Dom ,现在我们需要考虑,把我们要实现的东西转化成一个活生生的对象。

  比如在页面左侧增加一个固定窗口展示广告,平常我们会写一个 div ,然后给这个 div 一个图片,来展示广告。右上角再给一个小按钮,点击可以关闭广告。如果采用面向对象,那么我们可以创建一个构造函数,如下:

var Advertisement = function (pic) {
	this.pic = pic;
	this.close = function () {}
}

一、简单工厂模式

  该模式可以管理少部分的同一类,如下方所示,不用去记忆篮球,足球,网球的构造函数,只需要记住 SportsFactory 就可以了。

//篮球基类
var Basketball = function() {
	this.intro = '篮球盛行于美国';
}
Basketball.prototype = {
	getMember: function() {
		console.log('每个队伍需要5人');
	},
	getBallSize: function() {
		console.log('篮球很大');
	}
}
//足球基类
var Football = function() {
	this.intro = '足球盛行于欧洲';
}
Football.prototype = {
	getMember: function() {
		console.log('每个队伍需要11人');
	},
	getBallSize: function() {
		console.log('足球很大');
	}
}
//网球基类
var Tennis = function() {
	this.intro = '网球盛行于澳洲';
}
Tennis.prototype = {
	getMember: function() {
		console.log('每个队伍需要1人');
	},
	getBallSize: function() {
		console.log('网球很小');
	}
}
//运动工厂
var SportsFactory = function(name) {
	switch(name) {
		case 'NBA':
			return new Basketball();
		case 'WorldCup':
			return new Football();
		case 'FrencOpen':
			return new Tennis();
	}
}
//为世界杯创建一个足球
var football = SportsFactory('WorldCup');

  另外对于具有相似属性的不同类,我们也可以利用简单工厂模式,把公共的部分提取出来,然后分别创建差异的部分。

function createPop(type, text) {
	//创建一个对象,并对对象拓展属性和方法
	var o = new Object();
	o.content = text;
	o.show = function() {
		//显示方法
	}
	if(type === 'alert') {
		//警示框差异部分
	}
	if(type === 'prompt') {
		//提示框差异部分
	}
	if(type === 'confirm') {
		//确认框差异部分
	}
	return o;
}
//创建警示框
var userNameAlert = createPop('alert', '警告,参数不正确');

   上面两种方法由于创建的方式不同,所以在应用时也有存在部分区别,第一种通过实例化对象创建,如果这些类继承同一个父类,那么他们父类上的方法是可以公用的。第二种是创建一个新的对象,然后增强该对象的属性。由于每一个都是新个体,所以他们的方法就不能共用。所以使用哪种方法,要根据需求来灵活选择。

二、安全工厂模式

  简单工厂模式里面每次添加都需要修改两个地方,这给需求变更带来了隐患,万一忘记修改另一个地方,还得去重新去定位问题,这时候就需要我们用到工厂模式,把这两个整合到一个里面,方便我们需求变更时,进行修改。

// 安全模式创建的工厂类
var Factory = function (type, content) {
	//这一部分是为了保护创建实例时,忘记关键字new的情况
	if (this instanceof Factory) {
		var s = new this[type](content);
		return s;
	} else {
		return new Factory(type, content);
	}
}
//工厂原型中设置创建所有类型数据的基类
Factory.prototype = {
	Java: function(content) {},
	JavaScript: function(content) {},
	PHP: function(content) {}
}

三、抽象工厂模式

  通过创建抽象类,来实现工厂模式,这种方法称为抽象工厂模式。

  大家注意,抽象类是一种可以创建,但不能使用的类,一旦使用就会报错。那么问题来了,既然不能用,那我们造它干嘛。

  抽象类的使用方法主要是用于大型应用中,当使用继承时,总有一些子类会继承父类,父类需要预先定义一些必要的方法,但没有具体实现,比如下面的 getPrice 方法。通过子类继承的 getPrice 方法如果没有重写,那么一旦使用,就会友好提示。

//汽车抽象类,当使用其实例对象的方法时会抛出错误
var Car = function() {};
Car.prototype = {
	getPrice: fucntion() {
		return new Error('抽象方法不能调用');
	},
	getSpeed: fucntion() {
		return new Error('抽象方法不能调用');
	}
}

  这个 Car 其实什么都不能做,创建时没有任何属性,然而原型上面的方法也不能使用,否则会报错。但是在继承上很有用,上面定义了一种类,并且定义了该类的方法,如果在子类中没有重写这个方法,那么该方法调用时就会报错。这一点很有用,在一些大型应用上面,父类会经常定义一些必要的方法,一旦子类创建了一个对象,该对象就会具备这些必要方法,如果没有重写,则会友好提示。

  抽象类作用,定义一个产品族,并声明一些必备方法,如果子类中没有去重写,就会抛出错误。而抽象工厂方法不会创建对象,而是要求一个对象具备完整的功能。

//抽象工厂方法
var VehicleFactory = function(subType, superType) {
	//判断抽象工厂中是否有该抽象类
	if(typeof VehicleFactory[superType] === 'function') {
		//缓存类
		function F() {};
		//继承父类属性和方法
		F.prototype = new VehicleFactory[superType] ();
		//将子类的constructor指向子类
		subType.constructor = subType;
		//子类原型继承父类
		subType.protype = new F();
	} else {
		//不存在该抽象类,抛出错误
		throw new Error('未创建该抽象类');
	}
}
//小汽车抽象类
VehicleFactory.Car = function() {
	this.type = 'car';
}
VehicleFactory.Car.prototype = {
	getPrice: fucntion() {
		return new Error('抽象方法不能调用');
	},
	getSpeed: fucntion() {
		return new Error('抽象方法不能调用');
	}
}
//公交车抽象类
VehicleFactory.Bus = function() {
	this.type = 'bus';
}
VehicleFactory.Bus.prototype = {
	getPrice: fucntion() {
		return new Error('抽象方法不能调用');
	},
	getSpeed: fucntion() {
		return new Error('抽象方法不能调用');
	}
}
//货车抽象类
VehicleFactory.Truck = function() {
	this.type = 'truck';
}
VehicleFactory.Truck.prototype = {
	getPrice: fucntion() {
		return new Error('抽象方法不能调用');
	},
	getSpeed: fucntion() {
		return new Error('抽象方法不能调用');
	}
}

  抽象工厂其实是一个子类继承父类的方法,通过寄生式继承,继承父类时需要注意一点,在对过度类的原型继承时,不是继承父类的原型,而是通过 new 关键字 复制一个父类的实例,这样做是为了不仅要进程父类原型上的方法,还要继承父类的对象属性。

  抽象工厂因为不需要实例化对象,所以只需要一份,因此直接给抽象工厂添加类的属性即可。

如何使用

  我们只需要一些子类产品,然后让子类继承相应的产品组抽象类就行了

//宝马汽车子类
var BMW = function(price, speed) {
	this.price = price;
	this.speed = speed;
}
//使用抽象工厂对Car类进行继承
VehicleFactory(BMW, 'Car');
BMW.prototype.getPrice = function() {
	return this.price;
}
BMW.prototype.getSpeed = function() {
	return this.speed;
}

  通过抽象方法,可以知道每个子类是哪一个类别,然后他们也具备了必须的属性和方法。

var car = new BMW(1000000, 100);
console.log(car.getPrice()); //1000000
console.log(car.type()); //car

  抽象工厂模式是设计模式中最抽象的一种,也是创建模式中,唯一一种抽象化创建模式,他创建的是一个类簇,可以制定类的结构,但是由于 JS 不支持抽象化创建与虚拟方法,导致这种模式不能像在其他面向对象语言中应用的那么广泛。毕竟 abstract 在 JS 中还是一个关键字。

  本节介绍了工厂相关的方法,分别是管理简单类的简单工厂方法,把类写到原型上的安全工厂方法,还有创建子类的抽象工厂方法。下一节我们一起学习对整体对象局部创建,来达到功能复用最大化。

  




别再傻傻分不清了!用Design Compiler和PrimeTime实操对比PBA与GBA模式 本文深度解析静态时序分析(STA)中Design Compiler与PrimeTime工具的PBA与GBA模式差异,通过实际案例演示两种模式在转换时间计算、时钟路径分析等方面的对比,并提供工程实践中模式选择的策略与调试技巧,帮助工程师在芯片设计流程中平衡精度与效率。 阅读详情

相关推荐

auto.js梦幻西游游戏脚本,梦幻西游脚本开发思路

本篇文章给大家谈谈梦幻西游脚本用什么语言写,以及auto.js梦幻西游游戏脚本,希望对各位有所帮助,不要忘了收藏本站喔。

npy199331的博客 1939

如何写出同事看不懂的Java代码?

前几天,正巧赶上组里代码review,一下午下来,感觉整个人都血压拉满了。

1212

STM32 FOC电机控制:手把手教你用CubeMX配置TIM1中心对齐PWM(含代码避坑)

本文详细解析了STM32 FOC电机控制中TIM1中心对齐PWM的配置方法,涵盖CubeMX图形化设置、HAL库代码调用及常见问题排查。特别针对L6230Q驱动芯片的使能逻辑和死区时间配置提供实用指南,帮助开发者高效实现无刷电机的高性能控制。

weixin_27027459的博客 442

如何让别人看不懂java代码_为什么你写的代码别人看不懂?

看别人的代码的时候各位是什么感受?是这样?还是这样?为什么我们会有这样的感受呢?这个问题不急回答,大家可以想一下你一般在动手编码之前会比较重点关注那些事情呢?是优雅美观的代码?言简意赅的注解,还是具有良好扩展性的架构?亦或是良好的编码习惯和风格。按时交付这里的意思不是说为了能够按时交付就不注重产品质量了啊。只有在保证项目质量并且按期交付的前提下再去考虑代码的整洁性和后期的扩展性。大家可以再往深处想...

weixin_29423089的博客 889

JAVA实战:通过营地号解析王者荣耀用户数据(战绩、英雄、皮肤全掌握)

本文详细介绍了如何使用JAVA通过营地号解析王者荣耀用户数据,包括战绩、英雄和皮肤信息。通过HttpClient发送请求并解析JSON数据,开发者可以获取玩家对局详情、英雄使用情况和皮肤偏好等关键指标,为游戏数据分析提供实用解决方案。

sun99的博客 865

【C++PTA】6-1 Point类的运算 (10 分)

定义Point类,有坐标x,y两个私有成员变量;对Point类重载“+”(相加)、“-”(相减)和“==”(相等)运算符,实现对坐标的改变,要求用友元函数和成员函数两种方法实现。对Point类重载<<运算符,以使得代码 Point p; cout<<p<<endl;可以输出该点对象的坐标。 函数接口定义: 实现Point类。 裁判测试程序样例: /* 请在这里填写答案 */ int main(int argc, char const *argv[]) { P

libertye的博客 2367

代码要写成别人看不懂的样子(十七)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言数据访问对象模式 前言   各位作为一名前端开发,大家有没有遇到过前端存储,比如用户初次进入程序,会有一个个性化引导,一般来说这块功能是交给后台同事来做的,但是有时候需要放在前端,来保存是否第一次登陆的字段。   那我们在本地存储的时候呢,可能会遇到很多问题,每添加一组数据,担心会不会覆盖别人的数据等等,本节的设计模式,就介绍怎么合理前端存储。 数据访问对象模式   抽象和封装对数据源的访问与存储, DAO通过对数据源链接的管理方便对数据

不见浅诗的博客 341

RuoYi项目适配达梦数据库(二)

RuoYi项目,代码生成模块的达梦数据库适配。

邢慧鹏的博客 1万+

Java小白也能轻松写一个大神都看不懂的程序,绝对让人佩服

你想在别人面前秀一把你的“神功”吗?跟着二当家的轻松学到“武功根基”,秀他们一脸的迷茫。

二当家的白帽子 2240

Conda换源全攻略:从清华源到默认源的保姆级切换教程(附常见问题解决)

本文提供Conda换源的完整教程,详细讲解如何从清华源切换到默认源,包括配置步骤、常见问题解决方案及高级技巧。针对国内开发者遇到的下载速度慢问题,清华源提供了高速稳定的解决方案,同时文章也介绍了恢复默认源的方法和多种镜像源选择。

weixin_28837817的博客 940

3 路由引入

在大型企业网络中,网络规模十分庞大,选用单一的路由协议无法满足网络的需求,因此多种路由协议共存的情况十分常见。或者出于业务逻辑或行政管理的考虑,会在不同的网络结构中设计和部署不同的路由协议,使路由的层次结构更加清晰可控。路由引入是具有方向性的,将路由信息从路由协议A引入到路由协议B(A-to-B),则路由协议B可获知A中的路由信息,但是此时,A还并不知晓B路由协议中的路由信息,除非配置B-to-A的路由引入。表3-1:各种路由协议的优先级。通过路由引入,可以实现路由信息在不同路由协议间传递。

lwljh134的博客 621

代码要写成别人看不懂的样子(一)

本篇文章参考以下博文 文章目录前言 前言   最近读了一本书,张容铭老师的 《JavaScript设计模式》 ,书中提到的编码模式,编码风格,让我想起了我刚学 JS 的时候,特别向往像大神一样,全篇没什么 div 罗列,都是方法或者构造函数之类的东西,一顿操作后, body 里面只要添加一个 <div id=“demo”> ,大功告成。   逼格满满有没有,当时就想,什么时候我也能这样,别人看不懂我的代码,所有的事情不用自己手写,只要给一个容器,然后执行函数就

不见浅诗的博客 1713

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3188

代码要写成别人看不懂的样子(二)

文章目录前言前期准备如何才能让别人看不懂1.四两拨千斤2.指桑骂槐 前言   上一期我们,浅尝辄止,稍微介绍了下代码如何写才能更高级,更有内涵,主要是需要配合继承,或是某些数据特性来说。这一节咱们放个大招,运用兵法来写代码,保证初学者看不懂,既便能看懂,也不知道为什么这样做,即便知道为什么这样做,没有系统学习过的人也做不好。   这部兵法就是–设计模式。 前期准备   各位乡绅,读这本书前,个人建议要对 继承 , 类 (虽然JS在ES6之前没有类,但是可以通过一些手段实现类), 构造函数 ,

不见浅诗的博客 623

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

代码要写成别人看不懂的样子(十)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言状态模式 前言   各位写代码的时候,经常会出现条件判断吧,那么条件判断里面脸最熟的当属 if 了吧,这个东西在我们开始编码的时候,真的是隔一段时间不写,就浑身难受。   但是呢,if 这个东西,哪怕是再简单的判断,也会有隐含问题,而且在代码可读性上,条件判断的效果很不友好,当存在多重判断的时候,简直就是灾难。   所以为了解决条件判断的这些弊端,状态模式应运而生。 状态模式   状态模式:当一个对象的内部状态发生改变时,会导

不见浅诗的博客 447

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

代码要写成别人看不懂的样子(二十)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言惰性模式 前言   各位接触过机器学习没有,没了解过也没关系,这东西的大体思路就是,当第一次执行某种情况时,机器会去判断一些情况,到第二次执行的时候,就不需要再重复判断了,那么机器学习就会在第一次执行完成后,记录当时的计算过程,参数等数据,然后重新定义这种特定情况,当再次遇到后,不需要重复判断,直接获取上次的结果就行。   这个机器学习,就很像我们今天要说的惰性模式。真的超级像(我个人猜测,有可能当年发明机器学的人,就是惰性模式用的比较好

不见浅诗的博客 250

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

代码要写成别人看不懂的样子(八)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言注意事项 前言   铁汁们,我又来了,上节的组合模式,各位乱了没?不慌哈,这一节我们一起学个更乱的,就不会觉得上一个乱了。   通过不同的组合我们可以拼出很多我们像要的东西,只有想不到的需求,没有实现不了的方案。 注意事项      组合模式刚上手有点乱,不过核心思想还是比较清晰明确的,把需求拆分成一个一个子类,让所有子类继承一个虚拟父类就可以了。之前问过一位高人,如何才能写好代码,前辈指点:“ 惟手熟尔 ”。设计模式初学的时候,一定要

不见浅诗的博客 920

代码要写成别人看不懂的样子(六)

文章目录前言一、代理模式 前言   由于现在网络的发展,访问量,需求量越来越高,很难再使用一台服务器解决所有请求了,这就需要设置专门功能的服务器,来处理专门的业务。比如一个大型应用中,地图功能需要配置一台地图服务器,实况功能需要配置一台媒体服务器,数据上传专门来一台服务器,数据库系统再来一台,管理这些服务器还需要一台。在一些高并发的地方,一台服务器处理不过来,要把请求分散到各个服务器上进行处理。   服务器越来越多,不可避免地要考虑一个问题,跨域请求,跨域本身是一种安全策略,为了网络安全,不能直接请求非本服

不见浅诗的博客 368

代码要写成别人看不懂的样子(十六)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言链模式 前言   大家一定用过 JQuery 吧,这东西的一大特性就是链式调用,获取到某个元素后,直接连续执行多个方法,贼帅,其实我们也可以做到。   本节开始,就给大家介绍一些技巧性的设计模式,平时能经常用到,类似语法糖一样,简单易懂,而且功能奇妙,不会像前面的设计模式那样长篇大论,肯定比前面容易接收,而且有趣。 链模式    通过对象方法中,将当前对象返回,实现对同一个对象多个方法的链式调用。   

不见浅诗的博客 192

代码要写成别人看不懂的样子(十三)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言备忘录模式 前言   各位有没有做过分页,做分页一定会涉及到上一页,下一页,我们为了页面的流畅性,一般都是只请求当前页的数据,当点击上下页按钮的时候,才会请求对应的数据。   这个策略没错,但是用户一般都很调皮,不会老老实实,只点下一页,或者只点上一页,有时候可能会来回,上一页,下一页疯狂点击,那么这种情况就会疯狂请求数据。   页面很可能会卡死,那有没有什么方法能解决这种调皮鬼行为呢?   有时候我们可以增加点击限制,数据没返回之前,不

不见浅诗的博客 278

代码要写成别人看不懂的样子(五)

文章目录前言一、外观模式二、适配器模式 前言   通过前面几篇文章,大家估计对对象的创建有了一个新的认识,在很多大型应用里面,对象会相当复杂,但是其刚创建的时候,并不是这样,而是通过后续的组合,封装,才一步一步完善起来的,从本章节开始,我们一块来学一学,如何把这些对象组合的更合理,从而使想强大的功能。 一、外观模式   大家一定绑定过事件,而且一定像下面这样绑定过 document.onclick = fucntion(e) { e.preventDefault(); if(e.target !== d

不见浅诗的博客 455

代码要写成别人看不懂的样子(九)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言模板方法模式 前言   前几节的结构型设计模式,各位学的乱不乱,我个人刚开始接触的时候,也觉得很抽象,不太好理解,尤其是实战的时候,总是不知道在什么情况下使用。记住一点,当我们单纯的创建一个    模板方法模式       ...

不见浅诗的博客 397

代码要写成别人看不懂的样子(四)

文章目录前言一、简单工厂模式二、安全工厂模式三、抽象工厂模式如何使用四、建造者模式 前言   书接上回,我们学习了装饰器模式,不知各位道友是否还有印象,本集,我们来学一学工厂相关的设计模式,分为三部,简单工厂,工厂方法和抽象工厂。   先个大家打个预防针,工厂相关的设计模式,都是需要面向对象来实现的,而面向对象只是一种思想上的转变,平时我们实现某个功能,是想着如何操作Dom,现在我们需要考虑,把我们要实现的东西转化成一个活生生的对象。   比如在页面左侧增加一个固定窗口展示广告,平常我们会写一个div,然后

不见浅诗的博客 273

代码要写成别人看不懂的样子(十九)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言简单模板模式 前言   大家有没有遇到过操作大量节点的情况,比如我们在页面上想要创建一个展示区域,这块区域,需要跟不同的选项来展示不同结构的内容,那我们就需要根据选项来操作不同的节点。首先创建节点,然后创建节点内容,将节点内容插入到创建的节点中,最后将节点插入到父节点中。   这一套操作下俩,一个节点就需要 4 步,如果节点比较多,那这性能消耗就有点遭不住了。   为了解决这一个问题,我们可以使用简单模板方法。如果各位接触过模板字符串

不见浅诗的博客 353

代码要写成别人看不懂的样子(十一)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言状态模式 前言    状态模式   

不见浅诗的博客 407

代码要写成别人看不懂的样子(十二)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言访问者模式 前言    访问者模式    针对对象结构中的元素,定义在不改变对象的前提下访问结构中元素的新方法 。                         ...

不见浅诗的博客 253
上一篇: 代码要写成别人看不懂的样子(二)
下一篇: 代码要写成别人看不懂的样子(四)
不见浅诗~
博客等级 码龄7年 506粉丝 129原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值