約定優於配置

維基百科,自由的百科全書
前往: 導覽搜尋

約定優於配置convention over configuration[1],也稱作按約定編程[2],是一種軟體設計範式,旨在減少軟體開發人員需做決定的數量,獲得簡單的好處,而又不失靈活性。

本質是說,開發人員僅需規定應用中不符約定的部分。例如,如果模型中有個名為Sale的類,那麼資料庫中對應的表就會默認命名為sales。只有在偏離這一約定時,例如將該表命名為"products_sold",才需寫有關這個名字的配置。

如果您所用工具的約定與你的期待相符,便可省去配置;反之,你可以配置來達到你所期待的方式。

動機[編輯]

設計不好的框架通常需要多個配置文件,每一個都有許多設置。這些配置文件為每一個項目提供信息說明從URL到將類映射到資料庫表的各種信息。大量包含太多參數的配置文件通常是過度複雜的應用設計的指標(代碼壞味道)[3]

例如,在知名的Java對象關係映射框架Hibernate的早期版本中,將類及其屬性映射到資料庫上需要是在XML文件中的描述,其中大部分信息都應能夠按照約定得到,如將類映射到同名的資料庫表,將屬性分別映射到表上的欄位。後續的版本拋棄了XML配置文件,而是使用這些恰當的約定,對於不符合這些約定的情形,可以使用Java 標註來說明(參見下面提供的JavaBeans規範)。

使用[編輯]

項目的目錄結構展示了Maven所約定了原始碼的位置,只需配置很少的信息就可以自動完成編譯,測試和打包等工作。

許多新的框架使用了約定優於配置的方法,包括:Spring[4]Ruby on Rails[5],Kohana PHP,Grails[6]GrokZend FrameworkCakePHPsymfonyMavenASP.NET MVCWeb2py(MVC),Apache Wicket

這是一個古老的概念, 甚至在Java類庫中也可以找出這一概念的蹤跡。例如,JavaBean規範非常多的依賴這一概念。下面摘錄JavaBeans 1.1版規範的一段:[7]

按照一般的規則,我們不希望造出一個奇怪的java.beans.everything類,其他類需要從該類派生。而是希望在運行時JavaBeans為一般的對象提供預設的行為特徵,但是允許對象通過繼承特定的java.beans.something接口來覆蓋預設的行為特徵的一部分。[8]

參考文獻[編輯]

  1. ^ 也譯作慣例優於配置,慣例優先原則
  2. ^ Coding by convention
  3. ^ C2 Wiki (2009-09-01). Too Many Parameters. C2 Wiki, 1 September 2009. Retrieved from http://c2.com/cgi/wiki$?TooManyParameters.
  4. ^ Chapter 13.11 describes the application in the context of spring model/view/controller http://static.springsource.org/spring/docs/2.0.x/reference/mvc.html
  5. ^ http://rubyonrails.org/, advertises the paradigm right from 'home'
  6. ^ a description of configuration with the goal of convention http://grails.org/Unified+Configuration, and relationship to bean referencing from spring 存檔副本. [2010-09-29]. (原始內容存檔於2010-10-28). 
  7. ^ Sun (no date). JavaBeans specification, section 1.4. Retrieved from http://java.sun.com/javase/technologies/desktop/javabeans/docs/spec.html.
  8. ^ "As a general rule we don't want to invent an enormous java.beans.everything class that people have to inherit from. Instead we'd like the JavaBeans runtimes to provide default behaviour for 'normal' objects, but to allow objects to override a given piece of default behaviour by inheriting from some specific java.beans.something interface."

外部連結[編輯]

參見[編輯]