`

从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的“论面向组合子程序设计方法“的一系列文章,看了个大概,也有些收获。

相关推荐

    FX5UPLC以太网通讯实例:SOCKET通讯、SLMP协议通讯、JE-C伺服电机控制及Modbus通讯等真实验证程序套

    内容概要:本文详细介绍了三菱FX5U PLC在工业自动化领域的以太网通讯实战经验,涵盖多种常见通讯方式的具体实现方法。主要内容包括:两台PLC之间的Socket通讯,通过C#上位机使用SLMP协议读取PLC寄存器,JE-C伺服电机的以太网控制,以及Modbus RTU和TCP的应用。每种通讯方式均提供了具体的代码示例和调试技巧,确保读者能够快速理解和应用。此外,还特别强调了常见的避坑指南,帮助解决实际操作中可能出现的问题。 适合人群:从事工业自动化、PLC编程及相关领域的工程师和技术人员,特别是那些希望深入了解三菱FX5U PLC以太网通讯机制的人群。 使用场景及目标:适用于需要进行PLC间通讯、PLC与上位机通讯、伺服电机控制以及Modbus协议应用的实际工程项目。目标是提高通讯效率,减少调试时间和错误发生率。 其他说明:文中提供的代码均为经过产线验证的真实程序,可以直接应用于实际项目中。同时,作者分享了许多宝贵的实践经验,有助于读者更好地掌握相关技能并避免常见错误。

    2025年下半年电子商务设计师考试电子商务基础知识真题.doc

    2025年下半年电子商务设计师考试电子商务基础知识真题.doc

    中国粮食安全系统转型指数研究数据集(2000-2021)

    作者基于“自然—社会—经济”复合系统的三重视角,将粮食安全系统划分为粮食生产的资源与环境、生产与供给、分配与消费3个层面,运用“压力—状态—响应(Pressure-State-Response, PSR)”模型的3维框架,遴选30项具体指标(人均耕地面积、粮食单产、基尼系数等),构建粮食安全系统转型的评价指标体系,通过输入这些指标的数据,计算得到中国省域粮食安全子系统转型指数与系统综合指数,即中国粮食安全系统转型指数研究数据集(2000-2021)。该数据集内容包括31个省(直辖市、自治区)数据(香港、澳门、台湾数据暂缺):(1)粮食安全3个子系统的转型指数;(2)系统转型综合指数。数据集存储为.xlsx格式,由1个数据文件组成,数据量为53 KB。基于该数据集的研究论文发表在《地理学报》2024年79卷第9期。杨一单, 姚成胜*, 刘伟芳. 中国粮食安全系统转型指数研究数据集(2000-2021)[J/DB/OL]. 全球变化数据仓储电子杂志(中英文), 2025.

    西门子S7-1200PLC自定义堆栈FB块实现:先进先出与后进后出功能的数据管理程序

    内容概要:本文详细介绍了为西门子S7-1200 PLC开发的一个自定义堆栈程序。由于S7-1200未提供内置堆栈功能,作者使用SCL(Structured Control Language)编写了一个通用型堆栈功能块(FB),能够实现FIFO(先进先出)和LIFO(后进先出)的数据管理。该堆栈程序支持多种数据类型(如BOOL、REAL、DWORD等),并提供了入栈、出栈、清空等功能。文中还讨论了具体的实现细节,如边界检测、指针管理和环形缓冲区的设计,以及在实际工业环境中的应用效果。 适合人群:从事PLC编程、自动化控制系统开发的技术人员,尤其是熟悉西门子S7-1200系列PLC的工程师。 使用场景及目标:适用于需要临时存储和管理数据的应用场景,如生产线上的配方管理、设备故障回溯、日志记录等。通过自定义堆栈程序,可以提高数据处理效率,减少因缺乏内置堆栈功能而带来的不便。 其他说明:该堆栈程序已在实际生产环境中运行超过三个月,处理了大量数据,表现出良好的稳定性和性能。未来计划进一步优化,如改进为环形缓冲区以提升性能。

    直流有感无刷电机控制资料:多功能驱动器

    内容概要:本文详细介绍了专用于直流有感无刷电机的一款高性能驱动器。该驱动器不仅支持宽泛的电压与电流范围(9V-36V,5A),还提供多种输入信号形式(电位器、开关、PWM、RS485等)。其调速方式多样化,涵盖占空比调速、速度闭环控制和电流控制。此外,驱动器拥有霍尔自学习功能,能自动识别霍尔信号顺序,极大地简化了安装步骤。稳速控制响应迅速,能在1秒内完成正反转切换,且在极低速状态下仍能保持稳定运行。文中提供了多个Arduino和Python代码片段,展示了不同功能的具体实现方法。 适合人群:电机控制系统开发者、电子工程爱好者以及从事机器人、自动化设备等领域工作的工程师。 使用场景及目标:适用于小型设备、机器人、精密仪器等需要精准电机控制的场合。主要目标是帮助用户理解并掌握这款驱动器的特点,以便将其应用于实际项目中,提升系统的灵活性和可靠性。 其他说明:文章强调了驱动器在实际应用中的便捷性和高效性,特别是在霍尔自学习、稳速控制等方面的优势。同时,通过具体的代码实例,使读者更容易理解和实践这些功能。

    昆仑通态恒压供水PLC组态程序:三菱FX系列可靠运行,界面美观整洁的解决方案

    内容概要:本文详细介绍了使用昆仑通态MCGS组态软件和三菱FX3U PLC构建恒压供水系统的具体实现方法及其优化措施。主要内容涵盖HMI界面设计、PLC编程逻辑、PID控制参数整定、通信配置以及故障处理等方面。文中展示了多个关键代码片段,如压力设定值绑定、PID控制逻辑、水泵切换逻辑等,并分享了一些实用技巧,如动态水流效果、报警管理、压力波动处理等。此外,作者还强调了系统的可靠性和用户体验,通过实例证明了该方案在现场的实际表现。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对恒压供水系统感兴趣的从业者。 使用场景及目标:适用于需要设计和实施恒压供水系统的工程项目,旨在提高系统的稳定性、可靠性和易用性,同时降低维护成本并提升用户体验。 其他说明:文章提供了丰富的实战经验和代码示例,帮助读者更好地理解和掌握相关技术和应用场景。

    基于51单片机和LabVIEW的'虚拟GPS接收机'设计报告及源程序,可硬件实现

    内容概要:本文详细介绍了如何利用51单片机(STC89C52)和LabVIEW搭建一个能够运行的虚拟GPS接收机系统。硬件方面,主要讨论了单片机的选择、串口通信的稳定性以及电源管理等问题;软件方面,则着重讲解了NMEA-0183协议的解析、坐标生成算法及其在LabVIEW中的实现。此外,还探讨了一些常见的调试问题及解决方案,如波特率误差、数据解析错误等。通过该项目,读者不仅可以掌握GPS系统的原理,还能深入理解单片机编程和LabVIEW的应用。 适合人群:对嵌入式系统和GPS技术感兴趣的电子爱好者、学生及初级工程师。 使用场景及目标:① 学习51单片机的基础编程技能;② 掌握LabVIEW的基本使用方法;③ 理解GPS协议(NMEA-0183)的工作原理;④ 提升硬件电路设计能力,特别是串口通信和电源管理方面的经验。 其他说明:文中提供了详细的代码示例和调试技巧,帮助读者更好地理解和实现项目。同时,也鼓励读者进行进一步的创新和改进,如加入加速度计模块或支持更多类型的GPS协议。

    2023年软件结构化面试资料.doc

    2023年软件结构化面试资料.doc

    正弦波发生器电路仿真实验

    正弦波发生器电路仿真实验,选择LM417运算放大器进行实验,实现正弦波的生成

    GS276D:反激式隔离AC-DC开关电源设计(5V/2.4A)资料

    内容概要:本文详细介绍了基于GS276D芯片的5V/2.4A反激式隔离AC-DC开关电源设计方案。首先概述了电源的基本参数和特点,如输入电压范围为85-265VAC,输出为5V/2.4A,内置700V高压启动等功能。接着深入探讨了变压器设计、EMI优化、保护电路配置、动态峰值限制以及绿色模式下的节能措施等多个关键技术环节。文中提供了具体的计算方法、调试经验和优化技巧,如变压器初级电感量的计算、RC吸收电路的应用、过流保护的配置等。此外,还分享了许多实际调试过程中遇到的问题及其解决办法,如输出电压跳动、EMI超标等问题。 适合人群:具有一定电力电子基础的技术人员、电源设计师、硬件工程师。 使用场景及目标:适用于需要设计高效、稳定的反激式开关电源的场合,帮助工程师理解和掌握GS276D芯片的工作原理及应用技巧,提高产品性能和可靠性。 其他说明:文章不仅提供了详细的理论分析和技术指导,还结合了大量的实践经验,有助于读者更好地应对实际项目中的挑战。

    彩虹易支付最新升级版源码下载/BUG修复与订单投诉功能增强

    彩虹易支付最新升级版源码下载/BUG修复与订单投诉功能增强。该系统也没版本号,此版本目前是比较新的版本,增加了订单投诉功能,和一个好看的二次元模板。 此版本是全开源版,无一处加密文件

    灌装线自动化控制系统:SCL+顺控GRAPH西门子PLC1500,详解PLC和触摸屏程序,涵盖配方、报警记录、液位读取、重量读取,全程中文注释

    内容概要:本文详细介绍了西门子S7-1500 PLC平台上使用SCL(结构化控制语言)和GRAPH图形化编程工具来构建灌装生产线控制系统的方法。文中首先概述了系统的总体架构,包括主程序OB1作为调度中心,利用CASE语句进行模式切换,并确保模式间的平稳过渡。接着深入探讨了配方管理机制,采用结构体数组存储和验证配方参数,以及通过HMI界面方便地选择和修改配方。对于关键工序如灌装,则运用GRAPH绘制流程图,实现了更加直观易懂的状态转移逻辑,尤其强调了异常处理的灵活性。此外,针对传感器数据处理方面,提出了有效的滤波算法以提高测量精度。最后提及了报警日志的设计思路,即使用带有时间戳的环形队列记录故障信息,便于后期查询和诊断。同时,还分享了一些实用技巧,例如避免直接读写报警记录导致性能下降的问题。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是那些正在或将要使用西门子PLC进行项目开发的人群。 使用场景及目标:适用于需要高效、可靠地完成复杂任务的制造业环境,特别是在食品饮料等行业中常见的灌装生产线。其目的是帮助开发者掌握如何结合SCL和GRAPH的优势,优化PLC编程,提升系统的响应速度、稳定性和可维护性。 其他说明:文章不仅提供了具体的编程实例,还分享了许多实践经验,有助于读者更好地理解和应用相关技术。

    b2c电子商务物流管理走向何方?.docx

    b2c电子商务物流管理走向何方?.docx

    FPGA以太网TCP IP协议栈源码分享:支持千兆、万兆速率,包含TOE技术,含ping、arp、igmp、udp、tcp及dhcp功能,适用于k7板卡测试工程,纯hdl移植便捷。

    内容概要:本文介绍了一款纯HDL实现的FPGA以太网TOE TCP/IP协议栈,支持千兆和万兆以太网,涵盖ping、arp、igmp、udp、tcp、dhcp等多种协议。该项目提供了清晰的代码结构,包括MAC层、IP层、TCP/UDP层、ARP、ICMP和DHCP模块,以及K7板卡的测试工程。代码实现简洁明了,便于移植到其他FPGA平台。文中详细介绍了各模块的工作原理,如ARP请求发送、Ping功能测试、TCP状态机等,并展示了其高效性和稳定性。此外,项目还提供了详细的移植指南,确保初学者也能轻松上手。 适合人群:对FPGA网络开发感兴趣的工程师和技术爱好者,尤其是有一定FPGA开发经验的人群。 使用场景及目标:适用于需要在网络设备中集成高效TCP/IP协议栈的应用场景,如嵌入式系统、网络加速设备等。目标是帮助开发者深入了解TCP/IP协议栈的工作机制,并提供一个高性能、易移植的解决方案。 其他说明:项目源码和文档齐全,可在GitHub上找到更多资源。文中提到的优化技巧和实际测试数据有助于进一步提升系统的性能和可靠性。

    2023年项目管理专升本阶段性作业.doc

    2023年项目管理专升本阶段性作业.doc

    idl_code_and_sample_data_for_computing_accuracy_metrics.zip

    计算融合图像(IDL 和 Python 代码)全方位性能评估(APA)指标及绘制 APA 图表的 R 代码

    西门子S7-1200 PLC编程实例:G120变频器与V90伺服驱动运动控制模板及HMI模板

    内容概要:本文详细介绍了基于西门子S7-1200 PLC、G120C变频器和V90伺服驱动的运动控制程序模板。涵盖了标准气缸块、G120C 352报文DP通信控制块、V90伺服控制写法、车型信息传递标准块以及配套的TP900 HMI模板五个主要部分。通过具体代码示例展示了各组件的工作原理及其在实际应用中的配置方法,帮助读者快速掌握这套系统的开发要点和技术细节。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些希望深入了解西门子S7-1200 PLC、G120C变频器和V90伺服驱动集成应用的专业人士。 使用场景及目标:适用于需要构建高效稳定的运动控制系统的企业和个人开发者。通过学习本模板,可以提高开发效率,减少重复劳动,同时确保系统的稳定性和可靠性。 其他说明:文中提到的所有代码片段均来自真实项目案例,具有很高的参考价值。此外,还提供了关于开发环境配置的重要提示,如TIA Portal版本要求等,有助于避免常见的安装和兼容性问题。

    FPGA USB 3.0与PC通信解决方案

    内容概要:本文详细介绍了利用FPGA(特别是赛灵思Artix-7)与PC之间的USB3.0通信解决方案。首先讨论了硬件选型,选择了性价比高的Artix-7 A35T FPGA和带有ARM核的CYPRESS CYUSB3014 USB3.0控制器。文中提供了具体的硬件连接注意事项,如差分线等长、使用特定连接器等。接着深入探讨了固件开发,包括FPGA端的AXI Stream数据打包和USB控制器的Slave FIFO配置,并给出了详细的Verilog代码示例。对于上位机软件开发,则分别展示了Python+libusb和C#两种方式的具体实现方法及其优缺点。此外,还特别提到了一些常见的调试技巧和潜在的问题,如USB枚举问题、GPIF配置错误以及电平兼容性问题等。 适用人群:适用于有一定FPGA开发经验的研发人员,尤其是那些希望提高FPGA与PC间数据传输效率的技术人员。 使用场景及目标:主要应用于需要高速数据传输的应用场景,如图像处理、实时数据分析等。目标是帮助开发者掌握一种经济高效的FPGA与PC通信方案,从而降低开发成本并提高性能。 其他说明:文中不仅提供了完整的代码示例和技术细节,还分享了许多实用的经验教训,有助于读者避开常见陷阱。

    西门子PLC 1200控制步进电机驱动器 精细注释+PPT组态流程解析:截图细节指导学习

    内容概要:本文详细介绍了使用西门子S7-1200 PLC控制步进电机进行位置和速度控制的方法。首先讲解了硬件组态的关键步骤,如PLC与驱动器的接线、Profinet接口配置以及轴参数设置。接着深入探讨了位置控制模式下的绝对定位指令及其参数配置,强调了加减速曲线对设备稳定性的影响。对于速度控制模式,则分享了速度斜坡控制程序的编写方法,并解决了常见的丢步问题。此外,还提供了调试过程中的一些实用技巧,如使用Trace功能监测实际位置曲线、优化加减速时间和处理驱动器报警等。最后,文章建议将常用功能块封装成FB以便于后期维护。 适合人群:自动化工程师、PLC程序员、机电一体化技术人员。 使用场景及目标:适用于工业自动化生产线中需要精确控制步进电机的应用场合,帮助工程师掌握西门子S7-1200 PLC控制步进电机的具体实现方法和技术要点。 其他说明:文中包含大量实际案例和代码片段,有助于读者更好地理解和应用相关知识点。同时提醒读者注意一些容易忽视但至关重要的细节,如硬件连接、参数单位换算等。

    MATLAB程序:遗传模拟退火算法在移动机器人路径规划中的应用

    内容概要:本文详细介绍了如何利用MATLAB实现结合遗传算法和模拟退火算法的遗传模拟退火算法进行移动机器人路径规划。首先,通过创建动态障碍物的地图初始化,然后介绍路径编码方式以及适应度函数的设计,该函数综合考虑了路径长度和碰撞惩罚。接着阐述了遗传算法的交叉操作和模拟退火的扰动机制,解释了这两种方法如何协同工作以避免陷入局部最优解。此外,文中展示了动态显示路径进化的绘图循环,并讨论了路径平滑处理的方法。最后,通过实验验证了该混合算法相较于单一算法在效率和路径质量上的优势。 适合人群:对机器人路径规划感兴趣的科研人员、学生以及有一定MATLAB编程基础的研发人员。 使用场景及目标:适用于需要解决复杂环境中移动机器人路径规划的问题,旨在提高路径规划的效率和路径的质量,同时提供了一种可视化的解决方案。 其他说明:文中提供了详细的代码片段,帮助读者更好地理解和实现该算法。并且提到了一些有趣的实验现象,如障碍物数量过多时算法的表现,以及不同参数设置对结果的影响。

Global site tag (gtag.js) - Google Analytics