软件设计原则

软件设计的几个原则 一、软件设计的目标? 一个好的软件设计的两大目标是:复用率高,可维护性好。 二、如何设计出一个复用率高、可维护性好的软件系统? 这里有一些设计的原则 1.“开-闭”原则 2.里氏代换原则 3.依赖倒转原则 4.接口隔离原则 5.组合/聚合复用原则 6.迪米特原则 三、“开-闭”原则(OCP) 1.什么是“开-闭”原则? 一个软件实体应当对扩展开放,对修改关闭。 ... 阅读详情

SOLID

  1. 单一职责原则
    • 一个类,只有第一个单一的职责
  2. 开闭原则
    • 对扩展开发,对修改关闭。模块设计时要考虑:实现在不修改源代码的情况下,改变模块的行为。
  3. 里氏替换原则
    • 子类设计要保证:基类出现的地方,子类都可出现
  4. 接口隔离原则
    • 类不应该被迫依赖他们不使用的方法,也就是说一个接口应该拥有尽可能少的行为,它是精简的,也是单一的?
  5. 依赖倒转原则
    • 高模块不依赖低模块,他们都依赖抽象。抽象不依赖细节,细节依赖抽象?

switch语句
如果是面向对象的语言,可以考虑用多态取代。
如果是面向过程的语言,考虑用表驱动或策略模式重构。

软件设计七大原则详解 单一职责原则是指一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一项职责或者功能。开放封闭原则是指软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。换句话说,当需要添加新功能时,应该通过扩展已有代码而不是修改已有代码来实现。里氏替换原则是指如果S是T的子类型,那么在任何使用T类型对象的地方,都可以使用S类型的对象替换,而不会影响程序的正确性。简单来说,子类必须能够替换其基类,且软件功能不受影响。 阅读详情

相关推荐

Proteus下载安装快速入门:30分钟掌握全过程

手把手教你完成proteus下载安装,从环境配置到首次运行一气呵成,适合电子设计新手快速掌握仿真工具的核心操作步骤。

weixin_31974443的博客 893

软件设计的七大原则

学习设计原则是学习设计模式的基础。在实际开发过程中,并不一定要求所有代码都遵循设计原则,只需要在适当的场景遵循设计原则,就可以帮助开发者设计出更加优雅的代码结构。

积跬步,至千里。 1万+

从Unitree B2W到四足机器人:用Isaac Lab构建强化学习奖励函数的5个实战技巧

本文分享了在Isaac Lab仿真环境中,为Unitree B2W等四足机器人设计强化学习奖励函数的5个核心实战技巧。内容涵盖奖励函数的结构化组合、轮腿混合机器人的适配策略、课程学习的动态调整、域随机化增强鲁棒性以及高效的调试可视化方法,旨在帮助开发者构建更稳定、高效的机器人运动策略。

lg888的博客 1066

七种软件设计原则

当两个模块之间存在紧密的耦合关系时,最好的方法就是分离接口和实现,即在依赖之间定义一个抽象的接口使得高层模块调用接口,而底层模块实现接口的定义,以此来有效控制耦合关系,达到依赖于抽象的设计目标。某些时候,实现类并非需要所有的接口定义,在设计上这是“浪费”,而且在实施上这会带来潜在的问题,对胖接口的修改将导致一连串的客户端程序需要修改,有时候这是一种灾难。其核心思想为,降低类之间的耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成搏击,也就是说,信息的隐藏促进了软件的复用。

努力分享一些干货 1267

深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用

深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用前言一、Batch Normalization是什么?1.1 Internal Covariate Shift1.2 Internal Covariate Shift 带来的影响1.3 如何减缓 Internal Covariate Shift 问题带来的影响白化(Whitening)白化存在的问题二、Batch Normalization2.1 传统 Normalization2.2 改进

一扣解千愁的博客 4297

【牛客算法】小美的数组删除

本文分析了小美数组删除问题的解法,提出了一种逆向遍历求MEX的优化算法。该算法通过从数组末尾开始遍历,逐步构建子数组集合,利用MEX的单调性和增量更新特性,在O(n)时间复杂度内计算所有可能删除方案的最小代价。关键设计包括:1)逆向遍历实现MEX状态继承;2)利用HashSet快速判断元素存在;3)动态比较删除前j个元素和删除整个子数组的代价。算法空间复杂度为O(n),适用于大规模数据。代码实现简洁高效,已被验证为同类问题的最优解之一。

字节卷动 1336

软件设计七大原则

对扩展开发,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改关闭,意味着类一旦设计完成,就可以独立的工作,而不要对其进行任何的修改。在面向对象设计中,我们通常通过继承和多态来实现OCP,即封装不变部分。比如需求要实现2种状态的业务。☆如果用if else来判断,那么后面加第三种状态,就还需要在此接口上增加else逻辑,不符合开闭原则。☆用策略类实现,则定义策略接口,策略A和策略B为具体实现类,分别对应两种状态。

草上爬的博客 3837

高通8397/8797 qcx camera usecase梳理

本文介绍了ISP(图像信号处理器)的两种工作模式:Inline模式和Offline模式。Inline模式下,前端(IFE)直接连接物理层并行处理,最多支持4路流处理,后端(IPE)通过内存访问完成增强处理;Offline模式下,图像数据先写入内存再由SFE_Lite读取发送给IFE_Full处理,实现一个IFE串行处理多路数据。文章还详细解析了camera_config和usecase配置文件的结构与作用,包括硬件资源配置、场景逻辑定义等,并以ID40_UsecaseDMS为例说明离线模式的具体实现流程,包

车载行业 850

软件设计原则之开闭原则

在软件设计中,开闭原则(Open Closed Principle)是编程中最基础、最重要设计原则。 开闭原则是指一个软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。也就是说,如果要改变一个程序的功能或增加新的功能,应该尽量通过增加代码来实现,而不是通过修改原有的代码来实现。编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。

hpx666的博客 1646

Python 爬虫实战:爬取知乎问答与评论数据并分析

摘要:本文以Python为核心工具,系统讲解知乎问答与评论数据爬取的技术方案。通过分析知乎API接口结构,详细阐述Requests库结合正则表达式的数据获取方法,涵盖请求头构造、鉴权参数处理等关键技术。文章对比了HTML解析、API调用和Selenium模拟三种爬取方案的优劣,提供完整的代码实现,包括问题信息获取、回答列表爬取和评论数据提取。同时介绍了数据存储(JSON/Excel)和基础文本分析(词云生成)方法,并给出合规使用建议和技术优化方向,为开发者提供了一套可落地的知乎数据爬取与分析解决方案。

2503_91057718的博客 1820

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

本文介绍了在Android设备上通过Termux部署OpenClaw AI助理的方案。Android设备的便携性、Termux提供的完整Linux环境以及多样化的硬件配置使其成为理想的部署平台。文章详细分析了不同级别Android设备的硬件规格(从入门级到旗舰级),并提供了最低/推荐配置要求。部署步骤包括Termux安装初始化、Python环境配置以及性能优化建议。该方案充分利用Android设备的传感器和电池供电优势,为移动办公、学习等场景提供了低成本、高便携性的AI助理解决方案。

博客 3014

六种软件设计原则

软件设计原则 在软件开发过程中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。 6种原则 6种原则分别为:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则、合成复用原则。我将逐个进行分析,学习,理解。 开闭原则 对扩展开放,

ZGG的博客 2566

华为OD机试真题2026双机位C卷 C语言 实现【主次关联成环警告】

在ICT运维领域,现网运维工程师面向对设备上报的众多告警,往往需要筛选出最主要的告警优先处理,次等级的告警或许为同一个根因导致的告警,处理优先级会放后或者不处理,这样就诞生出主次关联告警的概念。给定一系列告警的主次关联关系,判断是否存在如下情况:

MISAYAONE的博客 172

软件设计原则及具体应用

通过将变化的部分抽象出来,将其封装在接口或抽象类中,可以在不修改已有代码的情况下,通过替换具体实现来实现功能的扩展。具体来说,当需要对软件进行修改时,应该通过扩展已有的代码来实现,而不是直接修改已有的代码。通过将依赖关系的创建和管理交给外部容器,可以在不修改已有代码的情况下,通过配置来实现功能的扩展。邮件发送类:一个邮件发送类应该只负责发送邮件的功能,而不应该包含其他与邮件无关的功能,比如日志记录等。日志记录类:一个日志记录类应该只负责记录日志的功能,而不应该包含其他与日志无关的功能,比如发送邮件等。

超哥量化的博客 1466

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深度学习工具包 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")

Java-软件设计七大原则

Java七大设计原则详细介绍及其作用,并结合案例举例,通俗易懂。

某位奇思妙想的IT人员 1272

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

软件设计原则总结

七大软件设计原则(如果讨论六大软件设计原则,则不包括合成/聚合复用原则): 开闭原则(尽可能扩展而非改动): 软件实体(类、接口、方法)对扩展开放,对修改关闭。 举例:课程新增了直播和录播划分,可新增直播和录播课程子类,而不改动课程类。 优点:保持代码稳定,降低维护风险。 依赖倒置原则(尽可能抽象而非细节): 改高层依赖低层,为二者依赖抽象。 面向抽象比面向细节稳定。 举例:改播放课程,内部判断直播或录播,为抽象课程,播放直播或录播课程细节。 依赖注入...

haoranhaoshi的博客 390

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: Docker使用学习笔记
下一篇: Linux 学习笔记
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值