首页 文章 精选 留言 我的

精选列表

搜索[编写],共10005篇文章
优秀的个人博客,低调大师

编写 if 时不带 else,你的代码会更好

设计更好的软件,替换If-Else的5种方法。入门到高级示例 让我直接说这句话:If-Else通常是一个糟糕的选择。 它导致设计复杂,代码可读性差,并且可能导致重构困难。 但是,If-Else已成为事实上的代码分支解决方案,这确实是有道理的。这是向所有有抱负的开发人员讲授的第一件事。不幸的是,许多开发人员从来没有前进到更合适的分支策略。 有些人的口头禅是:If-Else是一把锤子,一切都是钉子。 无法区分何时使用更合适的方法是区分大三学生和大三学生的原因之一。 我将向您展示一些技巧和模式,这些技巧和模式将终结这种可怕的做法。 每个示例的难度都会增加。 1 完全不必要的Else块 这也许是那些初级开发人员最负罪的之一。下面的示例很好地说明了当您被认为If-Else很棒时会发生什么。 Simple if-else 只需删除else`块即可简化此过程。 Removed else 看起来更专业吧? 您会经常发现,实际上根本不需要其他块。像在这种情况下一样,您想要在满足特定条件的情况下执行某些操作并立即返回。 2 价值分配 如果您要根据提供的某些输入为变量分配新值,请停止If-Else废话-一种更具可读性的方法。 Value assignment with if-else 尽管很简单,但它却很糟糕。首先,If-Else很容易在这里被开关取代。但是,我们可以通过完全删除else来进一步简化此代码。 If statements with fast return 如果不使用else,则我们将剩下干净的可读代码。请注意,我也将样式更改为快速返回而不是单返回语句-如果已经找到正确的值,继续测试一个值根本没有意义。 3 前提条件检查 通常,我发现,如果方法提供了无效的值,则继续执行是没有意义的。 假设我们从以前就有了DefineGender方法,要求提供的输入值必须始终为0或1。 Method without value checks 在没有价值验证的情况下执行该方法没有任何意义。因此,在允许方法继续执行之前,我们需要检查一些先决条件。 应用保护子句防御性编码技术,您将检查方法的输入值,然后继续执行方法。 Check preconditions with guard clauses 至此,我们确保仅在值落在预期范围内时才执行主逻辑。 现在,IF也已被三元代替,因为不再需要在结尾处默认返回"未知"。 4 将If-Else转换为字典—完全避免If-Else 假设您需要执行一些操作,这些操作将根据某些条件进行选择,我们知道以后必须添加更多操作。 也许有人倾向于使用久经考验的If-Else。如果添加新操作,则只需简单地添加其他内容即可。很简单 但是,就维护而言,这种方法不是一个好的设计。 知道我们以后需要添加新的操作后,我们可以将If-Else重构为字典。 可读性已大大提高,并且可以更轻松地推断出该代码。 注意,仅出于说明目的将字典放置在方法内部。您可能希望从其他地方提供它。 5 扩展应用程序—完全避免使用If-Else 这是一个稍微高级的示例。 通过用对象替换它们,知道何时甚至完全消除If。 通常,您会发现自己不得不扩展应用程序的某些部分。作为初级开发人员,您可能会倾向于通过添加额外的If-Else(即else-if)语句来做到这一点。 举这个说明性的例子。在这里,我们需要将Order实例显示为字符串。首先,我们只有两种字符串表示形式:JSON和纯文本。在此阶段使用If-Else并不是什么大问题,如果我们可以轻松替换其他,只要如前所述即可。 知道我们需要扩展应用程序的这一部分,这种方法绝对是不可接受的。 上面的代码不仅违反了"打开/关闭"原则,而且阅读得不好,还会引起可维护性方面的麻烦。 正确的方法是遵循SOLID原则的方法-我们通过实施动态类型发现过程(在本例中为策略模式)来做到这一点。 重构这个混乱的过程的过程如下: 使用公共接口将每个分支提取到单独的策略类中 动态查找实现通用接口的所有类 根据输入决定执行哪种策略 替换上面示例的代码如下所示。是的,这是更多代码的方式。它要求您了解类型发现的工作原理。但是动态扩展应用程序是一个高级主题。 我只显示将替换If-Else示例的确切部分。如果要查看所有涉及的对象,请查看此要点。 让我们快速浏览一下代码。 方法签名保持不变,因为调用者不需要了解我们的重构。 首先,获取实现通用接口IOrderOutputStrategy的程序集中的所有类型。然后,我们建立一个字典,格式化程序的displayName的名称为key,类型为value。 然后从字典中选择格式化程序类型,然后尝试实例化策略对象。 最后,调用策略对象的ConvertOrderToString。 (本文翻译自Nicklas Millard的文章《Better Software Without If-Else》,参考:https://medium.com/swlh/5-ways-to-replace-if-else-statements-857c0ff19357)

优秀的个人博客,低调大师

Prometheus 2.19.0 发布,Go 编写的服务监控系统

Prometheus 2.19.0 发布了,Prometheus 是一个 Go 语言开发的开源的服务监控系统和时间序列数据库。该版本引入了一些新特性,比如记录其他组件、增强功能和修复 bug,这些都是为了提高可用性。 此版本更新内容如下: 特性 TSDB:磁盘中 Head(内存)块的全部内存映射。这减少了内存占用,并使重新启动更快。 增强功能 Discovery:添加了对 Triton 全球区域的发现支持。 警报重新发送的延迟增加,可以更好地容忍故障。 远程读取:添加了 prometheus_remote_storage_remote_read_queries_total 计数器以计算远程读取查询的总数。 为标签名称和标签值 API 添加了时间范围参数。 TSDB:减少了针对高负载的隔离争用。 Bug 修复 PromQL:消除了检查重复标签时的冲突。 React UI:单击当前选项卡时不清空数据。 PromQL:正确跟踪查询的样本数。 PromQL:当直方图桶中有 0 个观测值时,返回 NaN。 TSDB:使用Prometheus并配置了远程读取时,修复错误的查询结果。 更新说明:https://github.com/prometheus/prometheus/releases/tag/v2.19.0

优秀的个人博客,低调大师

Prometheus 2.15.0 发布,Go 编写的服务监控系统

Prometheus 2.15.0 发布了,Prometheus 是一个 Go 语言开发的开源的服务监控系统和时间序列数据库。该版本引入了一些新特性,比如记录其他组件、增强功能和修复 bug,这些都是为了提高可用性。 更新内容如下: 特性 API:添加了新的 endpoint,用于公开每个指标元数据/元数据#6420#6442 BUGFIX 配置:修复了警报管理器配置,当配置相似时不会错过目标#6455 远程写入:prometheus_remote_storage_shards_desired 标尺的值显示了所需分片的原始值,并且已正确更新#6378 规则:Prometheus 现在无法评估规则和警报,其中度量标准结果与标签字段中指定的标签发生冲突#6469 API:Targets Metadata API/targets/metadata 现在可以接受规范中的空 match_targets 参数#6303 更新说明:https://github.com/prometheus/prometheus/releases/tag/v2.15.0

优秀的个人博客,低调大师

Prometheus 2.13.1 发布,Go 编写的服务监控系统

Prometheus 2.13.1 发布了。Prometheus 是一个 Go 语言开发的开源的服务监控系统和时间序列数据库。该版本引入了一些新特性,比如记录其他组件、增强功能和修复 bug,这些都是为了提高可用性。 更新内容如下: [BUGFIX] 修复 Prometheus 的 ARM 版本中的 panic#6110 [BUGFIX] promql:修复查询记录器中可能出现的紧急情况#6094 [BUGFIX] http 的多个错误:日志中多余的response.WriteHeader 调用#6145 更新说明及下载地址

优秀的个人博客,低调大师

Prometheus 2.13.0 发布,Go 编写的服务监控系统

服务监控系统 Prometheus 2.13.0 发布了,Prometheus 是一个 Go 语言开发的开源的服务监控系统和时间序列数据库。该版本引入了一些新特性,比如记录其他组件、增强功能和修复 bug,这些都是为了提高可用性。 更新内容如下: [SECURITY/BUGFIX] UI:修复了一个 Stored DOM XSS 漏洞CVE-2019-10215.#6098 [CHANGE] Metrics:将 prometheus_sd_configs_failed_total 重命名为 prometheus_sd_failed_configs,并更改为仪表#5254 [ENHANCEMENT] 在构建中包含 tsdb 工具#6089 [ENHANCEMENT] Service discovery:为 kubernetes 添加新的节点地址类型#5902 [ENHANCEMENT] UI:如果查询返回了一些警告,则显示警告#5964 [ENHANCEMENT] Remote write:减少系列缓存的内存使用量#5849 [ENHANCEMENT] Remote read:使用远程读取流传输以减少内存使用量#5703 [ENHANCEMENT] Metrics:添加了将远程最大/最小/所需分片写入队列管理器的指标#5787 [ENHANCEMENT] Promtool:在标签查询期间显示警告#5924 [ENHANCEMENT] Promtool:改进了解析错误规则时的错误消息#5965 [ENHANCEMENT] Promtool:更多提示规则#5515 [BUGFIX] Promtool:修复了由于标签重复而导致记录不一致的问题#6026 [BUGFIX] UI:从不健康的目标访问时,修复了服务发现视图#5915 [BUGFIX] Metrics format:输入短时 OpenMetrics 解析器崩溃#5939 [BUGFIX] UI:避免截断 Y 轴值#6014 更新说明及下载地址

优秀的个人博客,低调大师

React Native 0.61.0 发布,使用 React 编写原生应用

React Native 0.61.0 发布了,这是一个稳定版本,此版本带来的一些主要变化如下: 全新的热加载体验,称为“快速刷新”(Fast refresh)。它是默认开启的,可以在开发人员菜单下访问。敬请期待在即将发布的博客文章中有关此功能的更多详细信息。 React 版本已更新至 16.9-0ccedf3 通过 use_frameworks 更好地支持 CocoaPods 更新说明及下载地址

优秀的个人博客,低调大师

Prometheus 2.12 发布,Go 编写的服务监控系统

服务监控系统 Prometheus 2.12已发布,Prometheus 是一个 Go 语言开发的开源的服务监控系统和时间序列数据库。该版本引入了一些新特性,比如记录其他组件、增强功能和修复 bug,这些都是为了提高可用性。 Prometheus 2.12 是跟踪日志文件中的 Active PromQL 查询的第一个版本。查询以 JSON 格式写入 mmaped 文件,并在完成后删除。如果软件崩溃,在故障发生时激活的查询将在 stdout 上重新运行。 具体内容如下: 跟踪日志文件中当前活动的 PromQL 查询 启用并提供 MIPS 64/mips64le 架构的二进制文件 提高目标 web UI 和 API 端点的响应能力 更精确地刷新 TSDB 页面 添加 Prometheus_TSDB_RENTITY_DEBCES 度量 在启动时添加日志记录 提高 TSDB 内存利用率 修复在远程读取中检查重复标签名称的问题 修复当显示不同步服务器时间警告时的 JavaScript 错误 修复仅在发现检查点号时检查最后一个目录的问题 修复 Wal 观察者辅助函数中的错误传播 正确处理警报模板中的空标签 更新日志: https://github.com/prometheus/prometheus/releases/tag/v2.12.0

优秀的个人博客,低调大师

React Native 0.60.5 发布,使用 React 编写原生应用

React Native 0.60.5 发布了,这是一个补丁版本,更新内容如下: 新增 为新项目添加了默认的 Prettier 配置 (f4d5e8cby@jpdriver) Android 将 showSoftInputOnFocus 添加到 TextInput (b476ca0) 变动 CLI 更新至^2.6.0 (72473c7by@thymikee) 修复 确保使用正确版本的 Metro bundler(0.54.1) (1bb197aby@kelset) Android 在发布版本中修复 Android 中的 ClassNotFound 异常 (ffdf3f2by@thecodrr) 运行 JS 服务器时删除不必要的标志 (5a4fac7by@thecodrr) 在 android 上正确设置边框半径 (feb931fby@cabelitos) 修复 Android 上辅助功能标签末尾添加逗号的问题 (812abfdby@marcmulcahy) iOS 不要在 App Extension 中调用 sharedApplication (683908dby@zhongwuzw) 删除 fishhook (95c747eby@mmmulani) 更新说明及下载地址

优秀的个人博客,低调大师

10 个实战及面试常用 Shell 脚本编写

注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格;多加注释说明。 3)命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。 4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域。 5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。 6)写脚本一定先测试再到生产上。 1 获取随机字符串或数字 获取随机8位字符串: 获取随机8位数字: cksum:打印CRC效验和统计字节 2 定义一个颜色输出字符串函数 function关键字定义一个函数,可加或不加。 3 批量创建用户 4 检查软件包是否安装 5 检查服务状态 6 检查主机存活状态 方法1:将错误IP放到数组里面判断是否ping失败三次 方法2:将错误次数放到FAIL_COUNT变量里面判断是否ping失败三次 方法3:利用for循环将ping通就跳出循环继续,如果不跳出就会走到打印ping失败 7 监控CPU、内存和硬盘利用率 1)CPU 借助vmstat工具来分析CPU统计信息。 2)内存 3)硬盘 8 批量主机磁盘利用率监控 前提监控端和被监控端SSH免交互登录或者密钥登录。 写一个配置文件保存被监控主机SSH连接信息,文件内容格式:IP User Port 9 检查网站可用性 1)检查URL可用性 使用方法:check_url www.baidu.com 2)判断三次URL可用性 思路与上面检查主机存活状态一样。 10 检查MySQL主从同步状态 本章写的Shell脚本例子都比较实用,在面试题中也经常出现,希望大家参考着多动手写写,不要复制粘贴就拿来跑,这样是学不会的! 欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

优秀的个人博客,低调大师

Java编程——编写高质量代码的思考

前言 最近在看《代码大全》,可以说是一本软件开发的百科全书,特别厚,但是干货也很多。平时写代码,代码规范是一个最低的要求(很多老代码连最低要求都达不到),为什么要这样规定代码要这么写,而不是那么写?这是一个值得深究的问题。而不是说我照着代码规范写代码就算完了,高质量的代码是一个专业工程师的追求。要知其然知其所以然,最近写发票解析的代码,因为涉及带解析PDF的算法,复杂度比较高,所以花了很多时间在重构,学以致用的时候积累了一些心得。 信息隐藏原则 信息隐藏是面向对象设计的一个原则,是对封装和模块化的一个更高维度的概括。从Java的整个访问限制设计就体现了信息隐藏的原则,各种访问修饰符:public,protect,private,在类设计的时候,我们就要决定什么暴露给外部,什么隐藏起来。 举一个例子下面的代码表示一个有自增ID的Person类。 上面的类设计有什么问题呢?它违反了信息隐藏的原则,直接将ID分配的方式暴露了,这会给后面的维护带来很多问题:当你想给id的范围做出限制的时候怎么办?当你在所有代码中使用++G_MAX_ID分配ID时突然需要修改ID分配的算法怎么办?是不是需要去改所有++G_MAX_ID出现的地方?更好的设计是将ID的分配算法隐藏起来。 咋一看只是将++G_MAX_ID写到一个方法里面而已,但是它隐藏了ID分配的算法,让调用者不需要关心里面的实现,同时控制了变化,不管ID分配算法怎么变,都不会影响其他的代码。调用者了解的信息越多,受到的影响就越大,信息隐藏可以降低复杂度,控制变化的范围。 上面的例子只是信息隐藏的一个简单应用,下面我们来举几个其他的应用例子: 为什么不推荐使用魔法值(即未经定义的常量)?:这个明显违反了信息隐藏的原则,当你将字面量直接写在代码里面时,就将信息直接暴露了,后面需要修改的时候,一旦少改了某个地方的字面量,bug就出现了。 循环依赖(即A调用B,B调用A的情况):类或方法之间的循环依赖会破坏信息隐藏,一个很直接的影响就是在测试的时候,A,B都需要同时准备好才能进行测试,而无法mock任意一方。 使用全局变量:这个就不用说了,所有人都可以访问你的时候信息就暴露无疑了,全局变量能不用就不用。 考虑性能损失:有时候我们为了一些性能上的考虑就破坏信息隐藏原则,将一些变量全局化,这样性能提高得不多,维护成本却上升不少,完全是得不偿失。 最后总结一下信息隐藏的好处: 隐藏信息即隐藏了复杂度,降低了编程的负担。 隐藏信息即隐藏了底层变化,以便于在局部控制变化。 一些不太常见的编程技巧 函数(function)与过程(procedure)的选择 我们先来看看函数与过程区别: Function:有返回值的方法 Procedure:没有返回值的方法 平时我们编程其实没有太区别函数与过程,什么时候用函数,什么时候用过程其实没有过多的考虑,感觉都可以用。一个选择的规则就是当你的方法的目的是想返回跟你方法名称相符的值的时候用函数,否则用过程 举个例子,我看过很多XXProcessor接口里面的方法都是XX process(),严格来讲,这样的命名是不符合上面的规则的,process是一个没有含义的命名,但是却有返回值,如果没有返回值那它的命名才是合理的。 当然了,上面的规则仅供参考,世事无绝对,具体情况具体分析,当你不清楚用函数还是用过程的时候,可以参考这个规则。 使用boolean值来给程序做注释 相信大家看到一个if语句有很多条件的时候都会特别头痛,因为很难理解。例如下面的例子: 但如果换成下面的写法,用boolean值的名字来给if语句注释,看起来就很好理解了。 总结 怎么写高质量的代码是一个很大的话题,这里只是抛砖引玉,其实面向对象设计的很多原则都能够给我们写代码的时候提供指导,写代码的时候要时刻记得学以致用,而不是敷衍了事,专业的软件工程师必然要能写得一手好代码。 如有不同意见,欢迎留言探讨,如对本文感兴趣,欢迎关注笔者,笔者持续更新。

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

JDK

JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。