Answers:
如果对框架有意见,它将锁定或引导您进入其工作方式。
例如:有些人认为模板系统不应提供对用户定义的方法和函数的访问,因为它会使系统对返回原始HTML敞开大门。因此,自以为是的框架开发人员只允许访问数据结构。通过设计,该软件受到限制,并鼓励设计人员以自己的方式做事。
另一个示例(摘自信号链接)是Wiki。Wiki的设计者有很多意见。他们认为HTML对于人们来说太复杂了,因此他们想出了一种更自然的更新内容的方式。他们还剥离了精美的设计,因为他们认为重点应该更多地放在内容而不是设计上。
苹果在设计产品时有强烈的意见。
非优化的软件设计更像PERL / PHP。它允许开发人员并信任开发人员做出正确的决定,并将更多的控制权交给他们。
我也将Microsoft放在非专栏文章中。未定义Microsoft框架的一个很好的例子:.NET
。通过打开CLR和规范,它对各种语言和实现样式都开放了它。
固执己见的软件意味着基本上只有一种方法(正确的方法 ™)做事,而尝试以不同的方式做事将是困难而令人沮丧的。另一方面,以正确的方式进行处理可以使您使用软件进行开发变得非常容易,因为您必须做出的决策数量减少了,并且软件设计人员可以专注于使软件正常工作。如果您的问题很好地映射到了解决方案上,那么自以为是的软件可以很好地使用。解决那些未映射到提供的工具上的问题,可能是非常痛苦的事情。这里的一个例子是Ruby on Rails。
另一方面,非优化软件为用户(开发人员)留下了很大的灵活性。它并没有禁止解决问题的一种方法,而是提供了可用于以多种方式解决问题的灵活工具。不利的一面是,因为工具太灵活了,所以开发任何解决方案可能都比较困难。由于框架没有提供足够的帮助,因此许多解决方案可能必须由用户(开发人员)手动编码。您还必须更多地考虑如何提供解决方案,而中等水平的开发人员可能最终会获得较差的解决方案,而不是他们购买了某些有思想的软件。PERL可能是非优化软件的经典示例。
我的理想是一个非主观的框架,但有一个强有力的约定。我将ASP.NET MVC归为此类。实际上,所有软件在某种程度上都是自以为是(尽管可能不是PERL)。MVC在选择模型时有很强的约定,但是提供了许多解决这些约定中问题的方法。其中一些方法甚至可能破坏模型。但是,按照这样一个框架中开发的约定正确使用,确实是一件令人愉快的事情。
它基本上是一种软件,可以像作者认为的那样工作,而不是试图取悦所有人。这意味着很多人不会喜欢它,但是有的人会喜欢它。
Rails可能是一个自以为是的框架的典范示例:您以自己的方式做事,一切都很顺利。如果不这样做,那您就痛苦不堪。但这没关系-如果您不想按照自己的方式做事,就不想使用Rails。
为了平衡起见,我将提供一个(较为自以为是的)描述,它更适合于自以为是的方法(与其他一些答案相反)。
固执己见的框架提供了一条“黄金之路”,对于大多数人和大多数情况(在作者看来),这都是最佳实践。
但是,这并不一定意味着锁定。这意味着可能需要付出额外的努力才能以不同的方式做事。
观点较少的框架提供了许多不同的选项,由您自己决定。
固执己见的框架通常减轻了开发人员的负担,使他们无需重新发明轮子或一次又一次地思考同一问题,从而有助于专注于眼前的实际问题。
在开源世界中,您可以找到许多自以为是却又相互竞争的框架,因此您仍然可以选择。您只需要选择自己的黄金路即可。
固执己见的软件以这样的方式构建和设计,使其可以以某种方式轻松地做事。它比其他设计更喜欢某些设计模式。在此过程中,很难偏离开发该软件的软件开发风格。另一种表达方式是,它偏爱“惯例胜于配置”。即,由于软件假定了许多配置方面,因此配置选项非常有限。一旦理解了这些假设,自以为是的软件通常可以更快地掌握。
另一方面,未经优化的软件几乎没有做出任何假设。结果,未经优化的软件/软件开发框架通常会具有许多配置选项。开发人员通常必须对软件的各个方面做出很多决定。通常,会开发各种工具,以便更轻松地处理这些巨大的选项。例如,用于.NET的Visual Studio .NET,用于Java的Eclipse IDE等。精通软件通常比精通软件花费更长的时间。
很多人都将ASP.NET MVC称为“不受限制的”框架,而我只是想对此提出几点想法。
的确,ASP.NET MVC并不需要太多。您可以使用任何喜欢的持久性解决方案,例如Linq-to-SQL,ADO.NET实体,NHibernate等。
另一方面,MVC框架确实倾向于“约定优先于配置”,Phil Haack引用了这句话,该建议强烈建议遵循预定义的模式来定位控制器,视图,模型和其他代码。尽管您可以更改此行为,但使用潮流游泳更容易,并且对于大多数人来说,这样做没有问题。
在ASP.NET MVC周围也有很多有见识的人,我发现这些人导致了很多有偏见的教程,这些教程坚持要涵盖,例如单元测试和依赖注入。我全心全意地进行测试和关注点分离,但是我确实认为这样的话题会被轻描淡写,通常是在覆盖更有用的基础知识之前。
再有,我确实不得不承认,在那些领域中,框架本身完全可以采用您想要的任何单元测试解决方案,以及您想要使用的任何依赖项注入和模拟框架,因此我想这提供了另一个示例。灵活性,甚至在单元测试的“圣经重击”之内也是如此。
这是在框架中实现的约定数量以及已做出的决定数量。
例如,如果有5种(或更多种)不同的方式将表单数据提交给控制器操作(在ASP.NET MVC中就是这种情况),则该框架似乎是“不受质疑的”-决定已决定给你!
但是,如果该框架仅通过一种方式(通过直接禁用其他方式,或者通过大力鼓励它)启用了该功能(Fubu MVC就是这种情况),那么您可以说该决定已由框架做出,从而使框架自以为是。
您现在将看到的示例是ASP.NET MVC框架。它具有惊人的可扩展性,但是在某些方面却是失败的原因,没有任何肉。要进行数据访问吗?您必须自己编写。想要进行一些AJAX吗?同上。
但是,由于它具有高度的可扩展性,因此如果您在此基础上进行构建,则可以将其转变为一个自以为是的框架。这就是MVCContrib之类的方法,它们为您提供了特定的处理方法,这意味着您必须编写更少的代码。
这的确意味着,如果您想脱离观点,通常要做的工作要比处理原始版本的工作多。不过,这是80/20的情况。如果您正确选择了自己的观点框架,那么您仅希望在20%的时间中摆脱观点,而在其他80%的时间中您将获得很高的生产力。