软件设计(1)--避免的问题

软件设计师之死锁问题深度剖析:原因、预防与处理 在软件开发中,操作系统的稳定运行至关重要,而死锁问题是影响系统稳定性的关键因素之一。今天,我们就一起深入学习死锁相关知识,希望能和大家共同进步,提升在操作系统领域的认知水平。 阅读详情
        软件开发出来后,无非就两大团体来接触他。一个是用户,一个是开发者。所以在设计软件的时候这两个团体要同时考虑,从各个角度来权衡每个设计点的偏重点。
       开发的软件是给用户操作的,用户每天都要与之打交道,所以界面的美观性,功能的实用性,操作的简易性,数据传递的速度以及比较贴近的业务逻辑对于用户来讲都是很重要的。
       而对于开发者来说,软件开发完成后并不是就不用管了,软件的后期维护也是一项很重要,很繁琐的事情。用户会随着时间的推移,不断的改变着他的需求,要你对软件进行改进。当然,你会把一些需求挡回去,把一些需求通过现有的条件变种方式来实现,但总有一些你需要增加或修改。这时,你的软件在开始设计的时候是不是够灵活,在你修改的时候便知道了。
       如果维护的软件让你头疼,宁愿重新开发也不愿意去修改,那就说明这个软件设计的很不成功。
 
    要想让软件不发生腐化,使以后的维护工作更加容易,那么设计软件的时候应该尽量避免以下几个问题:
1.僵化性(Rigidity):设计难以改变
当用户提出一个新的需求时,需要对程序的一些地方进行改动,可当你打开代码,发现虽然是添加一个很小的功能,却牵涉到了很多地方。这样单一的改动导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。没人愿意为了一小块玉石而去移掉整座山,愚公移山的精神在这里不值得发扬。
 
2.脆弱性(Fragility):设计易于遭到破坏
用户想要添加的功能改完了,然后重新进行测试,这时却发现跟这个新加功能没有概念性关联的其他功能发生了错误。而去修正这些问题又会引出更多的问题。就像在玻璃上钉钉子--越钉越碎。
 
3.牢固性(Immobility):设计难以重用
同类系统,总是会有许多相似的地方,甚至有些地方完全相同。当作完一个项目后,又接了一个项目,这两个项目功能方面很相似,只是给不同的客户用,业务逻辑上稍有不同,但是在人员管理和权限管理上基本一致。这时你想把之前的项目中人员管理和权限管理这部分拷过来改改就用,却发现改动的工作量相当巨大,还不如重新作,这就说明之前的项目在设计时重用性能太差了。
 
4.粘滞性(Viscosity):难以做正确的事情
改动一个功能时,往往会有多种改动的方法。其中一些方法会保持初始的设计,另外一些方法会破坏初始的设计。按照常理来说,一般会选择保持初始设计的方法,可是你却发现那些保持设计的方法的改动比那些破坏设计方法的改动更难以对付,这就表明初始设计具有高粘滞性。
 
5.不必要的复杂性(Needless Complexity):过分设计
不是说越复杂的软件就是好软件,现在的电器还不是功能越多,越容易坏吗!软件也是一样,设计的越复杂,逻辑就会很繁杂,开发起来也会很费时间。本来一个类型列表页面只有三个字段,最多不过10条记录,你非要在页面上加上一个翻页控件,这不是画蛇添足吗!
 
6.不必要的重复(Needless Repetition):滥用鼠标(乱拷贝)
拷贝和粘贴确实是能提高开发效率,但是有时会造成过分的滥用。系统中有一个计算总金额的公式过程,在很多地方要用到,于是每个开发人员都
拷贝粘贴到自己的程序里,过了一段时间,国家下政策了,调息了,计算公式要改动,这下大家傻眼了,满“项目”找这个公式过程。费时费力。
 
7.晦涩性(Opacity):混乱的表达
开发的模块难以让别人理解。一个软件有时要经过很多开发人员编写,如果模块的命名和编程的格式都按照自己的方式来进行开发,时间一久,愈是往后接手的开发人员就越痛苦,打开代码,根据里面的命名都不知道这段代码是干什么用的,总是要花很多时间先来理解代码。
 
解锁软件设计的奥秘:《A Philosophy of Software Design》(软件设计的哲学) 《A Philosophy of Software Design》(软件设计的哲学)由 John Ousterhout 撰写, 主要探讨了软件设计中的复杂性问题, 并提出了一系列设计原则和实践指导, 旨在帮助开发者减少软件复杂性, 提高代码的可维护性和可扩展性. 这本书的作者 John Ousterhout 可是业界大咖, 他有着丰富的编程经验, 参与过众多大型项目, 像创建 `Tcl` 脚本语言, 在分布式操作系统和存储系统领域也成绩斐然. 正是这些宝贵的经验, 让他在书中分享的见解深刻又实用. 阅读详情

相关推荐

软件设计师之算法设计与常见算法问题解析

大家好!在软件设计的学习过程中,算法设计是非常核心的部分,它与数据结构紧密相连,共同决定了软件系统的性能。今天咱们就一起深入学习算法设计的流程、常见的算法问题类型,以及用分治法解决循环赛日程安排问题,希望通过这次学习,我们都能有所收获,共同进步。

wj_rdk的博客 1257

硬件基础:嵌入式软件可靠性设计要注意的问题

自从40多年前嵌入式系统诞生以来,随着技术的发展和需求的变化,嵌入式系统软件就在嵌入式系统中越来越重要。现在,甚至一些嵌入式系统硬件一模一样,仅仅是软件不同,就是不一样的产品(如交换机和...

IT技术分享社区 2354

数智读书笔记系列033《软件设计的哲学(第2版)》:复杂性管理的艺术

本书聚焦软件设计的核心挑战——**复杂性管理**,探讨如何通过模块化、抽象化和战略性设计降低系统的复杂性。奥斯特豪特认为,复杂性源于**依赖性**和**模糊性**,表现为变更放大、认知负荷和“未知的未知”。

AllenLV的博客 1608

系统功能设计避免画蛇添足

架构师的交互准则和机制 牢记开发人员承担创造性和发明性的实现责任,所以架构师只能建议,而不能支配。 时刻准备着为所指定的说明建议一种实现的方法,同样准备接受其他任何能达到目标的方法。 对上述建议保持低调和不公开 准备放弃坚持所有的改进建议 什么时候容易出现画蛇添足 在开发第一个系统时,架构师倾向于精炼和简洁。他知道自己对正在进行的任务不够了解,所以会谨慎、仔细地工作。第二系统是设计师们所...

October 303

软件设计要点

软件产品设计需要多种软件和工具来进行设计、开发、测试和部署。以下是几个常用的软件和工具:1、UML建模工具UML(Unified Modeling Language)是一种广泛使用的、图形化方法,用于描述和可视化复杂系统的架构、设计和实现。UML建模工具是用于绘制UML图的软件,如类图、时序图、用例图和活动图。一些常见的UML建模工具包括Enterprise Architect、Rational Rose、Visual Paradigm等。2、原型设计工具。

JMZjmzjmz的博客 1096

软件设计师真题,数据库专项练习(十二)

软件设计师真题,数据库专项练习(十二)

6611

软件腐化的七个特征之牢固性和粘滞性(设计模式原则的反面) (《敏捷软件开发》读书总结第二篇)

软件工程、架构设计、设计模式、软件腐化、敏捷开发

weixin_43645811的博客 908

2019新版软件设计师教程第5版:全面提升软件设计能力

本文还有配套的精品资源,点击获取 简介:《2019新版软件设计师教程第5版》旨在为IT专业人士提供软件设计领域的全面知识,覆盖理论与实践,并特别强调Java编程语言的应用。教程内容包括软件设计基础、设计模式、面向对象设计原则、UML建模语言、软件架构设计、Java核心技术、设计决策与评估、重构与代码质量、软件设计过程和软件项目管理等关键知识点。本教程适合备考软件设计师考试和...

weixin_35982453的博客 1645

浅谈敏捷设计

在软件开发过程中,都避免不了进行概要设计、详细设计等过程,这和软件测试过程中进行测试计划测试方案设计很类似。 这篇博客,就说说敏捷设计的一些内容,以及拙劣设计对软件应用的严重影响。   我们日常接触到的软件项目是一个抽象的概念,它和程序包括形状、结构以及每一个模块、类和方法都有关。可以通过很多媒介和语言去描述它,但它最终体现为源代码——源代码就是设计。 应该知道的一件事是:软件都是有生命周...

weixin_34362991的博客 189

斯坦福大学CS224d基础1:线性代数知识

本文为斯坦福CS229的内容,也是CS224d课程的背景数学知识。概括了在机器学习和深度学习中用到的大部分线性代数知识。为了便于大家查漏补缺,这里根据英文版本整理了一个中文版本。

龙心尘 2万+

手把手教你用Wireshark抓包分析Profinet非周期通信(附实战案例)

本文详细解析了PROFINET非周期通信(RTA)的技术原理与实战应用,通过Wireshark抓包分析,揭示从PLC请求到驱动器响应的完整对话过程。涵盖实验环境搭建、关键配置步骤、典型参数访问流程及故障诊断案例,帮助工程师深入理解并优化工业网络通信性能。

Black的专栏 1047

软件设计的“七宗罪”及设计模式的七大原则

编写软件过程中,面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序,具有更好的代码重用性、可读性、可扩展性、可靠性,使程序呈现高内聚低耦合的特性。 软件设计的“七宗罪”: 僵化性 脆弱性 牢固性 粘滞性 不必要的重复 不必要的复杂性 晦涩性 1. 僵化性 僵化性是指难以对软件进行改动,即使是简单的改动。如果单一的改动会导致有依赖关系的模块中的连锁改动,那么设计就是僵化的。必须要改动的模块越多,设计就越僵化。 2. 脆弱性 脆弱性是指在进行一个改动时,程序的

sun_of_Dec的博客 982

深入解析Android SoundTrigger架构:从HIDL到AIDL的演进与实践

本文深入解析Android SoundTrigger架构,从HIDL到AIDL的演进与实践。SoundTrigger是Android系统中低功耗语音唤醒的关键技术,通过分层设计和硬件协同实现高效语音识别。文章详细介绍了核心组件、HIDL与AIDL的对比及优化技巧,帮助开发者掌握语音模型优化和功耗管理。

brown的博客 230

Struts 1.x的线程安全

回到首页☞ 第一轮做基础知识整理并没有那么深入,跳过了struts 1.x 的实例,一个完整的项目起码要有: 权限管理模块 安全加固模块-防入侵 UI web交互模块 业务层,业务逻辑封装模块 dao层数据处理模块–基础的是纯纯的JDBC 数据跟踪,异常干涉模块 入湖模块,OGG等是必不可少的,因为数据是企业命脉。 先简单的回顾,然后按需,第二轮,第三轮完善。 线程安全是每个多线程程序都要考虑...

JDIT的博客 219

【WRFDA教程第四期】雷达数据同化(Radar Data Assimilation)

雷达数据同化(Radar Data Assimilation)

WW、forever的博客 1758

你的小程序地图功能还只是“摆设”吗?支付宝地图API的深度玩法都在这里了!

🏆本文收录于《滚雪球学支付宝小程序开发》专栏,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1817

什么是软件设计模式, 它们⽤于解决什么问题, 它们为什么有效

软件设计模式是指在软件设计过程中,经过验证的、可复⽤的、对特定 场景下常⻅问题的解决⽅案的⼀种描述或模板。这些模式并不是具体的 代码,⽽是⽤于指导如何组织代码、类和对象,以便更好地解决问题和 满⾜需求。⽤于解决的问题软件设计模式主要⽤于解决以下⼏类问题:1.代码复⽤:模式提供了⼀套通⽤的解决⽅案,可以被多次使⽤,减 少了重复编写类似代码的需求。2.代码组织:模式帮助开发者更好地组织代码结构,使其更具逻辑性 和可维护性。3.

捕鲸叉的专栏 1144

FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测

当前,多模态假新闻的大量涌现导致了显著的分布差异,这一现状亟需我们开发具备广泛适用性的检测器。然而,现有假新闻检测器因特定领域内的训练方式,难以有效获取开放世界中的事实信息。这种训练的封闭性限制了传统检测器的能力,特别是在面对跨域假新闻时,其表现往往不尽如人意。具体而言,开放世界中的假新闻在两个方面具有显著的分布差异:一方面,其操纵内容多种多样,新闻的任一部分都可能受到创意策略的操控;另一方面,真实背景复杂多变,不同地区的新闻背景和主题焦点存在显著差异。

qq_52053775的博客 821

软考中级,软件设计师考试那些内容,考试大纲什么的?

(1)计算机与软件工程知识,考试时间为150分钟,笔试,选择题;(2)软件设计,考试时间为150分钟,笔试,问答题。上午综合知识选择题和下午软件设计题满分都是75分, 45分合格。软件设计师考试上午的综合知识选择题,覆盖的知识范围非常广,基本上涵盖了IT行业所需的大部分知识体系,包括硬件、操作系统、数据库、软件工程、面向对象等等。(1)掌握数据表示、算术和逻辑运算;(2)掌握相关的应用数学、离散数学的基础知识;(3)掌握计算机体系结构以及各主要部件的性能和基本工作原理;(4)掌握操作系统、程序设计语言的基础

qq123yyy的博客 2万+

第 0 篇|开篇:为什么我们要从 RNN 讲到 Transformer?

本文介绍了NLP模型的发展历程,从早期规则式方法到如今Transformer模型的演进脉络。文章强调理解NLP技术需要从基础模型入手,重点分析了传统机器学习的局限性(无法处理变长有序输入和深层语义关联),以及RNN如何通过循环结构首次实现顺序依赖捕捉。作者指出Transformer之所以成为主流,是因为它通过自注意力机制解决了RNN的核心痛点(低效串行处理和长距离依赖问题)。专栏将采用"从问题到解决方案"的讲解方式,帮助读者建立完整的NLP知识体系,避免孤立学习和盲目追新。全文旨在为初学

记录 IT 领域经验与见解的博客 73

二极管限幅电路和钳位电路

二极管限幅电路和钳位电路学习

HW-BASE的博客 927

软件设计模式与体系结构 课后练习1

软件设计模式与体系结构 课后练习1 习题如下: 解:第一题 画出该模式的设计类图: 如图1所示: 图1 设计类图 2. 解释为什么自己的设计符合开闭原则? 答:因为设计的类、模块和函数对扩展开放,对修改关闭.即可以通过扩展来实现变化,而不是通过修改已有的代码来实现变化.具体为通过接口或抽象类约束扩展,对...

Outsider98k的博客 3981

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

软件工程:软件设计

本博客系统介绍软件设计的核心知识体系,分为五个关键模块:1)软件设计概念与原则,强调可靠性、可修改性等基本原则;2)模块化设计的"高内聚低耦合"核心思想;3)软件体系结构的构件、连接件等要素及设计模式;4)详细设计中的算法实现与文档规范;5)人机界面设计的用户中心原则。内容采用关卡式学习,每个模块包含理论讲解、实例分析和题目测试,帮助读者从基础概念到实践应用全面掌握软件设计方法。特别注重设计思维的培养,如模块化分解、架构模式选择和界面用户体验优化,为开发高质量软件系统提供系统化指导。

m0_74311877的博客 1801

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

软件设计师考试都考什么内容

软件设计师是软考中级热门的科目之一,想要了解更多的软考中级软件设计师看这篇就够了,看完别忘记给我点个赞嘞!软设其实不难考,但是得花点时间去备考,理清所有的考点,教材虽厚并不是都是重点。因为已经考过了,一次通过。知识点考的范围挺多的但是中级软件设计师考的点没有很深入。(1)计算机与软件工程知识,考试时间为150分钟,笔试,选择题;(2)软件设计,考试时间为150分钟,笔试,问答题。上午综合知识选择题和下午软件设计题满分都是75分, 45分合格。软件设计师考试上午的综合知识选择题,覆盖的知识范围非常广,基本上涵

zzjjia的博客 6316

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

软件设计的中庸之道

反者道之动,过犹不及,物极必反。做人如此,做事如此,软件设计也不例外。从业的时间长了,看到过、经历过太多教条式的错误。所以特意写此文告诉大家,软件设计无其他,唯有中庸之道。1. 理解中庸在进入技术讨论之前,让我们先理解一下什么是中庸。中者,不偏不倚、无过不及之名。庸,平常也。中庸的要义在于执两用中。我们知道走极端肯定不是中庸,然而正中间也不一定就是中庸。中,不是数学和物理的绝对中间、一半、百分之五...

我的新书《代码精进之路:从码农到工匠》 1万+

软件设计原则 KISS、YAGNI、DRY

flyfish

二分掌柜的 1784
上一篇: 窗外的夜雨心中的思雨
下一篇: 好久没有看动漫看得这么投入,是不是最近压力太大了 T_T
linqingfeng
博客等级 码龄21年 69粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值