首页 文章 精选 留言 我的

精选列表

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

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语句注释,看起来就很好理解了。 总结 怎么写高质量的代码是一个很大的话题,这里只是抛砖引玉,其实面向对象设计的很多原则都能够给我们写代码的时候提供指导,写代码的时候要时刻记得学以致用,而不是敷衍了事,专业的软件工程师必然要能写得一手好代码。 如有不同意见,欢迎留言探讨,如对本文感兴趣,欢迎关注笔者,笔者持续更新。

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

如何编写稳定流畅的iOS移动端应用

不忘初心 在过去几年间,移动应用以雷霆之势席卷全球。我们在工作和休闲时间中使用互联网的方式,已经随着移动应用的前进脚步发生了变革。在开发应用的时候,人们也开始考虑“移动优先”的做法。我们正在面对全新一代的移动设备,诸如可穿戴设备或众多移动配件——正是它们构成了“万物互联”的世界。我们将面对全新的用户界面,通过它们数据展示及指令接收处理。同时,我们还将看到,越来越多的公司将真正地践行“移动优先”的思路。而在未来数年中,这一切都将影响我们设计、开发和测试软件的方式。 把一个客户端做得稳定、无奔溃、流畅,是写客户端朋友的梦想,但是,我们面临的结果往往是不如人意的。天下武功,唯快不破。很多公司都信奉这个教条。恨不得把app开发周期压缩到最低,这就导致了开发中隐藏了很多问题。有点经验的工程师草率的优化一下,更糟的情况是那些没有经验的工程师甚至不会对app进行任何优化,这将会使情况变的更糟。 十年前,移动设备的硬件资源是非常有限的.甚至连浮点数都是被禁止的.因为浮点数能导致计算的速度变慢。科技发展如此迅速的今天,硬件很大程度上可以弥补软件的短板。但是硬件的进步终究无法掩饰软件的不足,这也是写这篇文章的初心。 移动端关注要点 在程序开发中,测试是必不可少的。移动端测试按大的类型划分可以分为白盒测试和黑盒测试。 白盒测试一般是由开发人员使用编码的方式进行。测试者需要接触程序的内部代码;而黑盒测试可以在不知道程序内部结构和代码的情况下进行。 下面是主要的测试流程了: 冒烟测试:在软件测试中,冒烟测试是指快速验证APP的主要功能(例如:微信的登陆、退出、发消息等功能) 。如果没有发现问题,再进行更加深入的测试工作;如果发现有问题,就说明APP有重大缺陷。 功能测试:功能测试也叫行为测试,需要根据测试用例来验证应用预期的功能有没有实现。 自由探索式测试:尝试边界条件、输入特殊符号、异常网络环境、突然中断程序等操作 。功能测试的目的是验证正常的功能有没有实现,而自由探索测试的目的就是为了试试应用在极端的操作下会不会出现问题。探索式测试就是要找到能让应用出错的操作。 回归测试:对之前使用我们的服务测试过的应用,将案例复测一遍。 移动端关注的一些指标 运行多少小时不崩溃; 多次打开页面,控制崩溃率; 界面优化,如何才能让用户不急躁、不烦躁; 服务器没有返回数据,是否会导致奔溃; 网络不好,数据来的太慢,界面是否不流畅; 从数据库读的数据太慢如何解决等。 移动端界面应该有自己的逻辑,需要网络数据的地方,应该有默认值,这样在网络数据没有返回的情况下,让用户有数据可以看到。收到的网络数据应该是通过某种方式刷新到界面,而不是等到数据返回才刷新页面。当没有网络数据的时候,界面应该可以自成一体,走的通流程,不强依赖网络数据。 在弱网模式下调试是我们必备的功力,因为我们要考虑用户的实施环境通常都不会很好。把经常使用的数据,存到缓存,提高APP的运行效率、界面流程度。同时,我们需要具备收集奔溃日志的功能,这样才能更好的减少崩溃,提高用户体验。 界面卡顿产生的原因和解决方案 iOS界面处理是在主线程下进行的,系统图形服务通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次刷新信号到来时显示到屏幕上。显示器通常以固定频率进行刷新,如果在一个刷新时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。CPU 和 GPU 不论哪个阻碍了显示流程,都会造成掉帧现象。 CPU 造成的资源消耗有以下几种: 对象创建 对象调整 对象销毁 布局计算 Autolayout 文本计算 文本渲染 图片的绘制和解码 GPU 资源消耗有下面几种情况: 纹理的渲染 视图的混合 (Composing) 图形的生成等 具体可以参考这篇文章 用 Instruments 来检验你的app 时间事件查看器-Time Profiler 在xcode的菜单中选择 product->Profile 我们会看到下面的界面: 点击Time Profiler进入。 下面我们来深究如下的控制面板: 以下介绍下配置选项: Separate by Thread: 每个线程应该分开考虑。只有这样你才能揪出那些大量占用CPU的"重"线程。 Invert Call Tree: 从上倒下跟踪堆栈,这意味着你看到的表中的方法,将已从第0帧开始取样,这通常你是想要的,只有这样你才能看到CPU中话费时间最深的方法.也就是说FuncA{FunB{FunC}} 勾选此项后堆栈以C->B-A 把调用层级最深的C显示在最外面。 Hide System Libraries: 勾选此项你会显示你app的代码,这是非常有用的. 因为通常你只关心cpu花在自己代码上的时间不是系统上的。 Flatten Recursion: 递归函数, 每个堆栈跟踪一个条目。 Top Functions: 一个函数花费的时间直接在该函数中的总和,以及在函数调用该函数所花费的时间的总时间。因此,如果函数A调用B,那么A的时间报告在A花费的时间加上B.花费的时间,这非常真有用,因为它可以让你每次下到调用堆栈时挑最大的时间数字,归零在你最耗时的方法。 找到Detail面板里最耗时的进程,点击进去可以看到代码,观察是否有异,如此便可逐步优化应用的运行效果了。 修改好后,在仪器重新运行该应用程序Product—Profile(或I-记住,这些快捷键真的会为您节省一些时间)。 分配工具 这个时候你会发现两个曲目。一个叫(分配)Allocations,以及一个被称为VM Tracker(虚拟机跟踪)。 内存泄漏有两种泄漏。第一个是真正的内存泄漏,一个对象尚未被释放,但是不再被引用的了。因此,存储器不能被重新使用。第二类泄漏是比较麻烦一些。这就是所谓的“无界内存增长”。这发生在内存继续分配,并永远不会有机会被释放。如果永远这样下去你的程序占用的内存会无限大,当超过一定内存的话 会被系统的看门狗给kill掉。 内存警告是ios处理app最好的方式,尤其是在内存越来越吃紧的时候,你需要清除一些内存。内存一直增长其实也不一定是你的代码出了问题,也有可能是UIKit 系统框架本身导致的。 自己动手观察下,一切自然明了。 内存泄露 这一类泄漏是前面提到的 - 当一个对象不再被引用时出现的那种,检测泄漏可以理解为一个很复杂的事情,但泄漏的工具记得已分配的所有对象,通过定期扫描每个对象以确定是否有任何不能从任何其他对象访问的。 关闭仪器,回到Xcode和选择Product->Profile 点击进入,运行: 自己动手尝试下,找到右边面板里,如果有黑色标识的方法,进入看看。学习就是多尝试。 本文转自ljianbing51CTO博客,原文链接: http://blog.51cto.com/ljianbing/1864101,如需转载请自行联系原作者

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

Akka 2.10.3 发布,Scala 编写的 Actor 模型开发库

Akka 2.10.3 现已发布,具体更新内容包括: feat:从 EventEnvelope 中删除特定元数据的 API#32664 feat:虚拟线程执行器支持#32689 feat:RetrySettings#32687 修复:缺少 actor system provider的重试功能#32690 文档:修复损坏的示例#32667#32668 文档:修复 Java Effect.reply 和 Effect.asyncReply 的标签#32669 chore:跳过 ReachabilityChanged 的​​logging#32670 升级:Netty 4.1.118#32666 文档:检查许可证密钥是否有效#32671 升级:jackson-core、jackson-databind 2.17.3(原为 2.17.2)在#32611 升级:logback-classic 1.5.17(原为 1.5.16)#32675 升级:commons-codec 1.18.0(原为 1.17.2)#32676 升级:sbt,scripted-plugin 1.10.10(原为 1.10.7)#32679 升级:jul-to-slf4j、log4j-over-slf4j、... 2.0.17(原为 2.0.16)#32680 升级:netty-handler、netty-transport 4.1.119.Final(原为 4.1.118.Final)#32677 升级:lmdbjava 0.9.1(原为 0.9.0)#32678 文档:显示检索密钥到期的实际方法#32672 文档:更新 cluster sharding 页面中的视频链接#32682 文档:Paradox Theme 24.10.7(forum link)#32685 chore:默认许可证签发者为“Akka” #32686 chore:更新 mima latestPatch#32663 chore:Java API for AsyncCallback#invokeWithFeedback#32673#32674 chore:License change date 和 sample bump for 2.10.3#32693 详情可查看更新说明 :https://github.com/akka/akka/releases/tag/v2.10.3

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

初三学生编写网页版 Windows 12

一名初三学生用前端开发三件套 —— HTML+CSS+JavaScript 实现了一个网页版的 Windows 12。 他表示在网上看到 Windows 12 概念版 (Powered by PowerPoint) 后深受启发,因此决定做一个 Windows12 网页版。 项目亮点: 精美的 UI 设计 流畅丰富的动画 各种高级的功能(相较于网页版) 在线体验:https://tjy-gitnub.github.io/win12/desktop.html GitHub 地址:https://github.com/tjy-gitnub/win12 效果展示: 作者为该项目制定了路径规划: 基本功能与应用 外观整体优化 加入特效 窗口功能 应用完善 添加更多个性化方面的设置 添加Edge应用 为更多应用添加标签页 完善小组件,添加到桌面等功能 动态壁纸 更多任务栏的自定义 丰富应用生态,添加 Microsoft Store 完善设置及 Windows 更新 以及一些“畅想”: 建立文件系统 建立自己的可执行文件机制 将exe文件转化并执行 提供更多api供应用调用 内置浏览器内核,成为应用 将项目更名为 "Windows 12" 封装到Windows系统中 将启动程序设为此应用 去除多余系统功能,封装成独立的操作系统 将项目更名为 "Doswin 1.0" 适配量子计算机 接入chatgpt 将项目更名为 "550W" 作者还说道,因为自己已经上初三了,未来会有很长一段时间因太忙而无暇顾及项目,所以暂时把项目交给了贡献者进行维护。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

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

用户登录
用户注册