`

从AWDWR中的depot思考软件设计

阅读更多
一般对购物车简单的描述会是这样的(其实就是AWDWR中的那个depot):
一个容器,可以放很多商品,可以随时查看购物车中的商品列表,这个列表能列出商品名称,单个商品购买的数量,商品单价,以及总价格。

我的思考过程是这样的,首先,它是个容器,可以放很多商品,那就是个数组吧,至于数量,查看的时候不是要遍历嘛,顺带计算一下就好。

想了一会,我觉得这种思考习惯,或者说设计过程是属于自底向上的,一开始就脱离上层的需求,去思考最底层的实现。我觉得这样会带来问题。需求是最高层的,而这时候的设计却是最底层的,中间全脱节了。什么?没有脱离需求?没错,这样的做法最终确实实现一个购物车,没有脱离最终的用户需求,但在开发过程中会带来很多麻烦。就从我上面的例子来说,最后的购物清单页面不得不塞入大量计算数量、价格等等的业务逻辑代码。

如果一开始就设计页面的代码呢,写好像这样的
<%for item in @cart.items%>
<tr>
  <td><%=item.title%></td>
  <td><%=item.quantity%></td>
  <td><%=item.price%></td>
</tr>
<%end%>
<tr>
  <td><%=@cart.total_price%></td>
<tr>

那接下来下面需要些什么不是很清楚了?也许一开始想不出什么@cart.item,但至少知道是个容器,里面的东西取出来之后,不需要写其它逻辑,不需要经过一系列计算就可以直接访问它的title、quantity、price属性。这样就明确了session里存放的应该是个容器,这个容器不会是个赤裸裸的数组,因为它得有个total_price方法,数组应该是它内部的一个属性。并且这个数组里不应该是直接存放Book、CD啥的,或者存放一堆的抽象类Product,不应该直接是这些……怎么称呼来着……Entity吧——不应该直接放这些东西,而是上层(页面)直接需要的东西——页面需要的是一个包含了title、quantity、price属性的对象,最后差的只是给它起个名字了,嗯,就叫CartItem吧。

前面提到的"脱离需求",不是指脱离最高层的需求,不是指脱离最终的用户需求,而是指下层脱离上层的需求。合理而自然的做法应该是下层的实现依赖于上层的需求,一层一层往下走,不知道这样描述够不够清楚。

嗯,搜索到ajoo的一篇:http://ajoo.iteye.com/blog/23304
看了一遍,其中有一句:
ajoo 写道
但是,有一点从OO的前驱PO那里开始到现在都没有变化,那就是,它们始终都是自顶向下的逐渐细化求精的方法论。


看来我的想法没有错。“不能让下层脱离上层的需求“就是指应该逐层地”自顶向下的逐渐细化求精“。

写得有些混乱,只是当笔记记录一下今天的领悟。
分享到:
评论
3 楼 yuan 2011-03-25  
现实生活中,自顶向下适用于分析问题,自底向上则适用于解决问题。

软件开发由于有了接口的概念,有了stub、mock工具,自顶向下的解决问题变得可行。
2 楼 yuan 2009-08-18  
庄表伟 写道
自底向上的思维模式,和自顶向下的思维模式,从本质上是矛盾。自底向上时,意义是不存在的,外面的世界是不存在的,各种函数和变量的命名,也是“权宜之计 ”,完全可以变成另外的名字,这对于电脑来说,没有任何区别。而自顶向下时,意义是必须的,整个系统的设计,就是按照真实世界的意义,再层层分解,逐步细化的。一般来说,自顶向下开发的程序,都会比自底向上开发出来的程序要“烂”一点,当然,这是在电脑的眼光看来。

但是,当系统复杂到一定程度之后,自底向上就是不可能的任务,没有人能够完成,我们只能选择折中的方案,首先大致的进行自顶向下的划分,然后分工到具体的个人后,再进行自底向上的优化开发。

很认同这段话
1 楼 yuan 2009-08-18  
搜了一下,补个链接,看了有些收获:
http://www.iteye.com/topic/3978
还是就是上面ajoo的“论面向组合子程序设计方法“的一系列文章,看了个大概,也有些收获。

相关推荐

    MATLAB-GUI-平台的人脸购物系统.zip

    程序可以参考,非常好的思路建设,完美!

    MATLAB-GUI-平台的人脸考勤.zip

    程序可以参考,非常好的思路建设,完美!

    【毕业设计】java+springboot+vue二手车估值与销售平台实现(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java+springboot+vue二手车估值与销售平台实现(完整前后端+mysql+说明文档+LunW).zip

    【悬索桥】基于matlab单跨悬索桥风致静位移的基准解决方案【含Matlab源码 9993期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【图像加密解密】基于matlab混沌和DCT变换图像加密解密【含Matlab源码 9709期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    三菱PLC程序大型项目:QCPU+QD77MS集成电气开发系统,包含自动化设备控制程序、伺服模块设置与通信功能丰富的控制系统 ,三菱PLC大型自动化控制项目:涵盖电气开发全套资料、高效程序结构设计与丰

    三菱PLC程序大型项目:QCPU+QD77MS集成电气开发系统,包含自动化设备控制程序、伺服模块设置与通信功能丰富的控制系统。,三菱PLC大型自动化控制项目:涵盖电气开发全套资料、高效程序结构设计与丰富通信功能应用,三菱PlC程序大型项目QCPU+QD77MS16 项目说明如下: 1.包含一套完整的电气开发系统资料(包含plc程序,触摸屏程序,伺服模块设置程序,程序开发地址规划表) 2.这套开发程序是用一套完美的程序结构进行设计,掌握这套程序结构后就可以开发各种自动化设备控制程序 3.提供的这套三菱plc程序开发地址规划表可以大大提高程序开发效率 4.三菱伺服运动模块设置程序中包含详细的各轴参数设置可以参考学习 5.触摸屏程序中也有一套完美的框架结构,掌握以后可以套用各种自动化设备 6.这套控制系统,包含几十个三菱伺服,三协机器人,BCR,CCD色彩检测仪等,用到串口通信,socket套接字通信,Cclink IE通信功能丰富多样。 ,三菱PLC程序; QCPU+QD77MS16; 电气开发系统资料; 程序结构; 开发效率; 伺服运动模块设置; 轴参数设置; 触摸屏程序框架; 三菱

    096-FreeRTOS+LCD1602+ADS1015 application.rar

    freertos

    【毕业设计】java-springboot+vue高校学科竞赛平台源码(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java-springboot+vue高校学科竞赛平台源码(完整前后端+mysql+说明文档+LunW).zip

    CmsTop模板帮助手册.mht

    CmsTop模板帮助手册

    【光学】基于matlab菲涅耳衍射S-FFT计算平面波照射下给定波长及距离的衍射场振幅图像【含Malab源码 11032期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【PFJSP问题】基于matlab灰狼算法GWO求解置换流水车间调度问题PFSP【含Matlab源码 10023期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【气动学】基于matlab飞行器机动飞行质点弹道仿真(侧向和纵向)【含Matlab源码 9722期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【车间调度】基于matlab斑马算法ZOA求解分布式置换流水车间调度DPFSP【含Matlab源码 6134期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    基于遗传算法优化的CNN-LSTM股票预测模型研究与应用

    内容概要:本文提出了一种基于遗传算法(GA)优化的CNN-LSTM混合深度学习模型,用于预测韩国股市指数(KOSPI)的日收盘价。CNN用以提取特征,LSTM用于处理时间序列数据并发现长短期相关性,而GA则用于优化参数选择,确保模型最佳性能。研究表明,相比单一CNN、LSTM以及未优化的CNN-LSTM模型,提出的模型在误差率指标上显著提高预测准确性。具体而言,在均方误差(MSE)、平均绝对误差(MAE)和平均绝对百分比误差(MAPE)方面表现出更好的表现。作者还强调了未来改进方向,如纳入宏观经济因素和延长预测周期。 适合人群:对金融市场特别是股价预测有兴趣的研究人员、交易员和投资者。 使用场景及目标:本模型适用于利用深度学习进行股票价格波动预测的需求,为决策提供更具可靠性的依据。 其他说明:文章详细阐述了数据准备流程和技术细节,并提供了实验设置与结果分析图表。同时指出了一些潜在的发展趋势,比如融合多种分析手段提升精度的可能性及其局限性讨论。

    【图像去噪】小波变换图像去噪【含Matlab源码 3726期】.md

    CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    燃料电池仿真模型:基于Cruise与Simulink联合开发,源文件全包的实战项目解析,燃料电池仿真模型:基于Cruise与Simulink联合开发,源文件全包的实战项目解析,燃料电池仿真模型燃料电池

    燃料电池仿真模型:基于Cruise与Simulink联合开发,源文件全包的实战项目解析,燃料电池仿真模型:基于Cruise与Simulink联合开发,源文件全包的实战项目解析,燃料电池仿真模型燃料电池仿真模型,本模型基于Cruise软件和 Simulink软件共同搭建完成,并基于实际项目搭建,本资料包包含所有源文件 ,关键词:燃料电池仿真模型;Cruise软件;Simulink软件;实际项目;源文件;,Cruise Simulink 联合建模的燃料电池仿真模型全套源文件分享

    基于图神经网络与潜在扩散模型的关系数据生成方法及其应用

    内容概要:本文介绍了一种新型的关系数据合成方法,主要利用了图神经网络(GNN)和潜伏扩散模型。作者提出用异构图表示关系数据库,采用分阶段的方式:首先训练一个变分自编码器(VAE),获得表格数据的联合表征;然后通过图形嵌入对扩散过程进行条件化建模,从而捕捉跨不同表格属性之间的关系。这种组合允许模型既保持数据的结构性质又保存统计特性,适用于多表基准测试,并展示了优异的效果,特别是在多表保真度方面表现最佳。同时,本文探讨了一些潜在挑战如未见图形结构生成的可能性以及模型优化整合的可能性,为未来的研究方向提供了有价值的参考。 适合人群:从事机器学习尤其是深度学习领域的研究者、数据科学家或者想要进一步探索合成数据分析的应用和技术的企业从业者,他们关注于关系型数据的生成,有较深厚的技术背景并希望通过最新的深度学习进展提升自己的技能。 使用场景及目标:该方法旨在解决现有数据稀缺、隐私担忧等问题下高质量合成关系数据的需求。具体应用场景如医疗数据隐私保护下的仿真、复杂系统模拟等领域,帮助使用者提高决策效率并确保合规性和数据安全性。 阅读建议:建议从了解传统关系数据生成的限制出发,在此基础上深入了解文中提出

    【毕业设计】java-springboot-vue多媒体素材库的开发与应用平台实现源码(完整前后端-mysql-说明文档-LunW).zip

    【毕业设计】java-springboot-vue多媒体素材库的开发与应用平台实现源码(完整前后端-mysql-说明文档-LunW).zip

    COMSOL流体仿真下的流固耦合现象:圆管内流体驱动物块移动与扇叶转动探究,COMSOL流体仿真:流固耦合下的圆管内流体驱动动态模拟-流体驱动物块移动与扇叶转动研究,comsol流体仿真 ,流固耦合

    COMSOL流体仿真下的流固耦合现象:圆管内流体驱动物块移动与扇叶转动探究,COMSOL流体仿真:流固耦合下的圆管内流体驱动动态模拟——流体驱动物块移动与扇叶转动研究,comsol流体仿真 ,流固耦合,圆管内流体驱动物块的移动和 流体驱动扇叶的转动 ,comsol流体仿真;流固耦合;圆管内流体驱动物块移动;流体驱动扇叶转动,Comsol流体仿真:圆管内流固耦合与流体驱动的物块移动及扇叶转动研究

    AI大模型学习与使用-matlab-CH03.rar

    AI大模型学习与使用-matlab-CH03.rar

Global site tag (gtag.js) - Google Analytics