软件设计六大原则

fawkes:Fawkes,针对面部识别系统的隐私保护工具。 有关更多信息,请访问https://sandlab.cs.uchicago.edufawkes 福克斯 :warning: 在我们的官方上查看我们的MacOS / Windows软件。 Fawkes是由芝加哥大学研究人员开发的一种隐私保护系统。 有关该项目的更多信息,请参阅我们的项目。 通过与我们联系。 我们在USENIX Security 2020上发表了一篇学术论文,总结了我们的工作“”。 版权 此代码仅用于个人隐私保护或学术研究。 用法 $ fawkes 选项: -m , --mode :隐私和干扰大小之间的权衡。 从min , low , mid , high 。 模式越高,对图像的干扰越大,并提供更强的保护。 -d , --directory :与图片目录运行的保障。 -g ,-- --gpu :使用GPU进行优化时的GPU ID。 --batch-size :一起运行优化的图像数。 仅当您具有强大的计算能力时,才更改为> 1。 --format :输出图像的格式(pn 立即下载

单一职责原则(Single Responsibility Principle)

定义

“Every object should have a single responsibility,and that responsibility should be entirely encapsulated by the class”
一个对象应该只包含一个职责,并且该职责被完整地封装进一个类中。

还有一种我更加喜欢的说法:就一个类而言,应该仅有一个引起它变化的原因。

分析

一个类承担的职责越多,他被复用的可能性就越小,而且如果一个类承担很多职责,就相当于将这些职责耦合在一起,一旦更改一点点需求,就需要更改这个类,从而影响其他职责的运行。
类的职责包括数据职责(属性)和行为职责(方法),如果职责过多,这个系统将会很脆弱,一个职责的修改会影响其他职责,即不同的变化原因被封装同一个类中。

开闭原则(Open-Closed Principle)

定义

“Software entities should be open for extension,but closed fo modofocation”
一个软件实体应当对其扩展开放,对修改关闭。

说简单点,比如设计一个app开发框架,框架的用户是程序员。那么程序员在扩展这个框架的功能的时候,应该能在不修改框架的所有模块的前提下进行。

分析

因为几乎所有的软件设计都面临一个问题,即软件的需求往往随着时间的推移而发生变化。如果一个软件系统不符合开闭原则,那么我们每次给这个系统添加新功能的时候都要修改之前的代码,扩展很不方便。符合开闭原则的代码能使得软件系统有良好的稳定性和延续性。
为了满足开闭原则,一般采取的是抽象化设计。比如一个app框架,有2中button类型,抽象就是在这两种button类型之前设计一个抽象的button,所有形象的button都继承抽象的button。且几乎所有的设计模式都满足开闭原则。

里氏代换原则(Liskov Substitution Principle)

定义

“Function that use pointer or references to base classes must be able to use object of derived classes without knowing it”
所有引用基类(父类)的地方必须能够透明的使用其派生类(子类)的对象

说简单点就是子类一定能实现父类的所用功能。

分析

在里氏代换原则里面,基类和派生类不仅仅是简单的“is a”的关系。派生类应该是基类的扩展,而不应该是基类的特殊化。

这里引用百度百科中的一个例子,对于一个长方形的类,如果它的长和宽相等,那么它就是一个正方形,正方形是特殊的长方形,但是正方形不是长方形的子类。它和长方形之间不符合里氏代换原则。
如果长方形类有setWidth,setHeight和getWidth,getHeight函数,我们让正方形类继承自长方形类,然后重载setWidth,setHeight和getWidth,getHeight函数,保证width和height相等。假设一个客户端使用长方形类,用来保存工厂生产的液晶屏的宽和高,然后我们把这里的长方形类换成正方形类,我们会惊讶的发现这个工厂生产出的所有的液晶屏都是方(正方形)的。显然正方形类不能完全的替换长方形类,这不满足里氏代换原则。
这个时候我们就应该写一个抽象的四边形类,然正方形和长方形类都继承自这个类,四边形类只有width,height,get方法,没有set方法。这样就能满足里氏代换原则。

依赖倒置原则(Dependence Inversion Inversion Principle)

定义

"High level modules should not depend ipon low level modules,both should depend upon abstractions.stractions should not depend upon details,details should depend upon abstractions"
高层模块不应该依赖低层模块,他们都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。

分析

依赖倒置原则要求软件系统是依赖接口编程,不要依赖具体的实现。设计模式中的桥模式就是对依赖倒置原则很好的体现,具体的模板方法模式可以去看我之前的博客。

接口隔离原则(Interface Segregation Principle)

定义

"Clients should not forced to depend upon interfaces that they do not use"
客户端不需要提供那些它不需要的接口

分析

接口隔离既指客户端只提供接口,不提供实现,把客户端内部的行为隐藏起来;又指客户端提供尽量少的专门的接口,各个接口的功能相互独立,互不干涉,一个接口只干一件事。

合成复用原则(Composite Reuse Principle)

定义

“Favor composition of objects over inheritance as a reuse mechanism"
尽量使用对象的组合,而不是继承来达到复用的目的。

分析

因为父类对子类是透明的,子类可以看到父类的细节,破坏了封装性,继承复用叫”白箱“复用;而且子类父类耦合度高,父类发生改变的时候子类往往也需要改变,不利于维护。 继承实在编译期间完成的,灵活度较低。

如果使用组合,就能维持类的封装性。保持一个类发生改变的时候不影响其他类,利于维护和修改需求。组合是”黑箱“复用;而且组合可以在运行期发生改变,灵活度高。

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书) 终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴)......... 阅读详情

相关推荐

手把手教你用certificate-manager修复Vcenter证书过期问题(附密码重置技巧)

本文详细解析了Vcenter证书过期引发的503服务不可用、密码错误等典型故障现象,并提供了使用certificate-manager工具进行系统性修复的完整步骤。文章重点阐述了证书体系原理、精准诊断方法,并分享了在SSO验证失败时通过vdcadmintool重置密码的关键技巧,帮助管理员快速恢复平台并建立预防性运维策略。

swift5iosmith的博客 459

软件设计六大基本原则

开放封闭原则是架构设计中的重要原则,通过对已有代码的扩展而不是修改来实现新功能。它可以通过接口和抽象类来实现代码的模块化和解耦,使代码具有良好的可扩展性和可维护性。在实践中,我们可以借鉴优秀的开源框架的设计,通过提供扩展点和插件机制来实现开放封闭原则。单一职责原则是架构设计中的重要原则,要求一个类只负责一个单一的职责或功能。这样的设计使得代码更加清晰、可维护和可扩展。通过拆分类,在每个类中实现单一的职责,可以提高代码的内聚性和松耦合性,从而提高代码的质量和可测试性。

静幽水 3833

高德地图爬虫

高德地图爬虫 工具:Pycharm,win10,Python3.6.4 1.需求分析 这篇爬虫和上一篇百度地图爬虫要求一样,百度地图爬虫我发现有一个auth参数会一直变化,一旦变化则获取的数据是不准确的,所以我上高德地图看了一下,高德地图没有这个反爬机制。但是高德地图大概爬取120个页面就会跳一次验证码,我这里是通过换IP解决这个问题的。 2.数据准备 同样我们需要全国地级市信息,用之前...

123的博客 1万+

软件设计模式:六大设计原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。六大设计原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特原则、合成复用原则。以上就是软件设计模式六大设计原则的讲解。

浩泽学编程的博客 3602

20240128 C#与SCPI协议实战:轻量级仪器控制库ScpiNet应用指南

本文详细介绍了轻量级C#库ScpiNet在仪器控制中的应用。相较于传统的NI-VISA,ScpiNet无需安装庞大运行时,通过纯C#实现直接与USB或以太网设备通信,支持跨厂商SCPI仪器。文章提供了从快速连接到实战封装、错误处理的完整指南,帮助开发者构建简洁高效的自动化测试系统。

h9j8k7l6m5n的博客 547

SD-WAN组网案例——数据中心

SD-WAN组网案例——数据中心

2301_78457663的博客 706

六种软件设计原则

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

ZGG的博客 2566

Trae 在代码审查场景的 3 大差异化能力:对比 Claude Code、Cursor 与 Codex 实测

揭示代码审查的核心矛盾是上下文断层而非找 Bug,介绍 Trae 通过跨文件符号追踪、意图-实现对齐校验、增量变更影响图谱生成三件事实现上下文校准,并对比其与 Claude Code、Cursor、Codex 在多模块 Java 项目中的实际审查差异

weixin_42525482的博客 152

软件设计的六大设计原则

不管是协议接通的变化还是输出传送的变化,都会引起这个接口的变化。软件设计最大的难题就是应对需求的变化,但是纷繁复杂的需求变化又是不可预料的,我们要为不可预料的变化做好准备,这本身是一件非常痛苦的事情,但好在有大师们已经给我们提出了非常好的六大设计原则和23种设计模式来“封装”未来的变化。把这 6 个原则的首字母(里氏替换原则和迪米特法则的首字母重复,只取一个)联合起来就是:SOLID(稳定的),其代表的含义也就是把这 6 个原则结合使用的好处:建立稳定、灵活、健壮的设计。变量的表面类型尽量是接口或抽象类。

sxwn123的专栏 944

【推荐100个unity插件之27】推荐5种办法实现unity人物布料系统 衣服裙子飘动 头发飘动 胸部抖动 骨骼模拟 配件摆动 尾巴摆动 —— 主要是Magica Cloth 2插件

要实现Unity中的人物布料系统并使其具备动态效果,可以探索多种技术方法。这些方法不仅可以使衣服、裙子、头发等元素自然飘动,还可以实现胸部抖动、骨骼模拟、配件摆动和尾巴摆动等细致效果。本文将深入探讨五种实现这些动态效果的技术方案,从基础的物理模拟到高级的动画控制,帮助你打造逼真的人物表现。本文主要探究Magica Cloth 2的使用,因为我想探究最好的实现方法,而不是探究最多的实现方法。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 6300

数据分析:蛋白质组的GO term的富集分析详解

在获取差异表达蛋白质的数据之后,依据蛋白质与基因的对应映射关系,开展GO(Gene Ontology)term的富集分析。通过这一分析流程,能够精准地识别出不同实验组中过表达基因所关联的显著富集的GO term通路。这些富集的GO term通路为后续的生物学研究提供了关键线索,有助于深入探究基因功能、揭示潜在的生物学机制,从而推动生物学发现的进程。

专注生信领域 1368

软件设计的六大原则剖析

我们平时编写代码时,很少有人为了刻意迎合软件设计原则而编写。其实,有时候是你用到了其中的某个或多个设计原则,而不自知而已。也有可能是有的人压根就不知道设计原则是什么。 不过,没关系,为了搞明白既抽象又玄幻的六大准则,我总结了一句话来概括每一种设计原则所体现的主要思想。 里氏替换原则是指继承时不要破坏父类原有的功能;依赖倒置原则是指要面向接口编程;开闭原则是指对扩展是开放的,对修改是关闭的;职责单一...

烟雨星空的博客 1449

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

软件设计的六大原则

目录 一、单一职责原则(SRP: Single responsibility principle) 二、开放封闭原则(OCP: Open Closed Principle) 三、里氏替换原则 ( LSP: Liskov Substitution Principle) 四、接口隔离原则( ISP: Interface Segregation Principle) 五、依赖倒置原则( DI...

qq_26900081的博客 4429

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

浅谈软件设计六大原则

软件设计是软件开发中非常重要的一个环节,而软件设计六大原则则是软件设计的基石,帮助程序员编写更加优秀的代码。这六大原则分别是单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口隔离原则和迪米特法则。下面,我们将详细介绍这六大原则以及如何在实际编程中应用它们。

weixin_62079735的博客 994

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

软件设计 六大原则

前言:所有的原则缩写都是英文的首字母,如开闭原则(Open Closed Principle)是OCP。 开闭原则(Open Closed Principle) 核心 Software entities like classes, modules and functions should be open for extension but closed for modifications. 对扩展开放,对修改关闭。 作用 定义了新增和修改代码时的理想方案。 优缺点 优点:对旧代码无影...

weixin_41048746的博客 573

软件设计模式六大原则

软件设计六大原则里氏替换原则功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 : 在现如今 随着社会的快速发展 越来越多的人忽略了软件设计的本质 , 我们站在后人的角度 来仰望一下前辈们所总结的设计原则 , 回归一下软件设计的

weixin_44669461的博客 322

软件设计六大原则及经典案例解析

口诀总结: “开闭扩展改,里氏替代换,依赖倒转抽,接口小又专,少说话多独,组合优先传”。通过牢记这些口诀和理解经典案例,我们可以在日常开发中遵循六大设计原则,写出更高质量、可扩展的代码。希望这些口诀能帮助你更好地理解和记忆设计模式!

IT技术学习与工作笔记分享 1298

软件设计六大设计原则

了解设计模式的朋友们,想必都听说过“六大设计原则”吧。其实最经典的23种设计模式中或多或少地都在使用这些设计原则,也就是说,设计模式是站在设计原则的基础之上的。所以在学习设计模式之前,很有必要对这些设计原则先做一下了解。 1、单一职责原则 There should never be more than one reason for a class to change. 理解:不同的类具备不同的职责,各司其职。做系统设计是,如果发现有一个类拥有了两种职责,那么就要问一个问题:可以将这个...

lifeidroid的专栏 1130

软件设计中的六大原则

1.单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中降低类的复杂性,类的职责清晰明确比如数据职责和行为职责清晰明确变更引起的风险减低,变更是必不可少的,如果接口的单一职责做的好,一个接口修改只对相应的类有影响,对其他接口无影响,这对系统的扩展性,维护性都有非常大。的帮助2.开放封闭原则:一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭意思是,在一个系统中或者模...

l840758192的博客 299
上一篇: 策略模式(c++)(组建协作型模式)
下一篇: 观察者模式(c++)(组建协作型模式)
FawkesLi
博客等级 码龄8年 21粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值