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

代码大全阅读随笔 (二)

软件设计
设计就是把需求分析和编码调试连在一起的活动。
设计不是在谁的头脑中直接跳出来了,他是不断的设计评估,非正式讨论,写实验代码以及修改实验代码中演化和完善。
作为软件开发人员,我们不应该试着在同一时间把整个程序都塞进自己的大脑,而应该试着以某种方式去组织,以便能够在一个时刻可以专注一个特定的部分。这么做的目的是尽量在任意一时间减少要考虑的程序量。

在软甲架构的层次上,可以通过把真个系统分解成多个子系统,来降低问题的复杂度。人类更容易理解和接受多项简单的信息,而不是一项复杂的信息。所有软件设计技术目标都是把,复杂问题分解成多个简单的问题,减少子系统直接的项目依赖,增加子系统内部的聚合。
保持子程序的短小精悍也能帮助你减少思考负担,从问题领域入手,而不是从底层实现细节入手去编程程序,在最抽象的层次上工作,也能减少人的脑力负担。
编写代码一个评估质量的标准,就是要写出既让自己容易理解,也能让别人看懂,而且很少有错误的程序代码。
如何管理复杂度:
①把任何人在同一时间需要处理的本质复杂度减少到最低。
②不要让偶然性的复杂度无谓的快速增长。

下面列出一些设计范畴内的特征:
①最小复杂度,避免做出聪明的设计,因为聪明的设计常常难以理解。
②易于维护,设计时候为做维护的程序员着想,设计能自明的系统。
③松散耦合,老生常谈的特征,实现方法接口隔离,依赖倒置等等
④可拓展性,明确系统中那些需求是容易发生变化,例如改变一种表现方式,增加一种新的事物等等,在增强系统功能时候,减少或者不影响已有的功能,是最佳的拓展性的表现。
⑤可重用性, 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

链表头使用结构体&#xff1a;struct Class 链表中的每一项使用结构体&#xff1a;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软件进行&#xff0c;共分为以下几步&#xff1a; &#xff08;1&#xff09;DICOM转NIfTI格式 (2)去除前10个时间点(Remove first 10 times points)&#xff1a;由于机器刚启动、被试刚躺进去也还需适应环境&#xff0c;导致刚开始扫描的数据很…...

在React项目是如何捕获错误的?

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

基于内存池的 简单高效的数据库 SDK简介

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

python实例方法,类方法和静态方法区别

为python中的装饰器 实例方法 实例方法时直接定义在类中的函数&#xff0c;不需要任何修饰。只能通过类的实例化对象来调用。不能通过类名来调用。 类方法 类方法&#xff0c;是类中使用classmethod修饰的函数。类方法在定义的时候需要有表示类对象的参数(一般命名为cls&#…...

Pyecharts教程(四):使用pyecharts绘制3D折线图

Pyecharts教程(四):使用pyecharts绘制3D折线图 作者:安静到无声 个人主页 目录 Pyecharts教程(四):使用pyecharts绘制3D折线图准备工作数据准备绘制3D折线图推荐专栏在这篇文章中,我们将学习如何使用pyecharts库来绘制一个3D折线图。pyecharts是一个用于生成Echarts图表的…...

【stable-diffusion使用扩展+插件和模型资源(下)】

插件模型魔法图片等资源&#xff1a;https://tianfeng.space/1240.html 书接上文&#xff1a;&#xff08;上&#xff09; 插件推荐 1.lobe theme lobe theme是一款主题插件&#xff0c;直接可以在扩展安装 界面进行了重新布局&#xff0c;做了一些优化&#xff0c;有兴趣的…...

一文了解SpringBoot中的Aop

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

android系统启动流程之zygote如何创建SystemServer进程

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

【awd系列】Bugku S3 AWD排位赛-9 pwn类型

文章目录 二进制下载检查分析运行二进制ida分析解题思路exp 二进制下载 下载地址&#xff1a;传送门 检查分析 [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丢失修复方法

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

Docker file解析

文章目录 简介构建的三步骤Docker执行Dockerfile的大致流程DockerFile常用保留字指令创建第一个Dockerfile镜像的缓存特性 Docker file 解析 简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本&#xff0c;记录了镜像构…...

工作与身体健康之间的平衡

大厂裁员&#xff0c;称35岁以后体能下滑&#xff0c;无法继续高效率地完成工作&#xff1b;体重上涨&#xff0c;因为35岁以后新陈代谢开始变慢&#xff1b;甚至坐久了会腰疼、睡眠困扰开始加重&#xff0c;在众多的归因中&#xff0c;仿佛35岁的到来&#xff0c;会为一切的焦…...

算法和数据结构

STL 【C】蓝桥杯必备 算法竞赛常用STL万字总结_蓝桥杯算法竞赛_Cpt1024的博客-CSDN博客 day1 1&#xff1a;正确 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 // 中序遍历一遍二叉树&#xff0c;并统计节点数目 class Solution { public:int c…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...