《设计模式之美》- 总结

《设计模式之美》- 总结

代码质量评判标准以及实现工具


第一章 概述

1.1 为什么学习代码设计

  1. 编写高质量的代码
  2. 应对复杂代码的开发
  3. 程序员的基本功
  4. 职业发展的必备技能

1.2 如何评价代码的质量

1.2.1 可维护性
可维护性代码的特性:代码简洁、可读性好、可扩展性好代码分层结构清晰、模块化程度高、高内聚低耦合、遵守基于接口而非实现编程的设计原则等还有跟项目的代码量、业务的复杂度、技术的复杂度、文档的全面性和团队成员的开发水平等因素有关
1.2.2 可读性
可读性的评判标准代码是否符合代码规范,比如命名是否达意、注释是否详尽、函数长度是否合适、模块划分是否清晰、代码是否高内聚、低耦合
1.2.3 可扩展性
评判标准指的是在不修改或少量修改原有代码的情况下,能够通过扩展方式添加新功能代码。是指在编写代码时预留了一些功能扩展点,可以把新功能直接插入扩展点,而不会因为添加新的功能代码而改动大量的原始代码。
1.2.4 灵活性
评判标准代码易扩展、易复用、或者易用,一般认为这段代码写的很灵活。
1.2.5 简洁性
简洁、清晰是写代码的首要原则,思从深而行从简,编程高手往往能用简单的方法解决复杂的问题。	
需要遵循KISS原则
1.2.6 可复用性
含义:尽量减少重复代码的编写,复用已有的代码继承、多态的目的之一是提高代码的复用性;单一职责原则与代码的复用性相关;解耦、高内聚和模块化等能提高代码的可复用性;是很多设计原则、设计思想和设计模式等所要实现的最终效果;
1.2.7 可测试性
代码的可测试性低,难以编写单元测试;

1.3 如何编写高质量代码

1.3.1 面向对象设计范式
四大特性:封装、抽象、继承、多态
面向对象和面向过程的区别
面向对象分析、面向对象设计、面向对象编程
接口和抽象类的区别,以及各自的应用场景
基于接口编程而非基于实现编程
多用组合、少用继承
面向过程的‘贫血’模型、面向对象的‘充血’模型
1.3.2 设计原则
设计原则是心法、设计模式是招式;
设计原则比设计模式普适、重要;
只有掌握了设计原则,才能清楚地了解为什么使用某种设计模式,并且恰到好处地应用设计模式,甚至可以创造新的设计模式;
九种原则:1、单一职责原则(SRP);2、开闭原则(OCP);3、里氏替换原则(LSP);4、接口隔离原则(ISP);5、依赖反转原则(DIP);6、KISS原则7、YAGNI原则8、DRY原则9、LoD原则
1.3.3 设计模式
大部分设计模式解决的是代码的解耦、可扩展性的问题;
重点需要掌握可以解决什么问题、典型的应用场景,并且不过度使用;
分三类:创建型、结构型、行为型;
学习设计原则和设计规范,需要融入很多的个人理解和思考;
1.3.4 代码规范
主要解决代码的可读性问题;
命名规范、注释规范等;
1.3.5 重构技巧
代码重构的工具:面向对象的编程范式、设计原则、设计模式、代码规范;
1、重构的目的、对象、时机、方法;
2、保证重构不出错的手段:单元测试、以及代码的可测试性;
3、大重构(大规模、高层次)、小重构(小规模、低层次);

面向对象编程、设计原则、设计模式、代码规范和重构技巧之间的关系

1、面向对象因其丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,所以,它是很多设计原则、设计模式编程实现的基础;
2、设计原则是指导代码设计的一些经验总结,是代码设计的心法,指明了代码设计的大方向。相比设计模式,它更普适;
3、设计模式是针对软件开发中经常遇到的一些设计问题二总结的一套解决方案或设计思路。应用设计模式的主要目的是解耦,提高代码的可扩展性。从抽象角度上来讲,设计原则比设计模式更抽象。设计模式更加具体,更加容易落地执行。
4、代码规范解决的是代码的可读性问题,更加具体、更加偏重代码细节和更加容易落地执行。持续小重构的理论依据就是代码规范。
5、重构是保持代码质量不下降的有效手段,依靠的是面向对象编程范式、设计原则、设计模式、代码规范。总结:
1、面向对象编程范式、设计原则、设计模式、代码规范、重构是保持或提高代码质量的方法论、指导思想,本质上都是服务于编写高质量代码。
2、如何才能熟练掌握以上方法:掌握理论知识、刻意的训练,最重要的是具备代码质量意识。
3、代码设计的方法:多思考未来有哪些扩展需求、哪部分代码是会变的、哪部分代码是不变的;

1.4 如何避免过度设计

1.4.1 初衷:提高代码质量
思考点:
为什么要这样设计、为什么要用这种设计模式、这样做是否能真正提高代码质量、能够提高代码哪些方面的质量;
如果回答不了上面的问题,基本上就是过度设计。
1.4.2 原则:先有问题,后有方案
分析代码现有问题的方法:
1、分析代码存在的痛点:比如可读性不高、可扩展性不高等;
2、有针对性地利用设计模式、设计原则对代码进行改善,不可随意套用;
1.4.3 代码设计的应用场景是复杂代码
应用设计模式的目的是解耦,解耦的目的是应对代码的复杂性问题。代码不复杂就没必要引入设计模式。
数据结构和算法应对的是大规模数据的问题。
1.4.持续重构可有效避免过度设计
设计模式可以提高代码的可扩展性,但是会降低代码的可读性;
持续重构,当有真正的痛点时,再考虑使用设计模式来解决,而不是一开始就为不一定实现的未来需求而应用设计模式;
在模棱两可时先不使用设计模式,当代码持续演进到足够复杂,如果不适用它就需要改动很多代码,这时才可以使用它;
能不用就不用,遵循KISS原则;
1.4.5 不要脱离具体的场景谈代码设计
脱离业务谈架构是不切实际的;
要重视分析问题能力和解决问题能力的锻炼;
能够分析代码的优秀之处和不足之处,并说明原因,以及要知道如何改善代码;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven问题汇总

​ 1、报错 failed to transfer from http://0.0.0.0/ during a previous attempt. com.byd.xxx:xxx-parent:pom:1.1.0-SNAPSHOT failed to transfer from http://0.0.0.0/ during a previous attempt. This failure was cached in the local repository and resolution is no…

【Pytorch】PytorchCPU版或GPU报错异常处理(10X~4090D)

Pytorch为CPU版或GPU使用报错异常处理 文章目录 Pytorch为CPU版或GPU使用报错异常处理0.检查阶段1. 在conda虚拟环境中安装了torch2.卸载cpuonly3.从tsinghua清华源安装不完善误为cpu版本4.用tsinghua清华源安装成cpu错误版本5.conda中torch/vision/cudatoolkit版本与本机cuda版…

LeetCode - 283.移动零

题目链接&#xff1a; LeetCode - 283.移动零 题目分析&#xff1a; ​​​​​ 题解代码&#xff1a; #include<iostream> #include<vector> using namespace std;class Solution { public:void moveZeroes(vector<int>& nums) {for (int cur 0, des…

【GitBlit】Windows搭建Git服务器详细教程

前言 如果公司或个人想在 Windows 环境下搭建私有的 Git 服务器&#xff0c;那么这个开源的 GitBlit 是一个不错的选择。 Gitblit 是一个开源纯 Java 的用于管理、查看和服务 Git 存储库。它是一个小型的托管集中式存储库工具。支持 SSH、HTTP 和 GIT 协议&#xff0c;开箱即…

Java+springboot开发的医院智能导诊服务系统源码 自动兼容小程序与H5版本

智能导诊系统 一、什么是智慧导诊系统&#xff1f; 智慧导诊系统是一种医院使用的引导患者自助就诊挂号、精准推荐科室、引导患者挂号就诊的系统。该系统结合医院挂号及就诊的HIS系统&#xff0c;为患者带来全流程的信息指引提醒&#xff0c;可以在全院区构建一个精细化、移动…

IP-guard getdatarecord 存在任意文件读取

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 IP-guard是由溢信科技股份有限公司开发的一款终端安全管…

x-cmd ai | x openai - 用于发送 openai API 请求,以及与 ChatGPT 对话

介绍 Openai 模块是 Openai 大模型 Chatgpt 3 和 ChatGPT 4 命令行实现。x-cmd 提供了多个不同平台间多种 AI 大模型的调用能力。无论是本地模型还是 Web 服务上的模型&#xff0c;用户都可以在不同的 AI 大模型间直接无缝切换&#xff0c;并能把之前的聊天记录发送给新的大模…

CSS3 伪元素与伪类选择器区别、详解与应用实例

伪元素与伪类两者都是通过在选择器后附加一个特定的关键字来定义&#xff0c;遵循相似的语法规则&#xff0c;并在 CSS 规则块中设置相应的样式。伪元素 能够通过 content 属性添加或替换内容。例如&#xff0c;:before 和 :after 可以插入文本、图像或其他生成的内容。伪类 仅…

Tomcat核心组件深度解析

Server组件 Service组件 连接器Connector组件 容器Container组件

【研发管理】产品经理知识体系-产品创新管理

导读&#xff1a; 产品创新管理对企业的发展具有深远的影响&#xff0c;它不仅是企业保持竞争优势的关键&#xff0c;也是推动企业持续稳定发展的重要动力。因此&#xff0c;企业应高度重视产品创新管理&#xff0c;并采取有效的策略和方法来推动产品创新活动的开展。对于产品经…

第20天:信息打点-红蓝队自动化项目资产侦察企查产权武器库部署网络空间

第二十天 一、工具项目-红蓝队&自动化部署 自动化-武器库部署-F8x 项目地址&#xff1a;https://github.com/ffffffff0x/f8x 介绍&#xff1a;一款红/蓝队环境自动化部署工具,支持多种场景,渗透,开发,代理环境,服务可选项等.下载&#xff1a;wget -O f8x https://f8x.io…

MINIO安装的方法(WindowsLiunx)

2 minio安装教程 注&#xff1a;官方中文文档&#xff1a;MinIO对象存储 Windows — MinIO中文文档 | MinIO Windows中文文档 Liunx 安装方&#xff1a;MinIO对象存储 Linux — MinIO中文文档 | MinIO Linux中文文档 2.1 下载地址 https://dl.min.io/server/minio/…

论文笔记:UrbanGPT: Spatio-Temporal Large Language Models

1 intro 时空预测的目标是预测并洞察城市环境随时间和空间不断变化的动态。其目的是预见城市生活多个方面的未来模式、趋势和事件&#xff0c;包括交通、人口流动和犯罪率。虽然已有许多努力致力于开发神经网络技术&#xff0c;以准确预测时空数据&#xff0c;但重要的是要注意…

springboot是什么?

可以应用于Web相关的应用开发。 选择合适的框架&#xff0c;去开发相关的功能&#xff0c;会有更高的效率。 为什么Spring Boot才是你该学的!学java找工作必会技能!在职程序员带你梳理JavaEE框架_哔哩哔哩_bilibili java工程师的必备技能 Spring是Java EE领域的企业级开发宽…

万兆网络的十字路口:电口还是光模块?

&#x1f335;在构建高速、高效的网络系统时&#xff0c;选择正确的连接技术至关重要。万兆电口&#xff08;10GBASE-T&#xff09;和万兆光模块&#xff08;SFP&#xff09;是目前市场上两种主流的高速网络解决方案。它们各有优势&#xff0c;但在不同的应用场景和需求下&…

稀碎从零算法笔记Day54-LeetCode:39. 组合总和

题型&#xff1a;数组、树、DFS、回溯 链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数…

在PostgreSQL中如何进行全文搜索,以及如何优化全文搜索性能?

文章目录 如何进行全文搜索1. 创建全文搜索向量2. 执行全文搜索查询 如何优化全文搜索性能1. 使用GIN索引2. 限制搜索范围3. 优化文本处理4. 使用并发搜索5. 监控和调整配置 在PostgreSQL中&#xff0c;全文搜索通常通过使用tsvector和tsquery类型&#xff0c;以及to_tsvector和…

安居水站:水站经营秘籍:年入30万不是梦。水站创业指南。

在这个快节奏的社会里&#xff0c;初创企业家们总是在寻找一条明路&#xff0c;以在竞争激烈的市场中立足。为了帮助他们更好地实现这一目标&#xff0c;我根据经验决定制定一份水站经营指导手册。这份手册将详细阐述如何从零起步&#xff0c;如何运营&#xff0c;如何进行市场…

制作一个RISC-V的操作系统十二-定时器中断

文章目录 CLINT定时器中断mtimemtimecmp机制总体框架流程时间节拍系统时钟代码 CLINT 产生软件中断和定时器中断 定时器中断 mtime 类似计数器&#xff0c;按照硬件对应的固定频率递增 上电后会自动复位为0&#xff0c;有硬件自动完成 mtimecmp 需要自己设置&#xff0…

Java 多线程加法求和

Java 多线程加法求和 代码 先上代码再上解析&#xff1a; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger;public class Sum implements …