代码大全阅读随笔 (二)
软件设计
设计就是把需求分析和编码调试连在一起的活动。
设计不是在谁的头脑中直接跳出来了,他是不断的设计评估,非正式讨论,写实验代码以及修改实验代码中演化和完善。
作为软件开发人员,我们不应该试着在同一时间把整个程序都塞进自己的大脑,而应该试着以某种方式去组织,以便能够在一个时刻可以专注一个特定的部分。这么做的目的是尽量在任意一时间减少要考虑的程序量。
在软甲架构的层次上,可以通过把真个系统分解成多个子系统,来降低问题的复杂度。人类更容易理解和接受多项简单的信息,而不是一项复杂的信息。所有软件设计技术目标都是把,复杂问题分解成多个简单的问题,减少子系统直接的项目依赖,增加子系统内部的聚合。
保持子程序的短小精悍也能帮助你减少思考负担,从问题领域入手,而不是从底层实现细节入手去编程程序,在最抽象的层次上工作,也能减少人的脑力负担。
编写代码一个评估质量的标准,就是要写出既让自己容易理解,也能让别人看懂,而且很少有错误的程序代码。
如何管理复杂度:
①把任何人在同一时间需要处理的本质复杂度减少到最低。
②不要让偶然性的复杂度无谓的快速增长。
下面列出一些设计范畴内的特征:
①最小复杂度,避免做出聪明的设计,因为聪明的设计常常难以理解。
②易于维护,设计时候为做维护的程序员着想,设计能自明的系统。
③松散耦合,老生常谈的特征,实现方法接口隔离,依赖倒置等等
④可拓展性,明确系统中那些需求是容易发生变化,例如改变一种表现方式,增加一种新的事物等等,在增强系统功能时候,减少或者不影响已有的功能,是最佳的拓展性的表现。
⑤可重用性, do not repeated your self。
⑥高扇入,就是说让大量的类使用某个特定的类。 这说明设计系统很好的利用在较低层次上的工具类 unit.cs
⑦低扇出,就是说让一个类,少量或者适用使用其他类。这样可以降低类与类之间的复杂程序,例如使用中介者模式,使用父类对象,能够很好的处理这类问题。
⑧可移植性
⑨精简性,系统没有多余的部分。要问这个关键的问题:这个虽然简单,但是把它加入之后会损害什么呢?
⑩层次性,尽量保证各个系统各个分解的层次性,能够是你的程序能在任意层面上观察,并得到某种一致的看法。设计出来的系统应该能在任意层次上观察而不需要进入其他层次。
11.标准技术,一个系统所依赖的外来的,越古怪的越多,别人在第一次想要了解它的时候就越头疼。尽量使用标准化,常用的方法,让整个系统给人一种熟悉的感觉。
设计层析
第一层,软件系统
第二层,分解为子系统或者包
为了让子系统的链接简单易于维护,就要尽量简化系统之间的交互关系。最简单的交互关系是让一个子系统去调用另一个子系统中的子程序。稍微复杂一点的交互关系,是在一个子系统中包含另外一个子系统中的类,而最复杂的交互关系是让一个子系统中的类去继承另外一个子系统中的类。但是要注意,系统层次设计图应该是无环图。
第三层,分解为类
把子系统进行适当的分解,并确保分解出的细节恰到好处,能够用单个的类实现。
第四层,分解成子程序
第五层,子程序内部的设计
面向对象设计方法,设计步骤
辨识对象及其属性(方法和数据)
确定可以对各个对象进行的操作
确定各个对象对其他对象的操作方法
确定对象哪些部分对其他对象是可见的,那些是不可见的。
定义每个对象的公开接口
形成一致的抽象
抽象是一种能让你在关注某一概念的同时可以放心的忽略其中一些细节的能力。
基类也是一种抽象,它使你能集中注意力去关注某一组派生类所具有的的共同特性,并在基类的层次上忽略各个具体派生类的细节。一个好的接口也是一种抽象,它能够让你关注接口本省,而不是类的内部工作方式。
封装实现细节
封装是填补类抽象留下的空白,抽象是说:可以让你从高层次的细节来看待一个对象。 而封装则说:除此之外,你不能看到对象的任何其他细节层次。
你能看到的就是你能全部得到的。好的类接口就像冰山的尖一样,让类的大部分内容都不会暴露出来。
循环依赖,一种更隐晦的信息隐藏障碍则是循环依赖,比如A类中子程序调用B类中的子程序,然后B类中的子程序有调用A类中的子程序。要避免形成这种循环依赖,它会让系统难于测试,因为你无法单独测试A类或者B类,
耦合种类:
简单参数耦合,当两个模块之间的通过参数来传递,并且所有的 数据都是简单的数据类型(Primitive data type)的时候,这两个模块之间的耦合关系就是简单参数耦合,这种耦合关系是正常的。
简单对象耦合,如果把模块实例化一个对象,那么他们之间的耦合关系就是简单对象耦合,这种耦合关系也不错。
对象参数耦合,模块1要求模块2传给obj3.那么这两个模块就是对参数对象的耦合,这种耦合关系更为紧密,他要求模块2了解obj3.
语义上的耦合,最糟糕的耦合关系。语义上的耦合是非常危险的,因为更改被调用模块中的代码,可能会破坏调用他的模块,破坏方式是编译器完全无法检查的。
松耦合的关键之处在于,一个有效的模块提供出一层附加抽象,一旦已写好,你就可以当然的去调用它,这样就降低了整体系统的复杂度,是的你可以在同一时间只用关注一件事。如果对一个模块的调用要求你同时关注好几件事,其内部工作细节,对全局数据修改,不确定的功能等,那么就失去了抽象的能力,模块所具有管理复杂度的能力也会虚弱或者完全丧失。
类和子程序是用于降低复杂度的首选和最重要的智力工具,如果他们乜有帮助你简化工作,那么他们就是失职。
设计模式通过把设计对话提升一个更高的曾是上来简化交流,处理在管理复杂度方面的益处之外,设计模式还能够让设计者在更高一层的粒度上进行思考与讨论,从而加速设计交流的过程。
模块化这一概念和信息隐藏,封装以及其他的设计启发密切相关。
关于设计启发的总结:
寻找现实世界的对象,形成一致的抽象,封装实现细节,在可能的情况下继承,信息隐藏,找出容易改变的区域,保持松耦合,探寻通用的设计模式,
下列启发方法有时也很有用:
高内聚,构造分层结构,严格描述契约,分配职责,为测试而设计,避免失误,有意识的选择绑定时间,创建中央控制点,考虑使用蛮力,画一个图,保持设计模块化,
相关文章:
代码大全阅读随笔 (二)
软件设计 设计就是把需求分析和编码调试连在一起的活动。 设计不是在谁的头脑中直接跳出来了,他是不断的设计评估,非正式讨论,写实验代码以及修改实验代码中演化和完善。 作为软件开发人员,我们不应该试着在同一时间把整个程序都塞…...
vue 项目的屏幕自适应方案
方案一:使用 scale-box 组件 属性: width 宽度 默认 1920height 高度 默认 1080bgc 背景颜色 默认 "transparent"delay自适应缩放防抖延迟时间(ms) 默认 100 vue2版本:vue2大屏适配缩放组件(vu…...
23软件测试高频率面试题汇总
一、 你们的测试流程是怎么样的? 答:1.项目开始阶段,BA(需求分析师)从用户方收集需求并将需求转化为规格说明书,接 下来在项目组领导会组织需求评审。 2.需求评审通过后,BA 会组织项目经理…...

PHP8的匿名函数-PHP8知识详解
php 8引入了匿名函数(Anonymous Functions),它是一种创建短生命周期的函数,不需要命名,并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点: 1、创建匿名函数,语法格式如下&…...

Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)
一、Redis是什么 Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、…...

C语言链表梳理-2
链表头使用结构体:struct Class 链表中的每一项使用结构体:struct Student#include <stdio.h>struct Student {char * StudentName;int StudentAge;int StudentSex;struct Student * NextStudent; };struct Class {char *ClassName;struct Stude…...

【深度学习】实验03 特征处理
文章目录 特征处理标准化归一化正则化 特征处理 标准化 # 导入标准化库 from sklearn.preprocessing import StandardScalerfrom matplotlib import gridspec import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings("ignore&quo…...

基于Dpabi的功能连接
1.预处理 这里预处理用Gretna软件进行,共分为以下几步: (1)DICOM转NIfTI格式 (2)去除前10个时间点(Remove first 10 times points):由于机器刚启动、被试刚躺进去也还需适应环境,导致刚开始扫描的数据很…...

在React项目是如何捕获错误的?
文章目录 react中的错误介绍解决方案后言 react中的错误介绍 错误在我们日常编写代码是非常常见的 举个例子,在react项目中去编写组件内JavaScript代码错误会导致 React 的内部状态被破坏,导致整个应用崩溃,这是不应该出现的现象 作为一个框架…...

基于内存池的 简单高效的数据库 SDK简介
基于内存池的 简单高效的数据库 SDK简介 下载地址: https://gitee.com/tankaishuai/powerful_sdks/tree/master/shm_alloc_db_heap shm_alloc_db_heap 是一个基于内存池实现的简单高效的文件型数据存储引擎,利用它可以轻松地像访问内存块一样读、写、增…...

python实例方法,类方法和静态方法区别
为python中的装饰器 实例方法 实例方法时直接定义在类中的函数,不需要任何修饰。只能通过类的实例化对象来调用。不能通过类名来调用。 类方法 类方法,是类中使用classmethod修饰的函数。类方法在定义的时候需要有表示类对象的参数(一般命名为cls&#…...
Pyecharts教程(四):使用pyecharts绘制3D折线图
Pyecharts教程(四):使用pyecharts绘制3D折线图 作者:安静到无声 个人主页 目录 Pyecharts教程(四):使用pyecharts绘制3D折线图准备工作数据准备绘制3D折线图推荐专栏在这篇文章中,我们将学习如何使用pyecharts库来绘制一个3D折线图。pyecharts是一个用于生成Echarts图表的…...

【stable-diffusion使用扩展+插件和模型资源(下)】
插件模型魔法图片等资源:https://tianfeng.space/1240.html 书接上文:(上) 插件推荐 1.lobe theme lobe theme是一款主题插件,直接可以在扩展安装 界面进行了重新布局,做了一些优化,有兴趣的…...

一文了解SpringBoot中的Aop
目录 1.什么是Aop 2.相关概念 3.相关注解 4.为什么要用Aop 5.Aop使用案例 1.什么是Aop AOP:Aspect Oriented Programming,面向切面,是Spring三大思想之一,另外两个是 IOC-控制反转 DI-依赖注入 (Autowired、Qualifier、Re…...

android系统启动流程之zygote如何创建SystemServer进程
SystemServer:是独立的进程,主要工作是管理服务的,它将启动大约90种服务Services. 它主要承担的职责是为APP的运行提供各种服务,像AMS,WMS这些服务并不是一个独立的进程, 它们其实都是SystemServer进程中需要管理的的众多服务之一…...

【awd系列】Bugku S3 AWD排位赛-9 pwn类型
文章目录 二进制下载检查分析运行二进制ida分析解题思路exp 二进制下载 下载地址:传送门 检查分析 [rootningan 3rd]# file pwn pwn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for …...

vcomp140.dll丢失的修复方法分享,电脑提示vcomp140.dll丢失修复方法
今天,我的电脑出现了一个奇怪的问题,打开某些程序时总是提示“找不到vcomp140.dll文件”。这个问题让我非常头疼,因为我无法正常使用电脑上的一些重要软件。为了解决这个问题,我在网上查找了很多资料,并尝试了多种方法…...

Docker file解析
文章目录 简介构建的三步骤Docker执行Dockerfile的大致流程DockerFile常用保留字指令创建第一个Dockerfile镜像的缓存特性 Docker file 解析 简介 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本,记录了镜像构…...
工作与身体健康之间的平衡
大厂裁员,称35岁以后体能下滑,无法继续高效率地完成工作;体重上涨,因为35岁以后新陈代谢开始变慢;甚至坐久了会腰疼、睡眠困扰开始加重,在众多的归因中,仿佛35岁的到来,会为一切的焦…...
算法和数据结构
STL 【C】蓝桥杯必备 算法竞赛常用STL万字总结_蓝桥杯算法竞赛_Cpt1024的博客-CSDN博客 day1 1:正确 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 // 中序遍历一遍二叉树,并统计节点数目 class Solution { public:int c…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...