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

商城-学习整理-集群-K8S-集群环境部署(二十四)

目录 一、MySQL集群1、mysql集群原理2、Docker安装模拟MySQL主从复制集群1、下载mysql镜像2、创建Master实例并启动3、创建 Slave 实例并启动4、为 master 授权用户来同步数据1、进入 master 容器2、进入 mysql 内部 &#xff08;mysql –uroot -p&#xff09;3、查看 master 状…...

利用多种机器学习方法对爬取到的谷歌趋势某个关键词的每日搜索次数进行学习

大家好&#xff0c;我是带我去滑雪&#xff01; 前一期利用python爬取了谷歌趋势某个关键词的每日搜索次数&#xff0c;本期利用爬取的数据进行多种机器学习方法进行学习&#xff0c;其中方法包括&#xff1a;随机森林、XGBOOST、决策树、支持向量机、神经网络、K邻近等方法&am…...

ARL资产侦察灯塔 指纹增强

项目&#xff1a;https://github.com/loecho-sec/ARL-Finger-ADD 下载项目后运行 python3 ARl-Finger-ADD.py https://你的vpsIP:5003/ admin password该项目中的finger.json可以自己找到其他的指纹完善&#xff0c;然后运行脚本添加指纹。...

javaee spring 自动注入,如果满足条件的类有多个如何区别

如图IDrinkDao有两个实现类 方法一 方法二 Resource(name“对象名”) Resource(name"oracleDrinkDao") private IDrinkDao drinkDao;...

sql语句中的ddl和dml

操作数据库&#xff1a;CRUD C&#xff08;create&#xff09; 创建 *数据库创建出来默认字符集为utf8 如果要更改字符集就 Create database 名称 character set gbk&#xff08;字符集&#xff09; *创建数据库&#xff1a;create database 名称 *先检查是否有该数据库在…...

学习JAVA打卡第四十一天

字符串与字符数组、字节数组 ⑴字符串与字符数组 String类的构造方法String&#xff08;char a[]&#xff09;和String&#xff08;char a[]&#xff09;,int offset,int length,分别用数组a中的全部字符和部分字符创建string对象。 String类也提供将string对象的字符序列存…...

leetcode SQL题目

文章目录 组合两个表第二高的薪水第N高的薪水分数排名连续出现的数字超过经理收入的员工查找重复的电子邮件从不订购的客户部门工资最高的员工部门工资前三高的所有员工删除重复的电子邮箱上升的温度游戏玩法分析Ⅰ游戏玩法Ⅳ 组合两个表 SELECT firstName,lastName,city,stat…...

计算机组成原理学习笔记-精简复习版

一、计算机系统概述 计算机系统硬件软件 计算机硬件的发展&#xff1a; 第一代计算机&#xff1a;(使用电子管)第二代计算机&#xff1a;(使用晶体管)第三代计算机&#xff1a;(使用较小规模的集成电路)第四代计算机&#xff1a;(使用较大规模的集成电路) 冯诺依曼体系结构…...

聊一聊微前端框架的选型和实现 | 业务平台

一、项目背景 目前&#xff0c;我们开发维护的项目主要有 6 个&#xff0c;但是分别对应 PC 和 H5 两个端&#xff1a; 如上图所示&#xff0c;我们 6个项目最开始是一个一个进行开发维护的&#xff0c;但是到后期&#xff0c;这几个项目之间有的部分会有业务逻辑不同&#xff…...

Elasticsearch 集成---框架集成SpringData-集成测试-索引操作

1.Spring Data 框架介绍 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的 开源框架。其主要目标是使得对数据的访问变得方便快捷&#xff0c;并支持 map-reduce 框架和云计 算数据服务。 Spring Data 可以极大的简化 JPA &a…...

青岛模版网站建设/简述什么是seo及seo的作用

副标题——别把技术问题转化为人际问题&#xff08;作者&#xff1a;孙继滨&#xff09;【项目经理之修炼】 全文索引 刚刚进入项目时&#xff0c;由于权威还没有树立&#xff0c;人际关系尚浅&#xff0c;经常会有组员不把你当回事儿。于是&#xff1a; 你要求组员写周报&…...

做网站推广员/营业推广的方式

题意&#xff1a; 有N个女生想跟自己的一个或者多个男生做在一起。然后要你算出最后能够匹配出多少对。 解题思路&#xff1a; 这道题是明显的二分匹配题目。有个强大的算法&#xff1a;匈牙利算法&#xff0c;确实很凶&#xff0c;这算法挺牛叉。 这道题属于单边匹配。 算法的…...

系统开发策略主要有/衡阳seo排名

软件架构师在整个软件开发过程中都起着重要的作用&#xff0c;并随着开发进程的推进而其职责或关注点不断地变化&#xff0c;总结下面几点。在需求阶段&#xff0c;软件架构师主要负责理解和管理非功能性系统需求&#xff0c;比如软件的可维护性、性能、复用性、可靠性、有效性…...

网站开发流程博客/广告营销策划

引入模块的方式&#xff1a; 1. import 模块 2. from xxx import 模块 一、collections 模块 1.Counter() counter是一个计数器&#xff0c;主要用来计数&#xff0c;计算一个字符串中每个字符出现的次数 1 from collections import Counter 2 s "我要从南走到北&#xf…...

做网站要注意的/病毒什么时候才能消失

1. 异常检测 VS 监督学习 0x1&#xff1a;异常检测算法和监督学习算法的对比 总结来讲&#xff1a; 1. 在异常检测中&#xff0c;异常点是少之又少&#xff0c;大部分是正常样本&#xff0c;异常只是相对小概率事件 2. 异常点的特征表现非常不集中&#xff0c;即异常种类非常多…...

wordpress远程ftp/企业营销策划有限公司

前几天做项目的时候&#xff0c;需要实现一个动态锚点的效果 如果是传统项目&#xff0c;这个效果就非常简单。但是放到 Vue 中&#xff0c;就有两大难题&#xff1a; 1. 在没有 jQuery 的 animate() 方法的情况下&#xff0c;如何实现平滑滚动&#xff1f; 2. 如何监听页面滚…...