原文:https://herbertograca.com/2018/08/31/resource-method-representation/
這篇文章是軟件架構(gòu)編年史(譯)的一部分,這部編年史由一系列關(guān)于軟件架構(gòu)的文章組成惠啄。在這一系列文章中慎恒,我將寫(xiě)下我對(duì)軟件架構(gòu)的學(xué)習(xí)和思考,以及我是如何運(yùn)用這些知識(shí)的撵渡。如果你閱讀了這個(gè)系列中之前的文章融柬,本篇文章的的內(nèi)容將更有意義。
MVC 誕生于 1979 年趋距,它誕生于使用 CLI 用戶(hù)界面的桌面應(yīng)用上下文中粒氧,它暗示如果用戶(hù)外部因素導(dǎo)致數(shù)據(jù)庫(kù)變化,那么 UI 就應(yīng)該自動(dòng)地變化节腐。同樣的模式也可以完美地應(yīng)用在稍后出現(xiàn)的 GUI 桌面應(yīng)用上外盯。
然而,它卻和 Web 應(yīng)用一直在磨合中翼雀,因?yàn)榇蠖鄶?shù) Web 應(yīng)用不會(huì)用 UI 變化來(lái)作為服務(wù)端發(fā)生的變化的后果饱苟,它們總是從 UI 發(fā)起對(duì)服務(wù)端的調(diào)用來(lái)更新界面。
前面我已經(jīng)介紹過(guò) MVC 及其變種(譯)狼渊,而這篇文章將介紹另一個(gè)變種:Resource-Method-Representation箱熬。
我覺(jué)得需要介紹一下這種模式,并不是因?yàn)樵谖业膶?shí)踐中發(fā)現(xiàn)它是一種關(guān)鍵模式狈邑,而是因?yàn)樗?我后面另外要介紹的 ADR 模式常常被混為一談城须。
2008 – Resource-Method-Representation
RMR 由 Paul James 于 2008 年提出,它將 MVC 模式應(yīng)用到了 REST API 上下文之中米苹。
Resource
它的思想是將實(shí)體建模成 REST 資源(Resource酿傍,模式名稱(chēng)中的第一個(gè) R),它只有和 HTTP 方法對(duì)應(yīng)的公有方法:
<?php
// taken from http://www.peej.co.uk/articles/rmr-architecture.html
class Resource {
private resourceData = [];
method constructor(request, dataSource) {
// load data from data source
}
method get(request) {
return new Response(200, getRepresentation(request.url, resourceData));
}
method put(request) {
return new Response(405);
}
method post(request) {
return new Response(405);
}
method delete(request) {
return new Response(405);
}
}
Resource.php |
---|
Method
當(dāng)向 API 發(fā)出一個(gè)請(qǐng)求時(shí)驱入,它被路由給這些業(yè)務(wù)對(duì)象(即資源)中的一個(gè),然后對(duì)應(yīng)這個(gè)請(qǐng)求 HTTP 方法的資源中的一個(gè)方法(Method)被調(diào)用氯析。該業(yè)務(wù)對(duì)象方法接下來(lái)將負(fù)責(zé)返回一個(gè)包含狀態(tài)碼和標(biāo)頭的完整HTTP響應(yīng)亏较。
Representation
以 API 或發(fā)起請(qǐng)求的客戶(hù)端選擇的格式表示的資源就是展現(xiàn)(Representation),這些格式有掩缓,JSON雪情、XML 等等....展現(xiàn)就是由方法創(chuàng)建并返回給客戶(hù)端的響應(yīng)的內(nèi)容,如果有任何需要返回的內(nèi)容的話你辣。
我對(duì)這種模式的看法
MVC 模式是一種展現(xiàn)模式巡通,以一種將模型尘执、領(lǐng)域與用戶(hù)界面分離的方法。這曾經(jīng)是 MVC 的主要目標(biāo)宴凉,現(xiàn)在依然是誊锭。
而 RMR 模式超越了這個(gè)范疇。它告訴我們?nèi)绾卧O(shè)計(jì)我們的業(yè)務(wù)對(duì)象和領(lǐng)域?qū)ο竺殖2粌H如此丧靡,它還告訴我們領(lǐng)域?qū)嶓w應(yīng)該體現(xiàn)傳達(dá)機(jī)制:HTTP 方法。
這就意味著它不只是展現(xiàn)模式籽暇,而是架構(gòu)模式温治,因?yàn)樗绊憫?yīng)用的所有層次。它還意味著以這種模式構(gòu)建的應(yīng)用并非以領(lǐng)域?yàn)橹行慕溆疲且?HTTP 為中心熬荆。我們的實(shí)體最終擁有的是反應(yīng)傳達(dá)機(jī)制而非領(lǐng)域操作的方法。
我認(rèn)為用這種模式構(gòu)建小規(guī)模的 API 是可行的绸狐,但是我不認(rèn)為它可以用在企業(yè)級(jí)應(yīng)用中卤恳,因?yàn)槲蚁嘈牌髽I(yè)級(jí)應(yīng)用需要領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法,以及與之相符的以領(lǐng)域?yàn)橹行牡能浖_(kāi)發(fā)策略六孵。
還有纬黎,我完全同意 Anthony Ferrara 所說(shuō)的:
更不用說(shuō)它將自己與 HTTP 緊密地耦合在一起,以至于很難將其映射到 CLI 或 GUI 界面劫窒。
Anthony Ferrara 2014, Alternatives To MVC
引用來(lái)源
2008 – Paul James – Introducing the RMR Web Architecture
2014 – Anthony Ferrara – Alternatives To MVC