设计系统时,最好的做法是围绕您将要使用的框架进行设计吗?


37

在开发计划与某个框架一起使用的系统或应用程序时,最好的做法是在不考虑框架的情况下设计系统,还是最好以一种思维定势来设计系统,“那么框架将拥有更轻松的时间有了这个”。


4
您在说什么框架?您是说某种专门针对特定业务的利基框架,旨在解决特定行业的特定领域问题吗?(例如医疗,核能,国防,航空等)。还是在谈论旨在解决技术问题的通用框架?
本·科特雷尔

1
解决技术问题的通用框架
Robert Pounder

2
由于时间紧迫,规模较小(我正在工作,可能稍后再进行说明):我正在编写一个系统,该系统生成基于设计的电子邮件。-如果我是用Laravel编写的,那么我可能会使用他们的模板引擎“刀片”来设计电子邮件,这将使系统的设计在流程方面更加简单。但是,如果要使用范本PHP或寻找另一个合适的替代模板系统,我将不得不编写模板引擎。这将增加设计过程,这个问题也涉及这个过程。
罗伯特·庞德

3
这个问题将产生很多截然不同的答案,因为“框架”和“设计”都是在我们行业中具有多种含义的单词。此外,即使对于框架的单一定义为“旨在解决技术问题的通用框架”,它也将取决于特定的框架-有些框架比另一些框架更自以为是。
stannius

1
如果在设计轮式公共交通工具的过程中一头雾水而被公交车撞倒,那就太糟糕了。

Answers:


51

您的设计应尽可能满足客户的需求。请记住,设计中包含一些小东西,例如:

  • 用户体验
  • 功能性
  • 您的应用程序各部分如何通信(与自身或与外部实体)

这些事情都不应该由框架决定。如果很明显您将为实现这些目标而奋斗,那么您可以选择一个新的框架来帮助您在开始编写代码之前实现这些目标。

一旦选择了适当的工具集(框架是一种工具),我建议以设计使用方式使用这些工具。您偏离框架设计的距离越远,您为团队增加的学习曲线就越大,出现问题的机会就越大。

简而言之

  • 为您的用户设计
  • 选择合适的工具来完成您的设计
  • 以设计使用方式使用工具

进一步的想法:

经过20多年的软件工程工作,并使用了多个框架,我学到了两个教训。所有框架都是一把双刃剑:它们既约束又使能。在查看上面提到的三大要素之前确定框架的问题是,对于中等(最好)的用户体验,您可能会损害良好的用户体验。否则您可能被迫偏离框架设计以完成某些特定功能。


3
然后,您需要与客户进行一些协商。解释您对他们施加的约束可以做什么和不能做什么。建议您选择X框架时如何改变。他们可能不愿意改变,而愿意经历降级的生活。否则他们可能会决定您知道自己在做什么并相信自己。这取决于客户。归根结底,您可以管理他们的期望。
Berin Loritsch '17

4
在这里,不同设计级别之间似乎有些混淆:系统设计和详细设计。对我来说,这个问题是在问详细的设计(实现方法),而不是系统(接口,并发性,数据量,用户界面,用户类型)。
Gusdor

2
如果问题绕过“技术设计”,那么语言和操作系统可能会在设计中有所推断。但是,设计不是实现。如果您在考虑Frameworks功能,那不是设计,而是努力。如果您基于框架优势来进行设计决定,请为遭受框架弱点做好准备。当弱点满足要求时,您将面临巨大的问题。最大的公司没有建立自己的娱乐框架。
Laiv

1
@Laiv很棒的评论!确实,这是“有些”。射钉枪和螺旋枪都可以固定东西,一个比另一个更可逆,工作更慢,更复杂。人们做出的每一个选择都是不可避免的折衷方案。您付钱,就把握机会。

1
@RobertPounder,这是一个设计系统需要确定解决方案是否适当的工具。我了解框架如何影响设计,但是它们不应该决定设计。
Berin Loritsch '17

27

框架自然会影响特定模块和子系统(例如GUI前端)的设计。正如提到的其他答案一样,如果您发现自己与所选框架作斗争,将会遇到困难。

但是,更广泛地讲,您应该避免让任何单一框架或技术支配或驱动整个系统架构的“大局”。大多数通用应用程序框架都不鼓励这样做,因此,如果您发现自己围绕一个框架编写整个系统,那么您可能正在做该框架的作者所不打算做的事情。

您可能会使用许多不同的框架来解决不同的问题。随着系统变得越来越复杂,您需要注意不要构建“泥泞的大球”。尽可能使您的系统保持模块化和松散耦合。通过编写包装程序和适配器将某些框架“隐藏”在远离其他组件的位置,可以更好地将某些框架置于抽象之后。GUI工具包往往只提供前端GUI功能,因此,这些GUI模块应远离系统的其余部分。

通用框架(例如UI框架,数据层框架等)不存在来规定系统的完整体系结构-最多它们可能会规定组件或模块的设计;例如,某些GUI技术针对特定的MV *模式。

系统的整体体系结构应主要由业务需求决定。您可能会发现自己严重依赖特定工具(例如,消息中间件工具或ORM框架)来将所有内容绑定在一起,但是如果您已将框架封装在诸如“服务”类的抽象中,遇到框架的局限性时,您不太可能发现自己受到该框架的束缚。

在进行大图设计时,请谨记以下几点:


有时,有些框架的作者似乎根本不介意让用户将应用程序代码紧紧地与框架结合在一起。

2
@COMEFROM-开发人员会鼓励将代码紧密耦合到框架,因为开发人员认为您选择他们的框架来解决与他们一开始就设计出的问题相同的问题。
JeffO

从设计原理到编码原理,您的主题有点偏离主题,但是我的意思是最基本的,如果业务要求是使用某个框架,该怎么办?(认为​​公司外包和内部开发人员只懂一种语言)我认为我应该在原始帖子中更清楚地说明这一点。
罗伯特·庞德

1
@RobertPounder我一直试图了解的真实点(也许不是很好)是,有时人们倾向于使用特定的框架作为整个应用程序的“基础”,这不可避免地导致业务逻辑和其他不相关的代码被不恰当地融合到该框架中-例如,将业务逻辑与UI控件相结合只是因为当时它很快就变得不那么容易。这很容易做到,所以要提防
Ben Cottrell

2
我必须不同意@nocomprende。并非所有未来的需求都可以预测,有时只是因为以前的软件很难扩展/维护而重写系统。
SeldomNeedy '17

7

是的,您应该尽可能地遵循框架“告诉”您要做的事情。

原因很简单,您越是坚持使用框架的“思考”方式,就越容易与其他开发人员讨论也使用该框架的问题/想法。

对于以后使用它的其他人,可以提高互操作性和易用性,如果您坚持使用所使用的任何东西的基本哲学,那么您将更好地理解和合并教程或常见的解决方案。

我能想到的是为什么您会“破坏”框架的唯一很好的理由是,鉴于其“默认”配置/原理的应用,您绝对需要它无法提供的功能。但是,那可能不是一个合适的框架。

基本上,这也可以应用于其他决策。您应该尽可能地使用所要使用的语言,因为如果您与其他人使用相同的语言,这会使事情变得更容易


由于问题的变化,您可能应该复习答案。您的答案实际上没有回答OP的问题。
Laiv

1
@Laiv我看不到它如何不能回答问题,尽管它可能与您对该主题的看法不符,但这仍然是一个答案。欢迎您编写自己的答案以显示所讨论主题的冲突性质。
FP

如果我自己讲得不好,不好意思。我的英语说得不太流利。我只是想说,国际海事组织,这个问题和你的回答是关于不同的事情。如果您认为他们没有,那就可以。我不会争辩。而已。
Laiv

1
绝对是这样。它类似于特定领域语言和类似想法的工作方式。产品是通过工具(框架)塑造的,而不是相反的。框架“胜出”。如果您无法结婚,请选择其他人。(提示:没有理想的框架。只是说

1
您的设计应该影响选择的框架(如果有的话),而不是相反。
RubberDuck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.