it-swarm.asia

什么是自以为是的软件?

我经常看到人们说某些软件“非常自以为是”,或者微软倾向于编写“无意见”的框架。这究竟意味着什么?

200
zvolkov

如果一个框架是固执己见的,它会锁定或引导你进入他们的工作方式。

例如:有些人认为模板系统不应该提供对用户定义的方法和函数的访问,因为它使系统保持打开以返回原始HTML。因此,一个自以为是的框架开发人员只允许访问数据结构。通过设计,该软件是限制性的,并鼓励设计师以自己的方式做事。

另一个例子( 取自信号链接 )是 wiki 。维基的设计者有很多意见。他们认为HTML太复杂,人们无法写,所以他们想出了一种更自然的方式来更新内容。他们也剥夺了它的花哨设计,因为他们觉得重点应该放在内容而不是设计上。

Apple在设计产品时有很强的意见。

不同意见的软件设计更像是Perl/PHP。它允许开发人员并信任开发人员做出正确的决策并将更多控制权交给他们。

我也会把微软置于非自以为是的专栏中。 Microsoft框架的一个很好的例子,它没有被贬低:.NET。通过打开CLR和规范,它打开了各种语言和实现风格。

206
cgp

意见软件意味着基本上有一种方式( 正确方式 ™)来做事情,尝试以不同方式做事将是困难和令人沮丧的。另一方面,使用 正确的方式 ™可以使软件开发变得非常容易,因为您必须做出的决策数量减少,软件设计人员能够专注于制作软件工作量增加了。如果您的问题很好地映射到解决方案,那么使用意见软件可以很好用。解决问题中未映射到所提供工具的那些部分可能是一个真正的痛苦。这里的一个例子是Ruby on Rails。

另一方面,非固定标准的软件为用户(开发人员)留下了很多灵活性。它没有禁止解决问题的一种方法,但提供了可用于以多种方式解决问题的灵活工具。这可能是因为工具非常灵活,因此开发任何解决方案可能相对困难。更多的解决方案可能必须由用户(开发人员)手动编码,因为框架没有提供足够的帮助。您还必须考虑更多关于如何提供解决方案的问题,而平庸的开发人员可能最终得到的解决方案比他们购买某些固定软件的解决方案更差。 Perl可能是非固化软件的典型例子。

我的理想是一个非自以为是的框架,但具有强烈的惯例。我会把ASP.NET MVC放在这个类别中。实际上,所有软件都在某种程度上是固执己见的(尽管可能不是Perl)。 MVC在选择模型时有很强的约定,但提供了许多不同的方法来解决这些约定中的问题。其中一些方法甚至可能打破模型。然而,正确使用,根据在这样的框架中发展的惯例可能是一个真正的快乐。

62
tvanfosson

它基本上是软件,它的作者认为它应该工作的方式,而不是试图取悦所有人。这意味着很多人不会喜欢它,但那些喜欢它的人会喜欢它。

Rails可能是一个固定框架的典型例子:你按照自己的方式做事,一切都很顺利。如果你不这样做,那你就会有些痛苦。但是没关系 - 如果你不想按照自己的方式做事,你不想使用Rails。

22
Rytmis

为了平衡,我将提供一个(相当自以为是的)描述,这种描述更有利于自以为是的方法(与其他一些答案形成对比)。

意见框架提供了一条“黄金道路”,这应该是大多数人和大多数场景(在作者眼中)的最佳实践。

然而,这并不一定意味着锁定。这意味着可能需要一些额外的努力来做不同的事情。

较少见解的框架提供了许多不同的选项,由您决定。

意见框架通常可以消除开发人员重新发明轮子的负担,或者一次又一次地重新考虑同样的问题,从而有助于专注于手头的真正问题。

在开源世界中,您可以找到许多自以为是的竞争框架,因此您仍然可以选择。你只需要选择自己的黄金道路。

8
dpan

Opinionated软件的构建和设计使其能够以某种方式轻松完成任务。它比其他设计模式更有利于某些设计模式。在这个过程中,它很难偏离开发它的软件开发风格。另一种表达方式是它支持“约定优于配置”。即配置选项非常有限,因为软件假设许多配置方面。一旦理解了假设,通常可以更快地掌握意见软件。

另一方面,Unopinionated软件几乎没有假设。因此,不受影响的软件/软件开发框架往往具有许多配置选项。开发人员通常必须就软件的各个方面做出很多决定。通常,开发了各种工具,以便更容易地处理这些巨大的选项。例如Visual Studio .NET for .NET,Eclipse IDE for Java等。无论是软件,通常需要更长时间才能掌握软件。

5
Kunal

tl; dr

  • 意见 :例如 Ruby on Rails 。有一种特别优选的做事方式,你可以通过这种方式得到很多支持。以其他方式做事很难,或者某些系统不可能(Cassandra浮现在脑海中)。
  • 没有见解 :例如 Perl 5 。你可以用任何方式做任何你喜欢的事情。所有款式均同样开放,有效且受支持。
5
00prometheus

很多人都将ASP.NET MVC作为一个“不受欢迎的”框架引用,我只是想对此进行一些思考。

确实,ASP.NET MVC并没有强制要求;您可以使用任何您喜欢的持久性解决方案,无论是Linq-to-SQL,ADO.NET实体,NHibernate等。

另一方面,MVC框架确实倾向于支持“约定优于配置”,引用Phil Haack,它强烈建议遵循预定义的模式来定位控制器,视图,模型和其他代码。虽然你可以改变这种行为,但它更容易与当前一起游泳,对大多数人来说,这样做没有问题。

围绕ASP.NET MVC也是很多自以为是的人,我发现这些人会导致许多有偏见的教程,这些教程坚持覆盖,例如单元测试和依赖注入;我都是为了进行良好的测试和关注点的分离,但我确实认为这些话题会被一点点扼杀,通常会覆盖更多有用的基础知识。

同样,我必须承认,在这些领域内,框架本身完全可以采用您想要的任何单元测试解决方案,以及您想要使用的任何依赖注入和模拟框架,所以我想这提供了另一个示例灵活性,甚至在单元测试的“圣经抨击”等中,似乎正在进行中。

3
Rob

这是在框架中实施的约定数量以及已经采取的决策数量。

例如,如果有5种(或更多种)不同的方式将表单数据提交给控制器操作(在ASP.NET MVC中就是这种情况),那么该框架似乎非常“不言自明” - 决定已经开始给你!

但是,如果框架启用(通过直接禁用其他方式,或通过强烈鼓励它)只有一种方法(Fubu MVC就是这种情况),您可以说框架已经做出了决定从而使框架舆论化。

2
mookid8000

您将在很多时候看到的示例是ASP.NET MVC框架。这是令人惊讶的可扩展性,但这是它在某些方面的垮台,没有任何肉。想要进行数据访问吗?你必须自己写。想要一些AJAX继续吗?同上。

但是,由于它是高度可扩展的,如果你在它上面构建,你可以把它变成一个自以为是的框架。这就像 MVCContrib do那​​样,它们为您提供了特定的处理方法,这意味着您必须编写更少的代码。

这确实意味着,如果你想要打破意见,那么通常需要做的工作比你在使用Vanilla版本时要多。这是一个80/20的场景。如果你正确地选择了自己认同的框架,那么你只想在20%的时间内脱离意见,而在其他80%的时间里你都会高效。

1
Garry Shutler