浅谈敏捷开发中的设计

article/2025/9/22 23:22:52

       敏捷开发在当今业界已经大行其道,想要快速交付,采用敏捷开发方法似乎是最好的方式,是否必须要用这就另当别论了。敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发,不过,想要真正做到快速交付,合理地根据实际情况采用敏捷开发才是正确的方式。

       当我们熟练的采用了敏捷开发后,不要以为开发人员就是编码就行了,编码前进行详细设计(本文中说到设计都指详细设计)才是保证软件质量的根本,敏捷也是一样要进行设计,只是设计输出相比传统的开发方式要简化,本文中说到设计都统一为详细设计。传统软件开发的详细设计一般有数据结构设计、代码结构设计、详细算法设计、复杂流程设计(流程图)、性能设计等。

对于数据结构设计,传统的方式和敏捷方式可以说并无差异,因为最终目标是转换成物理表结构和关系。数据结构设计更贴切的说是做模型设计,先定义好业务模型(领域模型),然后转换成PO实体模型,最后转成实际的物理表。下面以订单为例,讲解数据结构设计的过程。

   先进行领域模型设计, 简单的订单领域模型有订单信息和订单明细连个领域实体

 

补充PO实体模型应有信息的,转换成PO实体模型

 

PO模型与物理表结构是一一对应的,把PO模型添加上对应的主键、索引信息后转换成表结构创建的SQL脚本,数据结构设计工作就完成了。

        传统软件开发的代码结构设计,针对需求功能要先用UML图输出用例图、类图、时序图等,有复杂算法的要在类图中说明算法的实现说明,然后根据这些图进行代码主要结构的搭建,供开发人员补充详细的实现代码。敏捷开发就不需要画这么多开发人员都不想看的图,直接根据需求功能对应的用户故事设计核心代码结构,复杂算法直接在代码注释中说明,清晰、可读性高、命名友好的代码才是高质量代码的保证。下面是订单功能的代码设计示例:

领域模型有:订单信息领域模型(OrderInfoBo)、订单明细领域模型OrderDetailBo

PO实体有:订单信息PO实体(OrderInfoPo)、订单明细PO实体OrderDetailPo

订单信息领域模型:

/**

 * 订单信息领域模型.<br>

 */

public class OrderInfoBo {

    /**

     * 订单号.

     */

    private String orderNo;

    /**

     * 订单日期.

     */

    private Date orderDate;

    /**

     * 客户名称.

     */

    private String custName;

    /**

     * 订单总金额.

     */

    private BigDecimal totalAmount;

    public String getOrderNo() {

       return orderNo;

    }

    public void setOrderNo(final String newOrderNo) {

       orderNo = newOrderNo;

    }

    public Date getOrderDate() {

       return orderDate;

    }

    public void setOrderDate(final Date newOrderDate) {

       orderDate = newOrderDate;

    }

    public String getCustName() {

       return custName;

    }

    public void setCustName(final String newCustName) {

       custName = newCustName;

    }

    public BigDecimal getTotalAmount() {

       return totalAmount;

    }

    public void setTotalAmount(final BigDecimal newTotalAmount) {

       totalAmount = newTotalAmount;

    }

}

订单明细领域模型:

/**

 * 订单明细领域模型.<br>

 */

public class OrderDetailBo {

    /**

     * 商品名称.

     */

    private String prodName;

    /**

     * 商品名称.

     */

    private String prodprice;

    /**

     * 商品名称.

     */

    private String prodQty;

    public String getProdName() {

       return prodName;

    }

    public void setProdName(final String newProdName) {

       prodName = newProdName;

    }

    public String getProdprice() {

       return prodprice;

    }

    public void setProdprice(final String newProdprice) {

       prodprice = newProdprice;

    }

    public String getProdQty() {

       return prodQty;

    }

    public void setProdQty(final String newProdQty) {

       prodQty = newProdQty;

    }

}

订单信息PO实体:

/**

 * 订单信息PO实体.<br>

 */

public class OrderInfoPo {

    /**

     * 订单ID.

     */

    private String orderId;

    /**

     * 订单号.

     */

    private String orderNo;

    /**

     * 订单日期.

     */

    private Date orderDate;

    /**

     * 客户名称.

     */

    private String custName;

    /**

     * 订单总金额.

     */

    private BigDecimal totalAmount;

    public String getOrderId() {

       return orderId;

    }

    public void setOrderId(final String newOrderId) {

       orderId = newOrderId;

    }

    public String getOrderNo() {

       return orderNo;

    }

    public void setOrderNo(final String newOrderNo) {

       orderNo = newOrderNo;

    }

    public Date getOrderDate() {

       return orderDate;

    }

    public void setOrderDate(final Date newOrderDate) {

       orderDate = newOrderDate;

    }

    public String getCustName() {

       return custName;

    }

    public void setCustName(final String newCustName) {

       custName = newCustName;

    }

    public BigDecimal getTotalAmount() {

       return totalAmount;

    }

    public void setTotalAmount(final BigDecimal newTotalAmount) {

       totalAmount = newTotalAmount;

    }

}

订单明细PO实体:

/**

 * 订单明细PO实体.<br>

 */

public class OrderDetailPo {

    /**

     * 订单ID.

     */

    private String orderId;

    /**

     * 商品名称.

     */

    private String prodName;

    /**

     * 商品名称.

     */

    private String prodprice;

    /**

     * 商品名称.

     */

    private String prodQty;

    public String getOrderId() {

       return orderId;

    }

    public void setOrderId(final String newOrderId) {

       orderId = newOrderId;

    }

    public String getProdName() {

       return prodName;

    }

    public void setProdName(final String newProdName) {

       prodName = newProdName;

    }

    public String getProdprice() {

       return prodprice;

    }

    public void setProdprice(final String newProdprice) {

       prodprice = newProdprice;

    }

    public String getProdQty() {

       return prodQty;

    }

    public void setProdQty(final String newProdQty) {

       prodQty = newProdQty;

    }

}

 

有了领域模型和PO实体,还需要对PO实体操作和查询的接口,下面是设计的基本代码结构:

/**

 * 订单信息持久化接口.<br>

 */

public interface IOrderInfoDao {

    /**

     * 保存订单信息.

     * @param po

     */

    void save(OrderInfoPo po);

}

/**

 * 订单信息持久化<br>

 */

public class OrderInfoDao implements IOrderInfoDao{

    public void save(final OrderInfoPo newPo) {

       // TODO Auto-generated method stub

    }

}

/**

 * 订单信息查询接口.<br>

 */

public interface IOrderInfoQueryDao {

    List<OrderInfoPo> findByKey(final String orderId);

}

/**

 * 订单信息查询<br>

 */

public class OrderInfoQueryDao implements IOrderInfoQueryDao{

    public List<OrderInfoPo> findByKey(final String newOrderId) {

       // TODO Auto-generated method stub

       return null;

    }

}

/**

 * 订单明细持久化接口.<br>

 */

public interface IOrderDetailDao {

    /**

     * 保存订单明细.

     * @param po

     */

    void save(OrderDetailPo po);

}

/**

 * 订单明细持久化<br>

 */

public class OrderDetailDao implements IOrderDetailDao{

    public void save(final OrderDetailPo newPo) {

       // TODO Auto-generated method stub

    }

}

/**

 * 订单明细信息查询接口.<br>

 */

public interface IOrderDetailQueryDao {

    List<OrderDetailPo> findByKey(final String orderId);

}

 

/**

 * 订单明细查询<br>

 */

public class OrderDetailQueryDao implements IOrderDetailQueryDao{

    public List<OrderDetailPo> findByKey(final String newOrderId) {

       // TODO Auto-generated method stub

       return null;

    }

}

 

有了上面设计好清晰的代码框架,开发人员补充具体的实现,有复杂逻辑的要调整的及时沟通调整,这才是敏捷设计。

      对于传统软件开发的复杂流程设计(流程图)、性能设计,我认为在敏捷开发中也是不需要的,所有的内容体现就是代码,高质量的代码,可维护容易扩展的代码,可以快速交付,才是敏捷的核心思想。我们应该借鉴传统软件开发的经验,拥抱变化,敏捷设计。


http://chatgpt.dhexx.cn/article/xkQjR3GM.shtml

相关文章

什么是敏捷开发?敏捷开发流程的8个步骤

文章目录 一、什么是敏捷开发&#xff1f;二、敏捷开发模式的分类三、SCRUM 的工作流程四、敏捷开发流程的8个步骤包括&#xff1a;五、敏捷开发模型 一、什么是敏捷开发&#xff1f; 敏捷开发&#xff08;Agile&#xff09;是一种以人为核心、迭代、循序渐进的开发方法。 在…

什么是敏捷开发?教你正确理解敏捷开发

敏捷开发是相对于瀑布开发来说&#xff0c;一种轻量级的软件开发方式。敏捷开发是为了快速响应需求变化、通过组建跨职能团队实现持续不断的交付高质量的产品的方法的集合。所有符合敏捷宣言和敏捷开发十二项原则的方法都可以是敏捷开发的一种实践。 在大多数的敏捷开发实践过…

什么是敏捷开发?

什么是敏捷开发&#xff1f; 敏捷开发是一种以人为核心&#xff0c;迭代&#xff0c;循序渐进的开发方式。在敏捷开发中&#xff0c;软件项目的构建被切分成多个子项目&#xff0c;各个子项目的成果都经过测试&#xff0c;具备集成和可运行的特征。加单的说&#xff0c;敏捷开…

GridView 激发了未处理的事件“PageIndexChanging”

在手动给gridview邦定数据源时&#xff0c;会出现这种情况 运行后直接显示分页的1,只有1显示正常,如果点选其它的,比如2或者4什么其它别的,提示: GridView“XXX”激发了未处理的事件“PageIndexChanging”。 手动分页必须有PageIndexChanging事件&#xff0c;添加PageI…

PageView的设置

1、创建一个PageView控件&#xff0c;自动生成background精灵和mask的view视图和indicator View下面有一个content&#xff08;Layout类型&#xff09; &#xff0c;content可以存放每页内容 页面指示器&#xff0c;可以清晰看当前是多少也 2、监听PageView事件 // 监听事件 o…

ViewPager和PageAdapter,FragmentPageAdapter,FragmentStatePageFragment

【Android】ViewPager深入解析&#xff08;一&#xff09; http://www.imooc.com/article/2580 2015-12-07 11:59:28 11830浏览 19评论 话说小伙伴们在使用App的时候有没有注意到很多App的首页都是可以左右滑动的页面呢&#xff1f;很多App还有绚丽的轮播图广告。那么如何实现这…

viewpager.setcurrentitem导致的ANR

参考&#xff1a;Java线程Dump分析工具–jstack dump 文件里&#xff0c;值得关注的线程状态有&#xff1a; 死锁&#xff0c;Deadlock&#xff08;重点关注&#xff09; 执行中&#xff0c;Runnable 等待资源&#xff0c;Waiting on condition&#xff08;重点关注&#x…

对GridView、DetailsView 和 FormView 控件分页属性的PagerSettings类的设置

如果想让分页导航加上图片形式或比如上一页下一页,这种样式,那就要在<GridView>写在这里面</GridView>控件中加上<PagerSettings></PagerSettings>,例如:<PagerSettings Mode="NextPreviousFirstLast" FirstPageText="首页"…

ViewPager + GridView实现GridView分页

概述 通过ViewPager实现GridView的分页 实现 ViewPager通过设置PagerAdapter实现分页。每一页的布局是一个GridView。GridView通过设置自己adapter渲染GridView。 ViewPager&#xff1a;分页器。 GridViewPageAdapter&#xff1a;继承自PagerAdapter。ViewPager的适配器。 Gr…

非常实用的GridView.PagerTemplate 属性

获取或设置 GridView 控件中页导航行的自定义内容。 命名空间:System.Web.UI.WebControls程序集:System.Web&#xff08;在 system.web.dll 中&#xff09; 语法&#xff1a;C# [TemplateContainerAttribute( typeof (GridViewRow))] public virtual ITemplate PagerTempla…

ViewPager的PagerAdapter中的notifyDataSetChanged更新数据总结

最近在工作中遇到了一个问题&#xff0c;就是在viewpager中调用pageradapter.notifydatasetchanged方法&#xff0c;好像没有任何效果&#xff0c;相应的view也没有更新数据&#xff0c;根据官方API是这样解释的&#xff1a;大概是说明Adapter会自动管辖ViewPager每一页(Item)的…

GridView1_PageIndexChanging 分页

//这里点击页面会报错所以要写这个 然后从新刷新一下 可以调一下属性什么的 this.GridView1.PageIndex e.NewPageIndex;jiazai(); c#后台写弹窗 跳转 Response.Write("<script>alert(修改成功);window.location.hrefhttp://localhost:65390/%E6%88%BF%E5%B1…

ViewPager控件之PagerAdapter适配器

一、ViewPager的基本用法 1、简介 ViewPager可以实现多个界面的左右滑动。ViewPager最典型的应用场景主要包 括引导页导航&#xff0c;轮转广告和页面菜单。 ViewPager最早出自4.0版本,为了兼容低版本安卓设备&#xff0c;谷歌官方给我们提供了 一个的软件包android.support.v4…

ViewPager onPageChangeListener总结

android ViewPager滑动事件讲解 今天在做项目的时候&#xff0c;由于要处理viewPager页面滑动的事件&#xff0c;所以对其进行了一个小小的研究&#xff1a; 首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法&am…

ViewPager onPageChangeListener总结

android ViewPager滑动事件讲解 今天在做项目的时候&#xff0c;由于要处理viewPager页面滑动的事件&#xff0c;所以对其进行了一个小小的研究&#xff1a; 首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener OnPageChangeListener这个接口需要实现三个方法&#…

iscsi命令

iscsi客户端命令 iscsiadm 1.发现target设备 iscsiadm -m discovery -t sendtargets -p 10.12.22.61 疑问&#xff1a;10.12.22.60&#xff1a;3260&#xff0c;1 1表示什么意思(表示portal group tag,参考补充资料1)&#xff0c;此外&#xff0c;为什么连同ip为60的信息…

iSCSI 协议

iSCSI 协议 iSCSI协议结构 如同任何一个协议一样&#xff0c;iSCSI也有一个清晰的层次结构&#xff0c;根据OSI模型&#xff0c;iSCSI的协议栈自顶向下一共可以分为五层&#xff0c;如图所示&#xff1a; SCSI层&#xff1a;根据应用发出的请求建立SCSI CDB(命令描述块)&…

Linux与ISCSI

ISCSI&#xff08;Internet Small Computer System Interface&#xff09;:Internet 小型计算机系统接口&#xff0c;是一个基于 TCP/IP 的协 议&#xff0c;主要用于通过 IP 网络仿真 SCSI&#xff0c;从而为远程块存储设备提供数据传输和管理。说白了&#xff0c;就是通过 网…

ISCSI服务

Internet Small Computer System Interface:Internet 小型计算机系统接口&#xff0c;是一个基于 TCP/IP 的协 议&#xff0c;主要用于通过 IP 网络仿真 SCSI&#xff0c;从而为远程块存储设备提供数据传输和管理。说白了&#xff0c;就是通过 网络由专门的服务器提供存储管理&…