首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

超易懂!原来SOLID原则要这么理解!

说到 SOLID 原则,相信有过几年工作经验朋友都有个大概印象,但就是不知道具体是什么。甚至有些工作了十几年朋友,它们对 SOLID 原则理解也停留在表面。...例如我们需要修改用户密码,有两种方式可以实现,一种是「修改用户信息接口」实现修改密码,一种是新起一个接口来实现修改密码功能。...开闭原则(OCP) 开闭原则(Open Closed Principle),定义是:一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。...这就要求子类所有相同方法,都必须遵循父类约定,否则当父类替换为子类就会出错。 这样说可能还是有点抽象,举个例子。...接口隔离原则意思是,你应该把 1、2、3 抽离出来作为一个接口,4、5 抽离出来作为一个接口,这样接口之间就隔离开来了。 那么为什么要这么做呢?想这是为了隔离变化吧!

82520

Java弱引用(WeakReferences)

为了解决上文提到widget序列号问题,最简单方式就是WeakHashMap,WeakHashMap和HashMap工作方式很像,除了WeakHashMap把key替换为弱引用(不是Value...引用队列(Reference queues)   一旦弱引用开始返回null,指向对象肯定已经被gc掉了,弱引用对象也没啥用了。通常这意味着可以做一些清理工作了。...然后你就可以通过引用队列里对象来做一些必要清理工作了。...首先,它可以让你判断是否一个对象已经被从内存中删除,事实上只有这一种方法判断,大部分情况下这个没啥,但在某些非常特殊情况下,比如操作大型图像,它可能会派上用场:如果您确定某个映像应该被gc掉,那么你可以等到确实被...虚引用,这种情况是不可能出现,绝对没有方法获取到一个指向已死对象指针(因为已经不在内存里了)。因为虚引用不能用来复活一个对象,这个对象可以在gc第一阶段发现只有虚引用引用时候被清理掉。

56611
您找到你想要的搜索结果了吗?
是的
没有找到

成为函数式编程工程师四年,为什么说它既“流氓”又“可爱”

在开发这个应用程序(在我看来基本可以算作是“企业级 Java”)重新审视了自己喜欢上函数式编程基本原因。...而在另一个极端,FP 是一种编写所谓“纯”代码方式——也就是没有副作用代码,是纯粹、参考透明函数。 有些人已经深深地爱上了 FP(非常可以理解!),他们简直将 FP 当作了一种信仰。...”,但它代码是完全、彻底垃圾: 当我第一次写好后,出现了几个 bug,花了很多时间来追踪它们。...很难理解。事实上,C 语言实现可能会更容易理解。 对于这样一个函数来说,非常难以维护。安全地修改代码需要大量思考和测试,而且你可能无法重用很多代码。 注意,词是“垃圾”。...但就其本身而言,它们并不是我们工作目标。 换句话说,一个东西是否是“坏“,与它是否“纯函数式“无关。“纯粹函数式“既不是好代码必要条件,也不是充分条件。 我们不能停留在函数世界里。

29720

对代码领悟之-高质量代码有三要素:可读性、可维护性、可变更性

由于工作需要,常常需要去阅读他人代码,维护他人设计模块。每当我看到大段大段、密密麻麻代码,而且还没有任何注释时常常感慨不已,深深体会到了这项工作重要。...这些独立功能有它与其它功能相互交流输入输出数据。当我们分析到此处,我们会非常自然地要将这些功能从原函数中分离出来,形成一个一个独立函数,供原函数调用。...这个模式虽然有效提高了代码质量,但是不能滥用,并非只要出现if...else...就需要使用。...当我们创建员工对象,根据员工类型,将“工资发放策略”设定为“临时策略”或“正式策略”,在计算工资,只需要调用策略类中“计算工资”方法,其行为表现,也设计临时类和正式类是一样。...各个继承类可以根据自己需要,通过重载重新定义各个步骤函数但是,模板模式要求不能重载主函数,因此正规模板模式其主函数应当是final(虽然我们常常不这么写)。

1.7K30

你需要了解有关 Node.js 所有信息

它还可以用来构建混合移动应用、桌面应用甚至用于物联网领域。 真的很喜欢已经使用 Node.js 工作了 6 年。这篇文章试图成为了解 Node.js 工作原理终极指南。...也许你想知道为什么一个线程不能同时处理 2 个或更多请求?这是因为阻塞了 Input/Output 操作。 假设你正在开发一个在线商店应用,并且需要一个页面,用户可以在其中查看您所有产品。...当用户访问 /products ,需要执行特定方法或函数来满足请求,因此会有一小段代码来解析这个请求 url 并定位到正确方法或函数。线程正在工作。✔️ 2. 该方法或函数以及第一行将被执行。...但是,如果那不能解决 C10K 问题,为什么 Node.js 可以?好吧,因为它是单线程。...工作方式与预期一样,但是生成工作线程并不是最佳实践,创建新线程并不便宜。一定先创建一个线程池。 结论 Node.js 是一项功能强大技术,值得学习。

91622

一劳永逸地搞懂 JavaScript中‘this’

简单地说,全局上下文是默认、顶级环境,当你代码不在任何函数或对象内部它就位于这个环境中。那么,在这里 this 是如何表现呢?...; console.log(this.variable); // “一个全局变量!” 在这里,当我们声明变量,它被附加到 window 对象上。...想象一下:你刚写了一个函数,而在你有机会坐下来欣赏你作品之前,已经开始工作了。那就是IIFE! IIFE(立即调用函数表达式)就像那个朋友,一做完计划就立刻行动。一旦定义,砰 —— 它就运行了。...而且,仅仅因为速度快并不意味着它不是多才多艺。你可以标准函数、箭头函数,甚至加入一些 async-await 魔法来制作。...与“this”有关常见失误:要注意什么 我们认为我们已经掌握了时候,给了我们一个曲线球。这就像试图抓住一个滑溜鱼;一旦你失去焦点,它就消失了。

10110

Python 为什么要有 pass 语句?

但是,若作为一种注释方式,它就显得太单薄了,比不上写“# todo: xxxx”,后者也会被 IDE 颜色突显,而且意思更明确。虽然写起来简单,但它也引入了一个看似多余关键字 pass。...所以,从空间占位符角度来看,pass 不是编程语言中必须设计要素。 有了,我们可以表达出“此处有东西,但暂时跳过”语义,但如果没有,则可以注释内容来替代。...也就是说,缩进代码块中必须包含有语法意义内容,下面的例子都是有效: def func(): """这是一个字符串""" def func2(): 123456 Python 在定义函数...,必须包含函数体,即同时包含声明加定义两种语义,不能像某些语言可以只使用声明语义,即写成void test(); 。...对人方面,pass 可以表示“暂时跳过”含义,作为临时占位符,最终会被实际代码实现所替换;对机器方面,可以表示“直接跳过”,只为了补齐语法逻辑,并不会被其它代码所替换

56330

python会忽略pass语句吗_Python 为什么要有 pass 语句?

但是,若作为一种注释方式,它就显得太单薄了,比不上写“# todo: xxxx”,后者也会被 IDE 颜色突显,而且意思更明确。虽然写起来简单,但它也引入了一个看似多余关键字 pass。  ...所以,从空间占位符角度来看,pass 不是编程语言中必须设计要素。  有了,我们可以表达出“此处有东西,但暂时跳过”语义,但如果没有,则可以注释内容来替代。  ...也就是说,缩进代码块中必须包含有语法意义内容,下面的例子都是有效:  def func():  """这是一个字符串"""  def func2():  123456  Python 在定义函数,...必须包含函数体,即同时包含声明加定义两种语义,不能像某些语言可以只使用声明语义,即写成void test(); 。  ...对人方面,pass 可以表示“暂时跳过”含义,作为临时占位符,最终会被实际代码实现所替换;对机器方面,可以表示“直接跳过”,只为了补齐语法逻辑,并不会被其它代码所替换

1.4K10

强大原型和原型链

实际上,原型只是一个被称为"原型"空对象属性,它是由JavaScript在后台创建(当然我们知道了原理,可以手动完成这项工作); 当你创建一个函数,这个函数都会有一个prototype属性(不管你是不把当做一个构造函数使用...上面的例子中写到直接使用链也是可以,下面会介绍查询顺序。虽然相信对于入门者都是使用链查询,但是我们有必然要知道背后那些机制。...新对象替换prototype属性会删除默认构造函数属性 我们可以一个新值来替换prototype属性默认值,但是需要特别注意是:这么做会删除在"预制"原型对象中找到默认constructor...但是我们需要注意下面的一点:   丨   丨   丨 新对象替换prototype属性不会更新以前实例  当你想用一个新对象完全替换prototype属性,觉得所有的实例都会被更新,那么就即将要走向一条寻错道路...这里重点是,一旦开始创建实例,就不应用一个新对象那个来替换对象原型,这样将会导致实例有一个指向不同原型链接  自定义构造函数实现原型继承  当我们在自定义构造函数,同样可以实现原型继承: ?

793100

把 React 作为 UI 运行时来使用

一个专业工具可以施加特定约束,并且能从中获益它就比一般工具要好。React 就是这样典范,并且坚持两个原则: 稳定性。...而当我们探讨为什么会这样却很有意思。 事实上,你很少会直接调用 ReactDOM.render 。相反,在 React 应用中程序往往会被拆分成这样函数: ?...让 React 调用你组件函数还有最后一个好处就是惰性求值。让我们看看它是什么意思。 惰性求值 当我们在 JavaScript 中调用函数,参数往往在函数调用之前被执行。 ?...局部状态是如此有用,以至于 React 让你组件也能拥有。 组件仍然是函数但是 React 对构建 UI 有好处许多特性增强了。在树中每个组件所绑定局部状态就是这些特性之一。...但是我们将 React 作为一个运行时环境来看待,因为 React JavaScript 来描绘整个 UI 树,特性往往更接近于语言层面。

2.4K40

强大原型和原型链

实际上,原型只是一个被称为"原型"空对象属性,它是由JavaScript在后台创建(当然我们知道了原理,可以手动完成这项工作); 当你创建一个函数,这个函数都会有一个prototype属性(不管你是不把当做一个构造函数使用...上面的例子中写到直接使用链也是可以,下面会介绍查询顺序。虽然相信对于入门者都是使用链查询,但是我们有必然要知道背后那些机制。...新对象替换prototype属性会删除默认构造函数属性 我们可以一个新值来替换prototype属性默认值,但是需要特别注意是:这么做会删除在"预制"原型对象中找到默认constructor...但是我们需要注意下面的一点:   丨   丨   丨 新对象替换prototype属性不会更新以前实例  当你想用一个新对象完全替换prototype属性,觉得所有的实例都会被更新,那么就即将要走向一条寻错道路...这里重点是,一旦开始创建实例,就不应用一个新对象那个来替换对象原型,这样将会导致实例有一个指向不同原型链接  自定义构造函数实现原型继承  当我们在自定义构造函数,同样可以实现原型继承: ?

69380

Python 为什么要有 pass 语句?

但是,若作为一种注释方式,它就显得太单薄了,比不上写“# todo: xxxx”,后者也会被 IDE 颜色突显,而且意思更明确。虽然写起来简单,但它也引入了一个看似多余关键字 pass。...所以,从空间占位符角度来看,pass 不是编程语言中必须设计要素。 有了,我们可以表达出“此处有东西,但暂时跳过”语义,但如果没有,则可以注释内容来替代。...也就是说,缩进代码块中必须包含有语法意义内容,下面的例子都是有效: def func(): """这是一个字符串""" def func2(): 123456 Python 在定义函数...,必须包含函数体,即同时包含声明加定义两种语义,不能像某些语言可以只使用声明语义,即写成void test(); 。...对人方面,pass 可以表示“暂时跳过”含义,作为临时占位符,最终会被实际代码实现所替换;对机器方面,可以表示“直接跳过”,只为了补齐语法逻辑,并不会被其它代码所替换

1.5K10

低级工具——C语言C++

有些读者应该是不懂C语言/C++,所以这篇文章就来讲一下C语言/C++为什么可以作为低级工具,为什么它们速度非常快?...Python属于解释性语言,正常人都会这么认为,但是大家在编写大型程序(也就是多个Python文件项目),在同目录下会有一个__pycache__文件夹,里面的文件后缀名全都是pyc,如图所示。...到这里有一个问题,如果程序结果不对,发现结果错误是因为一个模块错误,修改了那个模块,但是对应pyc文件未修改,正常人会认为结果还是错,实际上修改模块就能输出正确结果,不需要把对应pyc文件删除...头文件包含指令 头文件包含指令就一个#include,后面可以是双引号文件名,也可以是尖括号文件名,因为学校里C语言是VC6.0,头文件包含双引号准没错,但是如果你使用了VS2017,那就不是这样了...(3)可执行文件:包含了一个可以被操作系统创建一个进程来执行之文件。 汇编程序生成实际上是第一种类型目标文件。对于后两种还需要其他一些处理方能得到,这个就是链接程序工作了

2.1K10

深度学习基础:为什么神经网络感知机中神经元需要偏置项?

但是下面的内容是很容易理解: 我们很容易就注意到,当b=0函数总是通过原点[0,0]。当我们保持a不变情况下引入b,新函数总是相互平行。那么,我们能从中得到什么信息呢?...只不过对一些分布进行分类偏置项可能有用,但不是对所有情况都有用。怎样测试实际效果呢?让我们使用一个简单例子:OR函数。...如前所述,在这种情况下感知器具有更大灵活性。此外我们可以注意到,正在寻找与上一个示例相同判别平面,但是现在它能够找到分离数据最佳位置。 所以,偏置项重要性现在已经很清楚了。...知道你现在可能在思考激活函数,我们在python例子中使用了一个阶跃函数作为激活函数,如果我们使用sigmoid作为激活函数效果可能会更好?相信我:不会。...sigmoid函数虽然改变了输出形状,但是我们仍然遇到同样问题:如果没有偏置项,所有的函数都会经过原点。当我们试图曲线分离OR函数仍然得不到满意结果。

2.4K20

Python遇见C++碰出编译火花

有些读者应该是不懂C语言/C++,所以这篇文章就来讲一下C语言/C++为什么可以作为低级工具,为什么它们速度非常快?...Python属于解释性语言,正常人都会这么认为,但是大家在编写大型程序(也就是多个Python文件项目),在同目录下会有一个pycache文件夹,里面的文件后缀名全都是pyc,如图所示: ?...到这里有一个问题,如果程序结果不对,发现结果错误是因为一个模块错误,修改了那个模块,但是对应pyc文件未修改,正常人会认为结果还是错,实际上修改模块就能输出正确结果,不需要把对应pyc文件删除...头文件包含指令 头文件包含指令就一个#include,后面可以是双引号文件名,也可以是尖括号文件名,因为学校里C语言是VC6.0,头文件包含双引号准没错,但是如果你使用了VS2017,那就不是这样了...可执行文件:包含了一个可以被操作系统创建一个进程来执行之文件。 汇编程序生成实际上是第一种类型目标文件。对于后两种还需要其他一些处理方能得到,这个就是链接程序工作了

95610

学会使用函数式编程程序员(第3部分)

本系列其它篇: 学会使用函数式编程程序员(第1部分) 学会使用函数式编程程序员(第2部分) 引用透明 (Referential Transparency) 引用透明是一个富有想象力优秀术语,它是用来描述纯函数可以表达式安全替换..."不能找到 " + "'" + str + "'" } 这个就是通常所说“反向重构”(它对而言有更多意义),可以用来帮程序员或者程序(例如编译器和测试程序)推理代码过程一个很好方法。...在这种情况下,我们必须依赖程序中调用它们顺序来确定它们执行顺序。这就是所有命令式语言工作方式。 第二点必须满足就是一个函数输出值不能作为其它函数输入值。...当传入最后一个参数,一个数组,它就会被执行。 同理,onlyEven 函数是由 isEven 函数进行断言过滤函数。...但是这些语言都是从 Javascript 开始,并且只稍微改进了一点。为什么不直接从纯函数语言转换到Javascript呢未来期盼 我们不可能知道未来会怎样,但我们可以做一些有根据猜测。

49610

成为一名 Jenkins 贡献者:对新手友好

过程 在这个阶段,当我们准备接手这个,最好让社区中其他人知道我们正在开始解决。我们可以很容易做到这一点, 只要把单分配给我们自己即可(查看单概览下 “Assign” 按钮)。...但是,你也能想到,如果单分配给某个人的话,大多数人在开始工作前也可能会去联系承接人。 与之相关是,请牢记当我们把单分配给自己,不应该在这个工作上拖延太久。...其他贡献者,可能会由于单已被分配而忽略。 当我们马上就要开始工作,推荐做法是先点击"Start Progress"按钮。...当我处理该,最新可用版本为 2.172;当我自行构建源码看到版本为 2.173-SNAPSHOT,也就是社区正在进行一个版本。...添加了 Jira 单链接,提供了两条变更日志条目,完成了提交者检查单,并增加了三位期望复查者(并介绍了为什么认为条目的复查会是有价值)。

76720

创业选择之微信小程序开发

关于小程序scroll-view: 说实话这个组件刚刚使用时候确实感觉很不错,使用它进行了列表页面的滑动编辑和删除,不过当我在线下时候,发现安卓手机可以使用下面的代码,发现安卓手机可以隐藏横向滚动条...b页面操作了数据以后,服务器是已经接收到了这个操作了,没有必要在a页面在告诉服务器一次,我们只需要改变视图层数据就可以了,做法是在b页面内将数据保存在storage内,这样b操作了以后,我们在onShow...关于js操作style属性问题: 说实话,这个是真的坑,在以往js操作css时候我们直接通过获取元素style进行设置就可以了,而小程序不是这样,小程序不能操作元素style,于是想到一个解决办法是通过动态绑定形式绑定元素...关于转发功能: 小程序转发接口有以下几种: 小程序转发 根据业务需要选择上面的api就好了,当然我们做一个转发后数据部分数据隐藏功能,选择是onShareAppMessage()这个函数...在app方面选择了H5,为什么选择了H5而不是React Native做app,因为reactnative不是很友好不是工作需要千万别碰~~

77230

Cocos论坛九问九答

为什么应用使用RN来做界面,这是为什么呢?觉得所有的Web界面都应该用Cocoas 来替换啊。 答:使用游戏引擎APP也是可以想到有几个问题 1....问:作了一个预制资源,这个预制资源中有一个按钮。当我在layout节点下面生成这个预制体后,如何给他上面的按钮添加一个点击事件,弹出一个提示框?...在生成时候给他添加了一个标签,所以可以根据这个 标签拿到这个按钮,但是怎么给他添加点击事件?...问:作了一个预制资源,这个预制资源中有一个按钮。当我在layout节点下面生成这个预制体后,如何给他上面的按钮添加一个点击事件,弹出一个提示框?...为什么Label字体大小不能调整? 问:字体font size 属性有个锁, 是怎么回事?数值也改变不了 ?

1.6K30

python 异步 asyncawait -1.一文理解什么是协程

大家都知道,洗衣机洗衣服是需要等待时间,如果10个洗衣,1人负责1台洗衣机,这样效率肯定会提高,但是不觉得浪费资源吗?明明1 个人能做事,却要10个人来做。...这就是计算机协程!洗衣机就是执行方法。” 协程,又称微线程。 协程作用是在执行函数A可以随时中断去执行函数B,然后中断函数B继续执行函数A(可以自由切换)。...这个大家肯定都知道是25分钟,因为在做作业时候,可以先按下洗衣机和电饭煲按钮,不用等完成,洗衣机和电饭煲做好了会发出‘滴滴滴’声音通知你。 所以这三件事是可以异步完成,这就是异步魅力!...add_clothes() # 等待这个事情完成 print('衣服加进去,可以开始工作了。。。。')...衣服加进去,可以开始工作了。。。。

3.7K40
领券