Head First Object-Oriented Analysis & Design
Head first 一直秉持着在程序书里面乱加图片乱涂乱画的风格,这种风格其实真的可以让人看书看的更快,虽然这段时间项目上比较忙,但是在只看了四五次的情况下就已经把他看完了。确实看这种书有一种看小说的感觉,停不下来似的。之前不管是在学校里还是在公司项目上,对OO也有过一定的认识,但很多时候自己正真时间的时候却不自觉地的用不够OO的方式去分析问题,解决问题,读了本书之后希望之后的实践能多用OO的方式,毕竟书看了只是有个架构,实践多了,才能正真丰满起来。
1. 良好应用程序的基石
如何真正写出伟大的软件?书中一直以这个问题来引导读者。继而给出伟大软件的简易三步骤:
- 确认你的软件做客户要它做的事。
- 运用基本的OO原则来增强软件的灵活性
- 努力实现可维护、可重用的设计。
2. 收集需求
跟我们现在项目的情况一样,每个项目总是以需求收集开始,因为我们后面需要做的事情全都是想让客户满意。这也是上面提到的编写伟大软件的第一个步骤,确保它能完成客户要它做的事。
- 需求是系统为了真确运作所必须做的事。
- 需求最初通常来自客户。
- 在需求的基础上,我们使用用例来详细描述系统应该做什么。
- 对于系统需要完成的每一个目标,你至少会有一个用例。
- 确保所有用例皆可行的需求列表是一组好的需求。
- 你的系统必须运作在真是的世界里,而不只是在你预期的情况中。
3. 需求变更
正如我们公司的价值观之一,拥抱变化,软件行业,只有一样东西是永远不会改变的,那就是“变化”。变化是每个项目每个系统,都必然存在的。
- 需求总是随着项目的进行而改变。
- 当需求变更时,你的系统必须随之演变进以处理新的需求。
- 在需求变更的过程中,我们需要做到,避免重复的代码给后面的维护工作带来很多重复的工作量很很大的项目风险。所以,这里牵涉到一个非常重要的OO原则:将变化之物封装起来。
在变化再次来临的时候,你只要修改一个地方就可以搞定。
4. 分析
我们的软件最终还是要运行到真实的环境中的,所以我们必须分析我们的程序,让它能够更好的在真实的环境中起作用。
- 通过编写用例的形式来让自己、你的经理、你的客户以及其他的工程师理解。
- 每个用例应该只聚焦于一个客户目标。假如有多个目标,你就需要编写多个用例。
- 通过画类图来简单展示你的系统以及它的程序代码构想。
-
通过文本分析
可以帮助我们确定我们的类图。用例里的名词是系统类候选者,而动词是系统的类上的方法候选者。
5. 良好的设计 = 灵活的软件
在改变不可避免的时候,分析我们的设计并给出一些更合理,更灵活的方式来实现,使我们的程序更具有复原力。
- 通过UML来帮助我们分析。
- 设计良好的软件容易改变与扩展。
- 使用像封装与继承这样的基本OO原则
来确保你的软件有灵活性。并且坚持另外一个OO原则:对接口编程,而不是对实现。
- 如果设计没有灵活性,就改变它!别与坏设计拖鞋。
- 确认每一个类都具有内聚性,每一个类就应该聚焦在把一件事情做得很好上。这里涉及到另外一个OO原则:应用程序的每一个类只有一个理由改变。
- 随着软件的设计生命周期展开,需要持续女里提高内聚力。
-
类是关于行为与功能的。
6. 解决大问题
往往我们所遇到的问题,和我们需要编写的程序都不是一个小小的问题,它往往包含了很多东西,我们需要将这些大问题,分割成一些我们能解决的小问题来解决,就像上面提到的那些方式。
- 就像在较小的项目中那样,从手机功能与需求开始进行大项目。
- 运用用例图创建系统的蓝图。
- 用例是面向细节的,而用例图这是比较聚焦在整个轮廓上。
-
领域分析:用客户理解的语言表示系统。
- 当你解决了所有的小问题,你的大问题也就已经解决了。
7. 架构
正如上面所说的,我们在解决大问题的时候将它分解成很多小的问题。其实这会面临很多问题,比如说从哪里着手做这些小问题,或者这个部分与那个部分之间的关系是什么,再比如怎么将这些小的模块拼凑到一起。这个时候就要发挥架构的力量了。
- 架构帮你将所有的图形、谋划以及功能列表转化为井然有序的应用程序。
- 注意,系统中对项目最重要的功能时在架构上重要的。
- 在架构阶段,你所做的每一件事情都是应该以减少项目风险为目的。
- 在整个项目过程中都需要持续的问一个问题:这会减小项目风险么。
- 有时候,编写伟大的程序代码的最佳方式,是在允许的情况下降程序代码的编写往后顺延。
8. 设计原则
模拟是避免做傻事的最佳方式。在你自己苦思冥想去解决一个问题之前,先看看是不是有其他人已经有了非常漂亮的解决方式。比如我们需要学习一些设计原则来避免自己少走弯路,尽快写出伟大的程序。
-
开闭原则(OCP)
,这个原则应该大家多知道,并且都用过,但不一定用的很好。对修改关闭,对扩展开发。
-
不自我重复原则(DRY)
,关系到让系统中每一个信息与行为的片段都保存在单一,合理的地方。
-
单一自责原则(SRP)
,也叫内聚力。
-
Liskov替换原则(LSP)
,之类必须能够体会其基类。比如将长方形作为基类,那正方形就不应该成为长方形的之类,因为正方形不能替代长方形,长方形可以分别设置长宽,而正方形在设置长的时候宽必然跟着改变。
- 在我们需要使用继承之前先考虑委托、组合与聚合。
- 聚合和组合的区别在与,聚合让你使用来自其他类的行为,但没有限制这些行为的生命和周期,即使在聚合对象被摧毁之后,被聚合的行为仍继续存在。
9. 迭代与测试
大多数时候,客户不在乎你所创建的OO原则或者图形,他们只想要软件做它该做的事。所以很多时候伟大软件的编写应该是迭代进行的。先针对整体轮廓操作,接着迭代应用程序的每个片段,直到完成。
- 迭代的过程中可以使用不同的开发方式。比如用例驱动开发和功能驱动开发,他们的区别是一个把焦点房在应用程序用例中的一个场景上,一个把焦点放在为完整的功能编码上。
- 测试阶段是必经阶段,它让你的软件缺陷大大降低,让你向我们的客户证明软件能运作。
- 另一种开发方式:测试驱动开发,以先编写测试用例再进行开发通过这些测试的方式来确保我们的软件是完整有效的。
- 编程实践的时候涉及到两种编程模式,契约式编程和防御式编程。契约式编程为你与软件用户同意遵守的软件行为建立一个共同的协议。防御式编程不信任其他软件,进行广泛的错误及数据检查以保证其他软件不会给你不良的或者不安全的信息。两种编程模式在不同情况下使用。如项目内部应该使用契约式编程,对外开发应该使用防御式编程。
分享到:
相关推荐
### Head First 设计模式学习笔记知识点总结 #### 1. 欢迎来到设计模式世界:设计模式入门 - **业务场景**: - **需求背景**:开发一款模拟鸭子的游戏,游戏内包含多种不同种类的鸭子,每种鸭子具有不同的外观...
### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
# 基于Python的KMeans和EM算法结合图像分割项目 ## 项目简介 本项目结合KMeans聚类和EM(期望最大化)算法,实现对马赛克图像的精准分割。通过Gabor滤波器提取图像的多维特征,并利用KMeans进行初步聚类,随后使用EM算法优化聚类结果,最终生成高质量的分割图像。 ## 项目的主要特性和功能 1. 图像导入和预处理: 支持导入马赛克图像,并进行灰度化、滤波等预处理操作。 2. 特征提取: 使用Gabor滤波器提取图像的多维特征向量。 3. 聚类分析: 使用KMeans算法对图像进行初步聚类。 利用KMeans的聚类中心初始化EM算法,进一步优化聚类结果。 4. 图像生成和比较: 生成分割后的图像,并与原始图像进行比较,评估分割效果。 5. 数值比较: 通过计算特征向量之间的余弦相似度,量化分割效果的提升。 ## 安装使用步骤 ### 假设用户已经下载了项目的源码文件 1. 环境准备:
HCIP第一次作业:静态路由综合实验
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
内容概要:本文详细介绍了Johnson-SU分布的参数计算与优化过程,涵盖位置参数γ、形状参数δ、尺度参数ξ和伸缩参数λ的计算方法,并实现了相应的Python代码。文中首先导入必要的库并设置随机种子以确保结果的可复现性。接着,分别定义了四个参数的计算函数,其中位置参数γ通过加权平均值计算,形状参数δ基于局部均值和标准差的比值,尺度参数ξ结合峰度和绝对偏差,伸缩参数λ依据偏态系数。此外,还实现了Johnson-SU分布的概率密度函数(PDF),并使用负对数似然函数作为目标函数,采用L-BFGS-B算法进行参数优化。最后,通过弹性网络的贝叶斯优化展示了另一种参数优化方法。; 适合人群:具有Python编程基础,对统计学和机器学习有一定了解的研究人员或工程师。; 使用场景及目标:①需要对复杂数据分布进行建模和拟合的场景;②希望通过优化算法提升模型性能的研究项目;③学习如何实现和应用先进的统计分布及优化技术。; 阅读建议:由于涉及较多数学公式和编程实现,建议读者在阅读时结合相关数学知识,同时动手实践代码,以便更好地理解和掌握Johnson-SU分布及其优化方法。
TSP问题的3种智能优化方法求解(研究生课程《智能优化算法》结课大作业).zip
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
自动发布Java项目(Tomcat)Shell脚本
# 基于webpack和Vue的前端项目构建方案 ## 项目简介 本项目是基于webpack和Vue构建的前端项目方案,借助webpack强大的打包能力以及Vue的开发特性,可用于快速搭建现代化的前端应用。项目不仅完成了基本的webpack与Vue的集成配置,还在构建速度优化和代码规范性方面做了诸多配置。 ## 项目的主要特性和功能 1. 打包功能运用webpack进行模块打包,支持将scss转换为css,借助babel实现语法转换。 2. Vue开发支持集成Vue框架,能使用Vue单文件组件的开发模式。 3. 构建优化采用threadloader实现多进程打包,cacheloader缓存资源,极大提高构建速度开启热更新功能,开发更高效。 4. 错误处理与优化提供不同环境下的错误映射配置,便于定位错误利用webpackbundleanalyzer分析打包体积。
Hands-On Large Language Models - Jay Alammar 袋鼠书 《动手学大语言模型》PDF
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
# 基于Arduino Feather M0和Raspberry Pi的传感器数据采集与监控系统 ## 项目简介 本项目是一个基于Arduino Feather M0和Raspberry Pi的传感器数据采集与监控系统。系统通过Arduino Feather M0采集传感器数据,并通过WiFi将数据传输到Raspberry Pi。Raspberry Pi运行BalenaOS,集成了MySQL、PHP、NGINX、Apache和Grafana等工具,用于数据的存储、处理和可视化。项目适用于环境监测、物联网设备监控等场景。 ## 项目的主要特性和功能 1. 传感器数据采集使用Arduino Feather M0和AM2315传感器采集温度和湿度数据。 2. WiFi数据传输Arduino Feather M0通过WiFi将采集到的数据传输到Raspberry Pi。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
【项目资源】: 适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
# 基于Arduino的WiFi按钮项目 ## 一、项目简介 本项目是一个基于ESP8266芯片的Arduino项目,主要实现WiFi连接、电压检测、LED灯控制以及向服务器发送POST请求等功能。通过简单的按钮操作,可以实现与服务器通信并获取相关信息,同时能检测电池电压并提示用户。 ## 二、项目的主要特性和功能 1. WiFi连接项目能够自动连接到指定的WiFi网络。 2. 电压检测通过ADC(模数转换器)检测电池电压,并在电压低于阈值时发出警告。 3. LED灯控制通过控制LED灯的亮灭来提示用户不同的状态信息(如连接成功、电压低等)。 4. 服务器通信项目可以向指定的服务器发送POST请求并处理返回的HTTP响应。 ## 三、安装使用步骤 1. 环境准备确保已安装Arduino IDE和ESP8266插件。 2. 下载源码下载项目的源码文件并解压。 3. 打开项目在Arduino IDE中打开解压后的main.cpp文件。