当前位置: 首页 > 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…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

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

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

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...