当前位置: 首页 > news >正文

重构(二)

继续"提高代码质量"

接着上文提高代码质量, 需要从这几个特点入手

1、代码重用性。2、可读性。3、可扩展性。4、可靠性。5、高内聚,低耦合。

仅仅就"可读性"去分析一下吧, 毕竟例子实在是太多了

递归的"可读性"不如while循环

递归的可读性很差, 虽然短小的递归也能读懂, 但是能用while循环去写程序, 更容易理解

观察者模式导致"可读性"更差

如果两个对象能直接调用就直接调用, 如果非要使用观察者模式监听另外一个对象, 就是给自己找麻烦. 有时候观察者模式能实现解耦的功能和监听的功能, 除此以外, 不同模块之间使用观察者模式通信, 让可读性更差. 典型的模块间使用观察者的例子有, 广播通信, Eventbus, LiveData. 如果模块之间能直接调用, 还要借助平台工具, 一定要有必要的理由.

日志打印可读性

我日志一般这种方式打印

Log.d(“ClassName”, “methodName paramName: $paramName”)

结合过往经验, 这样打印根据日志调查问题会更轻松. 一目了然.
高频的日志要用verbose级别去打印, 也就是Log.v(), 这样方便开发者过滤掉高频日志, 只看d级别以上的, 开发者尽量不用Log.e()去打印, 因为这会让日志爆红, 不方便查看系统的重要日志, 开放给开发者的最好是用debug info级别的, warn和assert不用也没关系
当然真养成这样的习惯, 看别人的代码和日志会感觉别扭, 尽量"严以律己, 宽以待人", 毕竟大家都是混口饭吃, 谁都不是老板

typo问题的可读性

集成开发环境通常会提示拼写错误, 如果确定是"专属名词"也可以让IDE避免提示, 经常为了提高效率而选择粗略的根据命名搜索过滤, 这样有可能忽略掉有些代码. typo问题已经是很低级的问题了, 因为编译器会提醒

重构本身就需要有能区别好坏代码的能力

罗翔曾经说"希望自己的孩子有分清什么是Good的能力", 他没有说"好", 而是用"Good"也就是说, 他眼中的Good不是传统意义的好.
软件程序常常讲"最佳实践", 这就是Good. 通常不会为一个可能半年就会改掉的类精心设计, 因为精心设计一个临时的类反而不是最佳实践.
区分Good和不Good是要有"评价能力", 评价本身会得罪人, 评价又属于较真的一类行为. 所以在不较真的中国文化, 这个话题不能和人聊. 记得很久以前和一个后端同事聊, 定义一个类型是用int还是用string, 后来我们得出答案, 以前的机器存储比较贵, 能用int就不用string, 现在的存储不贵, 用string表示类型增加"可读性". 但是这个结论不能分享给不在同一个层次思考的人. 大多数人思考的层次还是"完成需求"而不是"最佳实践"
跟不同思考层次的人聊天, 不仅聊不出结果, 还能聊出误解, 在只为实现功能的人眼中, 如果给他说他写的代码不是最佳实践, 他就会说他"这是很正常的操作". 举个例子, 不要给不同功能的函数起一样的名字, 哪怕他们在不同的类, 只要两个类有关联, 仅仅为了阅读的时候能够"一次性根据名字懂得它的实际功能", 因为方法的注释不一定及时的被维护. 为了软件在逐渐庞大的过程中能够保证不腐烂, 这些细微之处的"最佳实践"在复用率比较高的代码里是必要的.
对于我自己而言, 阅读别人的代码有时候代入自己的"思维惯性"可能会导致忽略别人糟糕的设计埋下的隐患. 以为所有人都像自己那样把容易出问题的地方写的更加详细更加清晰, 就会察觉到别人是真的不在乎细节处理. 这大概就是事务的两面性,

每天把自己收拾的干干净净的人可能会觉得别人的打扮会别扭. 反倒是不在乎外表的人看谁都顺眼.

可能垃圾代码更适合职场

和网友讨论过屎山, 摘录大家的看法

  1. 迭代快, 赚钱快. 慢了的话 屎都吃不上一口热的
  2. 国内架构和技术经理都被优化了
  3. 屎山有助于保持就业率
  4. 很多领导怕被替代, 故意搞成别人很难掌握的屎山. 不是能力不行
  5. 现在付出的成本就是以后的收益(这是反对屎山的)
  6. 软件分为两种, 一种是业务型, 一种是工具型(暗指有的工具类还是认真一点写)
  7. 越是屎山别人越无法接手
  8. 规避不了熵增的问题, 最终都会变成一坨屎山
  9. 你想想你连屎山都搞不定, 说明自己的能力还不如屎山程序员
  10. 说屎山只有一种可能, 自己看不懂, 能看懂的代码都不是屎
  11. 很多时候是需求变更导致的, 所谓重构无非就是把别人的屎山变成他自己的屎山, 而且公司还有比他代码水平更差的, 但是人家是公司的老员工, 他不敢说什么

相关文章:

重构(二)

继续"提高代码质量" 接着上文提高代码质量, 需要从这几个特点入手 1、代码重用性。2、可读性。3、可扩展性。4、可靠性。5、高内聚,低耦合。 仅仅就"可读性"去分析一下吧, 毕竟例子实在是太多了 递归的"可读性"不如while循环 递归…...

centos7下制作DockerFile 镜像

文章目录 介绍DockerFile 常用命令示例1.创建Dockerfile文件2.构建Dockerfile镜像3.验证结果 小结 介绍 Dockerfile 是一个文本文件,包含了用于构建 Docker 镜像的所有命令和指令。它定义了镜像的构建过程,包括基础镜像、安装软件、设置环境变量、复制文…...

GFPS扩展技术原理(七)-音频切换消息流

音频切换消息流 Seeker和Provider通过消息流来同步音频切换能力,触发连接做切换,获取或设置音频切换偏好,通知连接状态等等。为此专门定义了音频切换消息流Message Group 为0x07,Message codes如下: MAC of Audio s…...

压缩qcow2镜像带来的性能损失简单分析

本文拟对压缩qcow2镜像所带来的虚拟机性能损失进行简单分析 背景 生产中发现使用压缩镜像启动的虚拟机开机总是会慢一些。 qcow2镜像的压缩方式为:qemu-img convert -p -c -O qcow2 zero_disk.qcow2 compress_disk.qcow2 分析 qemu代码:https://down…...

Kali操作系统简单介绍

Kali是一个集成了各种安全工具的操作系统 安全问题的根源 1.分层思想:网络和软件开发的分层方法 2.安全问题:分层思想导致的片面认识和系统脆弱性 3.人的因素:安全问题的最终根源是人的错误 传统安全建设 1.防护型安全建设:关闭不…...

LabVIEW物联网开发实战:专栏总述

本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系统的快速开发与原型设计,助你从基础到实战&#xff0…...

高效处理PDF文件的终极工具:构建一个多功能PDF转换器

在日常工作中,处理PDF文件几乎是每个人都不可避免的任务。无论是从PDF中提取数据、合并多个PDF文件,还是处理文件中的敏感信息和图像,PDF文件的处理都可能成为繁琐且耗时的工作。如果你是数据分析师、工程师,或者从事文档管理的工…...

Y3编辑器教程6:触发器进阶案例

文章目录 一、地形制作1.1 地形制作流程1.2 关卡白盒1.3 场景美化1.4 优化场景 二、触发结构三、玩家指引(函数封装)3.1 项目拆解3.2 功能实现3.2.1 绘制UI界面3.2.2 UI的读取显示和刷新3.2.3 交互功能3.2.4 最终实现 四、NPC对话系统4.1 项目拆解4.2 UI…...

react Ant Design

一、通过项目模版创建一个react项目 set NPM_CONFIG_REGISTRYhttps://registry.npmmirror.com pnpm create vite antd-demo cd antd-demo pnpm install pnpm install antd --save 打开项目: 修改:welcome.tsx import React from react; import { Butto…...

汽车电子零部件(14):APA(自动泊车辅助)/RPA(远程遥控泊车)/AVP(自动代客泊车)

APA: Automated Parking Assist (APA) systems,自动泊车辅助系统,是自动驾驶汽车的一个关键功能。自动泊车辅助系统(APA)利用超声波雷达、视觉传感器和ADAS处理器来定位合适的停车位。它识别适合车辆大小的停车位,规划停车路线,并控制方向盘、变速箱和油门踏板以辅助停…...

Hot100刷题计划-Day2-滑动窗口、双指针、数组、链表、动态规划

LeetCode Hot 100 是最常被考察的题目集合,涵盖了面试中常见的算法和数据结构问题。刷 Hot100可以让你在有限的时间内集中精力解决最常考的问题。不仅要写出代码,还要理解问题的本质、优化解法和复杂度分析。 滑动窗口 438. 找到字符串中所有字母异位词…...

[react 3种方法] 获取ant组件ref用ts如何定义?

获取ant的轮播图组件, 我用ts如何定义? Strongly Type useRef with ElementRef | Total TypeScript import React, { ElementRef } from react; const lunboRef useRef<ElementRef<typeof Carousel>>(null); <Carousel autoplay ref{lunboRef}> 这样就…...

考前倒计时98天

2024年12月21日到2025年3月29日共有 98​ 天 一、计算机基础 思维分类特征强调学科代表理论思维&#xff08;推理思维&#xff09;推理和演绎推理数学实验思维&#xff08;证实思维&#xff09;观察和总结自然规律归纳物理学计算思维&#xff08;构造思维&#xff09;设计和构造…...

iterm2 focus时灰色蒙层出现的解决办法

问题描述&#xff1a; 当前我的iterm2版本是3.5.10&#xff0c;是我最近才更新的&#xff0c;然后就出现以下页面显示问题&#xff0c;如图所示&#xff1a; 我个人对终端、编辑器等使用存在洁癖&#xff0c;尤其是页面显示效果不满意更是不能忍受&#xff0c;之前找了很久没有…...

合并K个升序链表(最优解)

题目来源 23. 合并 K 个升序链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,…...

kubernates实战

使用k8s来部署tomcat 1、创建一个部署&#xff0c;并指定镜像地址 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre82、查看部署pod状态 kubectl get pods # 获取default名称空间下的pods kubectl get pods --all-namespaces # 获取所有名称空间下的pods kubect…...

How to run Flutter on an Embedded Device

basysKom GmbH | How to run Flutter on an Embedded Device https://github.com/sony/flutter-embedded-linux/wiki/Building-Flutter-Engine-from-source flutter源码下载(最新)-CSDN博客 flutter_engine 交叉编译【自定义编译器(最新)】_flutter。engine 修改-CSDN博客 …...

airflow docker 安装

mkdir -p /root/airflow cd /root/airflow && mkdir -p ./dags ./logs ./plugins ./configcd /root/airflow/ wget https://airflow.apache.org/docs/apache-airflow/2.10.4/docker-compose.yaml nano docker-compose.yamlAIRFLOW__CORE__LOAD_EXAMPLES: false #初始化…...

浅析InnoDB引擎架构(已完结)

大家好&#xff0c;我是此林。 今天来介绍下InnoDB底层架构。 1. 磁盘架构 我们所有的数据库文件都保存在 /var/lib/mysql目录下。 由于我这边是docker部署的mysql&#xff0c;用如下命令查看mysql数据挂载。 docker inspect mysql-master 如下图&#xff0c;目前只有一个数…...

华为云计算HCIE笔记02

第二章&#xff1a;华为云Stack规划设计 交付总流程 准备工作&#xff1a;了解客户的基本现场&#xff0c;并且对客户的需求有基本的认知。 HLD方案BOQ报价设备采购和设备上架 2.安装部署流程 硬件架构设计 硬件设备选配 设备上架与初始化配置 准备相关资料&#xff08;自动下载…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...