说到 SOLID 原则,相信有过几年工作经验的朋友都有个大概印象,但就是不知道它具体是什么。甚至有些工作了十几年的朋友,它们对 SOLID 原则的理解也停留在表面。...例如我们需要修改用户密码,有两种方式可以实现,一种是用「修改用户信息接口」实现修改密码,一种是新起一个接口来实现修改密码功能。...开闭原则(OCP) 开闭原则(Open Closed Principle),它的定义是:一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。...这就要求子类的所有相同方法,都必须遵循父类的约定,否则当父类替换为子类时就会出错。 这样说可能还是有点抽象,我举个例子。...接口隔离原则的意思是,你应该把 1、2、3 抽离出来作为一个接口,4、5 抽离出来作为一个接口,这样接口之间就隔离开来了。 那么为什么要这么做呢?我想这是为了隔离变化吧!
为了解决上文提到的widget序列号的问题,最简单的方式用就是用WeakHashMap,WeakHashMap和HashMap的工作方式很像,除了WeakHashMap把key替换为弱引用(不是Value...引用队列(Reference queues) 一旦弱引用开始返回null,它指向的对象肯定已经被gc掉了,弱引用对象也没啥用了。通常这意味着可以做一些清理工作了。...然后你就可以通过引用队列里的对象来做一些必要的清理工作了。...首先,它可以让你判断是否一个对象已经被从内存中删除,事实上只有这一种方法判断,大部分情况下这个没啥用,但在某些非常特殊的情况下,比如操作大型图像时,它可能会派上用场:如果您确定某个映像应该被gc掉,那么你可以等到它确实被...用虚引用,这种情况是不可能出现的,绝对没有方法获取到一个指向已死对象的指针(因为已经不在内存里了)。因为虚引用不能用来复活一个对象,这个对象可以在gc的第一阶段发现只有虚引用引用的时候被清理掉。
在开发这个应用程序(在我看来它基本可以算作是“企业级 Java”)时,我重新审视了自己喜欢上函数式编程的基本原因。...而在另一个极端,FP 是一种编写所谓“纯”代码的方式——也就是没有副作用的代码,是纯粹的、参考透明的函数。 有些人已经深深地爱上了 FP(非常可以理解!),他们简直将 FP 当作了一种信仰。...”,但它的代码是完全、彻底的垃圾: 当我第一次写好它后,它出现了几个 bug,我花了很多时间来追踪它们。...它很难理解。事实上,C 语言的实现可能会更容易理解。 对于这样一个小函数来说,它非常难以维护。安全地修改代码需要大量的思考和测试,而且你可能无法重用很多代码。 注意,我用的词是“垃圾”。...但就其本身而言,它们并不是我们工作的目标。 换句话说,一个东西是否是“坏“的,与它是否“纯函数式“无关。“纯粹的函数式“既不是好代码的必要条件,也不是充分条件。 我们不能停留在函数式的世界里。
由于工作的需要,我常常需要去阅读他人的代码,维护他人设计的模块。每当我看到大段大段、密密麻麻的代码,而且还没有任何的注释时常常感慨不已,深深体会到了这项工作的重要。...这些独立功能有它与其它功能相互交流的输入输出数据。当我们分析到此处时,我们会非常自然地要将这些功能从原函数中分离出来,形成一个又一个独立的函数,供原函数调用。...这个模式虽然有效提高了代码质量,但是不能滥用,并非只要出现if...else...就需要使用。...当我们创建员工对象时,根据员工的类型,将“工资发放策略”设定为“临时工策略”或“正式工策略”,在计算工资时,只需要调用策略类中的“计算工资”方法,其行为的表现,也设计临时工类和正式工类是一样的。...各个继承类可以根据自己的需要,通过重载重新定义各个步骤函数。但是,模板模式要求不能重载主函数,因此正规的模板模式其主函数应当是final(虽然我们常常不这么写)。
它还可以用来构建混合移动应用、桌面应用甚至用于物联网领域。 我真的很喜欢它,我已经使用 Node.js 工作了 6 年。这篇文章试图成为了解 Node.js 工作原理的终极指南。...也许你想知道为什么一个线程不能同时处理 2 个或更多的请求?这是因为阻塞了 Input/Output 操作。 假设你正在开发一个在线商店应用,并且它需要一个页面,用户可以在其中查看您的所有产品。...当用户访问 /products 时,需要执行特定的方法或函数来满足请求,因此会有一小段代码来解析这个请求的 url 并定位到正确的方法或函数。线程正在工作。✔️ 2. 该方法或函数以及第一行将被执行。...但是,如果那不能解决 C10K 问题,为什么 Node.js 可以?好吧,因为它是单线程的。...它的工作方式与预期的一样,但是生成工作线程并不是最佳实践,创建新线程并不便宜。一定先创建一个线程池。 结论 Node.js 是一项功能强大的技术,值得学习。
简单地说,全局上下文是默认的、顶级的环境,当你的代码不在任何函数或对象内部时,它就位于这个环境中。那么,在这里 this 是如何表现的呢?...; console.log(this.variable); // “我是一个全局变量!” 在这里,当我们声明变量时,它被附加到 window 对象上。...想象一下:你刚写了一个函数,而在你有机会坐下来欣赏你的作品之前,它已经开始工作了。那就是IIFE! IIFE(立即调用的函数表达式)就像那个朋友,一做完计划就立刻行动。一旦定义,砰 —— 它就运行了。...而且,仅仅因为它速度快并不意味着它不是多才多艺的。你可以用标准函数、箭头函数,甚至加入一些 async-await 魔法来制作它。...与“this”有关的常见失误:要注意什么 我们认为我们已经掌握了它的时候,它给了我们一个曲线球。这就像试图抓住一个滑溜的鱼;一旦你失去焦点,它就消失了。
但是,若作为一种注释方式,它就显得太单薄了,比不上写“# todo: xxxx”,后者也会被 IDE 用颜色突显,而且意思更明确。虽然写起来简单,但它也引入了一个看似多余的关键字 pass。...所以,从空间占位符的角度来看,pass 不是编程语言中必须的设计要素。 有了它,我们可以表达出“此处有东西,但暂时跳过”的语义,但如果没有它,则可以用注释内容来替代。...也就是说,缩进代码块中必须包含有语法意义的内容,下面的例子都是有效的: def func(): """这是一个字符串""" def func2(): 123456 Python 在定义函数时...,必须包含函数体,即同时包含声明加定义两种语义,不能像某些语言可以只使用声明的语义,即写成void test(); 。...对人方面,pass 可以表示“暂时跳过”的含义,作为临时的占位符,最终会被实际的代码实现所替换;对机器方面,它则可以表示“直接跳过”,只为了补齐语法逻辑,并不会被其它代码所替换。
但是,若作为一种注释方式,它就显得太单薄了,比不上写“# todo: xxxx”,后者也会被 IDE 用颜色突显,而且意思更明确。虽然写起来简单,但它也引入了一个看似多余的关键字 pass。 ...所以,从空间占位符的角度来看,pass 不是编程语言中必须的设计要素。 有了它,我们可以表达出“此处有东西,但暂时跳过”的语义,但如果没有它,则可以用注释内容来替代。 ...也就是说,缩进代码块中必须包含有语法意义的内容,下面的例子都是有效的: def func(): """这是一个字符串""" def func2(): 123456 Python 在定义函数时,...必须包含函数体,即同时包含声明加定义两种语义,不能像某些语言可以只使用声明的语义,即写成void test(); 。 ...对人方面,pass 可以表示“暂时跳过”的含义,作为临时的占位符,最终会被实际的代码实现所替换;对机器方面,它则可以表示“直接跳过”,只为了补齐语法逻辑,并不会被其它代码所替换。
实际上,原型只是一个被称为"原型"的空对象属性,它是由JavaScript在后台创建(当然我们知道了它的原理,可以手动完成这项工作); 当你创建一个函数时,这个函数都会有一个prototype属性(不管你是不把它当做一个构造函数使用...上面的例子中我写到直接使用链也是可以的,下面会介绍它的查询顺序。虽然我相信对于入门者都是使用的链查询,但是我们有必然要知道它背后的那些机制。...用新对象替换prototype属性会删除默认的构造函数属性 我们可以用一个新值来替换prototype属性的默认值,但是需要特别注意的是:这么做会删除在"预制"原型对象中找到的默认的constructor...但是我们需要注意下面的一点: 丨 丨 丨 用新对象替换prototype属性不会更新以前的实例 当你想用一个新对象完全替换prototype属性时,觉得所有的实例都会被更新,那么就即将要走向一条寻错的道路...这里的重点是,一旦开始创建实例,就不应用一个新对象那个来替换对象的原型,这样将会导致实例有一个指向不同原型的链接 自定义构造函数实现原型继承 当我们在自定义构造函数时,同样可以实现原型继承: ?
当一个专业的工具可以施加特定的约束,并且能从中获益时,它就比一般的工具要好。React 就是这样的典范,并且它坚持两个原则: 稳定性。...而当我们探讨为什么会这样时却很有意思。 事实上,你很少会直接调用 ReactDOM.render 。相反,在 React 应用中程序往往会被拆分成这样的函数: ?...让 React 调用你的组件函数还有最后一个好处就是惰性求值。让我们看看它是什么意思。 惰性求值 当我们在 JavaScript 中调用函数时,参数往往在函数调用之前被执行。 ?...局部状态是如此有用,以至于 React 让你的组件也能拥有它。 组件仍然是函数但是 React 用对构建 UI 有好处的许多特性增强了它。在树中每个组件所绑定的局部状态就是这些特性之一。...但是我们将 React 作为一个运行时环境来看待,因为 React 用 JavaScript 来描绘整个 UI 树,它的特性往往更接近于语言层面。
有些读者应该是不懂C语言/C++的,所以这篇文章我就来讲一下C语言/C++为什么可以作为低级工具,为什么它们速度非常快?...Python属于解释性语言,正常人都会这么认为,但是大家在编写大型程序(也就是多个Python文件的项目)时,在同目录下会有一个__pycache__的文件夹,里面的文件后缀名全都是pyc,如图所示。...到这里有一个问题,如果我程序结果不对,发现结果的错误是因为一个模块的错误,修改了那个模块,但是对应的pyc文件未修改,正常人会认为结果还是错的,实际上修改模块就能输出正确的结果,不需要把对应的pyc文件删除...头文件包含指令 头文件包含指令就一个#include,后面可以是双引号文件名,也可以是尖括号文件名,因为学校里C语言用的是VC6.0,头文件包含用双引号准没错,但是如果你使用了VS2017,那就不是这样了...(3)可执行文件:它包含了一个可以被操作系统创建一个进程来执行之的文件。 汇编程序生成的实际上是第一种类型的目标文件。对于后两种还需要其他的一些处理方能得到,这个就是链接程序的工作了。
但是下面的内容是很容易理解的: 我们很容易就注意到,当b=0时,函数总是通过原点[0,0]。当我们保持a不变的情况下引入b时,新的函数总是相互平行的。那么,我们能从中得到什么信息呢?...只不过对一些分布进行分类时偏置项可能有用,但不是对所有情况都有用。怎样测试它的实际效果呢?让我们使用一个简单的例子:OR函数。...如前所述,在这种情况下感知器具有更大的灵活性。此外我们可以注意到,它正在寻找与上一个示例相同的判别平面,但是现在它能够找到分离数据的最佳位置。 所以,偏置项的重要性现在已经很清楚了。...我知道你现在可能在思考激活函数,我们在python例子中使用了一个阶跃函数作为激活函数,如果我们使用sigmoid作为激活函数,它的效果可能会更好?相信我:不会的。...sigmoid函数虽然改变了输出的形状,但是我们仍然遇到同样的问题:如果没有偏置项,所有的函数都会经过原点。当我们试图用曲线分离OR函数中时,它仍然得不到满意的结果。
有些读者应该是不懂C语言/C++的,所以这篇文章我就来讲一下C语言/C++为什么可以作为低级工具,为什么它们速度非常快?...Python属于解释性语言,正常人都会这么认为,但是大家在编写大型程序(也就是多个Python文件的项目)时,在同目录下会有一个pycache的文件夹,里面的文件后缀名全都是pyc,如图所示: ?...到这里有一个问题,如果我程序结果不对,发现结果的错误是因为一个模块的错误,修改了那个模块,但是对应的pyc文件未修改,正常人会认为结果还是错的,实际上修改模块就能输出正确的结果,不需要把对应的pyc文件删除...头文件包含指令 头文件包含指令就一个#include,后面可以是双引号文件名,也可以是尖括号文件名,因为学校里C语言用的是VC6.0,头文件包含用双引号准没错,但是如果你使用了VS2017,那就不是这样了...可执行文件:它包含了一个可以被操作系统创建一个进程来执行之的文件。 汇编程序生成的实际上是第一种类型的目标文件。对于后两种还需要其他的一些处理方能得到,这个就是链接程序的工作了。
本系列的其它篇: 学会使用函数式编程的程序员(第1部分) 学会使用函数式编程的程序员(第2部分) 引用透明 (Referential Transparency) 引用透明是一个富有想象力的优秀术语,它是用来描述纯函数可以被它的表达式安全的替换..."不能找到 " + "'" + str + "'" } 这个就是通常所说的“反向重构”(它对我而言有更多的意义),可以用来帮程序员或者程序(例如编译器和测试程序)推理代码的过程一个很好的方法。...在这种情况下,我们必须依赖程序中调用它们的顺序来确定它们的执行顺序。这就是所有命令式语言的工作方式。 第二点必须满足的就是一个函数的输出值不能作为其它函数的输入值。...当它传入最后一个参数,一个数组,它就会被执行。 同理,onlyEven 函数是由 isEven 函数进行断言的过滤函数。...但是这些语言都是从 Javascript 开始的,并且只稍微改进了一点。为什么不直接从纯函数语言转换到Javascript呢未来期盼 我们不可能知道未来会怎样,但我们可以做一些有根据的猜测。
过程 在这个阶段,当我们准备接手这个工单时,最好让社区中的其他人知道我们正在开始解决它。我们可以很容易做到这一点, 只要把工单分配给我们自己即可(查看工单概览下的 “Assign” 按钮)。...但是,你也能想到,如果工单分配给某个人的话,大多数人在开始工作前也可能会去联系承接人。 与之相关的是,请牢记当我们把工单分配给自己时,不应该在这个工作上拖延太久。...其他的贡献者,可能会由于工单已被分配而忽略。 当我们马上就要开始工作时,推荐的做法是先点击"Start Progress"按钮。...当我处理该工单时,最新可用的版本为 2.172;当我自行构建源码时看到的版本为 2.173-SNAPSHOT,也就是社区正在进行的下一个版本。...我添加了 Jira 工单链接,提供了两条变更日志条目,完成了提交者的检查单,并增加了三位期望的复查者(并介绍了我为什么认为条目的复查会是有价值的)。
关于小程序的scroll-view: 说实话这个组件刚刚使用的时候确实感觉很不错,我使用它进行了列表页面的滑动编辑和删除,不过当我在线下的时候,发现安卓手机可以使用下面的代码,发现安卓手机可以隐藏横向滚动条...b页面操作了数据以后,服务器是已经接收到了这个操作了,没有必要在a页面在告诉服务器一次,我们只需要改变视图层的数据就可以了,我的做法是在b页面内将数据保存在storage内,这样b操作了以后,我们在onShow...关于js操作style属性的问题: 说实话,这个是真的坑,在以往js操作css的时候我们直接通过获取元素style进行设置就可以了,而小程序不是这样,小程序不能操作元素的style,于是想到一个解决办法是通过动态绑定的形式绑定元素...关于转发功能: 小程序转发的接口有以下几种: 小程序转发 根据业务的需要选择上面的api就好了,当然我们做的是一个转发后数据部分数据隐藏的功能,我选择的是onShareAppMessage()这个函数...在app方面我选择了H5,为什么选择了H5而不是React Native做app,因为reactnative不是很友好不是工作需要千万别碰~~
为什么应用使用RN来做界面,这是为什么呢?我觉得所有的Web界面都应该用Cocoas 来替换啊。 答:使用游戏引擎APP也是可以的,我想到有几个问题 1....问:我制作了一个预制资源,这个预制资源中有一个按钮。当我在layout节点下面生成这个预制体后,如何给他上面的按钮添加一个点击事件,弹出一个提示框?...在生成的时候我给他添加了一个标签,所以可以根据这个 标签拿到这个按钮,但是怎么给他添加点击事件?...问:我制作了一个预制资源,这个预制资源中有一个按钮。当我在layout节点下面生成这个预制体后,如何给他上面的按钮添加一个点击事件,弹出一个提示框?...为什么我Label的字体大小不能调整? 问:字体font size 属性有个锁, 是怎么回事?数值也改变不了 ?
大家都知道,洗衣机洗衣服是需要等待时间的,如果10个洗衣工,1人负责1台洗衣机,这样效率肯定会提高,但是不觉得浪费资源吗?明明1 个人能做的事,却要10个人来做。...这就是计算机的协程!洗衣机就是执行的方法。” 协程,又称微线程。 协程的作用是在执行函数A时可以随时中断去执行函数B,然后中断函数B继续执行函数A(可以自由切换)。...这个大家肯定都知道是25分钟,因为在做作业的时候,可以先按下洗衣机和电饭煲的按钮,不用等它完成,洗衣机和电饭煲做好了会发出‘滴滴滴’的声音通知你。 所以这三件事是可以异步完成的,这就是异步的魅力!...add_clothes() # 等待这个事情完成 print('衣服加进去,可以开始工作了。。。。')...衣服加进去,可以开始工作了。。。。
领取专属 10元无门槛券
手把手带您无忧上云