我认为我在最近的经历中发现,我设计软件的方式与大多数同行不同。在收集到足够的要求以获得软件中组件的高级概念之后,我倾向于采用增量自下而上的方法。
因此,在设计一个支持多个具体类的接口的情况下......我会看看每个具体候选人的共同点,询问我如何为每个具体的工作完成工作(同时思考关于为未来的具体做好准备)。然后我采用这组共性并建立一个界面,我认为这是一种“自下而上”的方法。
在自顶向下方法的情况下,我认为设计人员会查看接口的客户端以及客户端如何与接口交互,然后尝试实现具体类。
所以我可以看到自上而下/自下而上的优点和缺点。我只是想知道哪个更有效率,并根据您以前的经验提供更好的结果?
注意:我不是在谈论开发方法(敏捷,瀑布等),我在谈论设计方法。
答案 0 :(得分:16)
我相信,对于优秀的软件设计师(在我看来,所有软件开发人员也应该是某种程度上的软件设计师),神奇的是能够同时进行自上而下和自下而上的工作。
我的导师所做的“教育”是从上到下非常简短地了解所涉及的实体,然后自下而上找出我想要创建的基本元素,然后备份和看看我怎样才能达到一个级别,知道我对自下而上的结果的了解,等等,直到“他们在中间相遇”。
希望有所帮助。
答案 1 :(得分:4)
这取决于问题。
如果你知道问题是什么[让客户看到网上银行对账单],以及如何解决它,那么使用自下而上的方法。分析每个步骤,按区域将这些组合在一起并制定解决方案。基于项目计划。
如果您对问题有一个模糊的概念[允许现场代理通过分布式离线/在线维基进行通信],那么自上而下的方法会更好。查看所有问题以及可以使用哪些步骤来解决它们。试错。敏捷。
答案 2 :(得分:4)
没有完美的软件设计方法。没有办法可以保证完美的设计。
在为其设计解决方案时,您必须以不同的方式查看问题,并且当您有设计时,您应该以不同的方式查看它。如果从顶部接近它,你将不会想出相同的设计,就像从底部接近它一样。两者都是如此,并挑选两种方法给你带来的好处。
了解最高级别的问题并逐步解决问题,确定细节最终可能会改变设计的部分(您应该从最低级别接近细节并按照自己的方式进行操作)。继续迭代问题的所有组成部分,直到你有一个足以使用的设计。
Code Complete第5章真的有助于敲定我在这里所说的细节。我建议你看看。
答案 3 :(得分:2)
我不确定我是否正确理解了你的问题,但如果我有,你要求建立一个应用程序的优点/缺点,然后是界面而不是构建一个界面,然后构建应用程序以使其真正做到东西。
我会说很多答案取决于你正在开发/设计的谁。您的目标是为用户提供一个很酷且(可能)有用的应用程序吗?从UI开始。或者您是在尝试构建业务系统(可能已经存在)的接口,还是要完成已经以其他(效率较低)方式执行的任务?从任务开始。
答案 4 :(得分:0)
自下而上是我们很多人的代码。不是通过选择而是通过intellisense。 Petzold写了一篇关于这个here的文章。
在实践中,我认为你会发现大多数建筑师都是这样设计的。我个人认为我从来没有见过有人做过相反的设计(具体到抽象)。
当然,要求是具体的,但人们通常会使用要求来指导抽象并定义软件的目的和意图。