自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

站在開(kāi)發(fā)者的角度理解框架的設(shè)計(jì)思想

開(kāi)發(fā) 前端
因?yàn)槲宜臼怯肎oFrame做電商業(yè)務(wù)開(kāi)發(fā)的,而且我司同事基本都是PHP轉(zhuǎn)Go的。GoFrame可以說(shuō)是非常適合PHPer轉(zhuǎn)Gopher的開(kāi)發(fā)框架。

有問(wèn)必答

最近有好多讀者私信我,為什么選擇GoFrame做電商項(xiàng)目的開(kāi)發(fā)?

原因很簡(jiǎn)單:

因?yàn)槲宜臼怯肎oFrame做電商業(yè)務(wù)開(kāi)發(fā)的,而且我司同事基本都是PHP轉(zhuǎn)Go的。GoFrame可以說(shuō)是非常適合PHPer轉(zhuǎn)Gopher的開(kāi)發(fā)框架。

在入職我司之前,我有使用Gin和go-micro框架,目前也正在學(xué)習(xí)go-zero。

不管是開(kāi)發(fā)語(yǔ)言還是開(kāi)發(fā)框架,都服務(wù)于我們所做的業(yè)務(wù),拋開(kāi)業(yè)務(wù)去聊語(yǔ)言或者框架都是沒(méi)有意義的。

使用GoFrame做開(kāi)源項(xiàng)目的另一個(gè)原因是:想體驗(yàn)一下V2版本的新特性,自己的項(xiàng)目怎么做自己能完全說(shuō)了算,沒(méi)有歷史包袱。

前言

讓開(kāi)發(fā)者更好的做到“模塊內(nèi)部高內(nèi)聚,模塊之間松耦合”,是我認(rèn)為GoFrame V2設(shè)計(jì)的精髓。

用GoFrame開(kāi)發(fā)商業(yè)項(xiàng)目已經(jīng)很長(zhǎng)時(shí)間,發(fā)現(xiàn)GoFrame的版本更新比較快,社區(qū)也非常的活躍。

因?yàn)闅v史原因,我之前一直用V1.16版本做商業(yè)項(xiàng)目的開(kāi)發(fā),雖然個(gè)人有比較強(qiáng)的意愿升級(jí)到V2。

但是考慮到項(xiàng)目穩(wěn)定性及開(kāi)發(fā)成本等等原因,商業(yè)項(xiàng)目并未升級(jí)。這可能也是很多小伙伴面臨的問(wèn)題。

受到鼓勵(lì)

正好前段時(shí)間,分享了自己的開(kāi)源項(xiàng)目【Go WEB進(jìn)階實(shí)戰(zhàn)】基于GoFrame搭建的電商前后臺(tái)API系統(tǒng)受到了大家的關(guān)注和支持,GoFrame的作者也在點(diǎn)贊轉(zhuǎn)發(fā),更受鼓勵(lì)。

更重要的是:收到了社區(qū)里很多小伙伴的建議,最多的建議就是建議我使用V2版本,因?yàn)樘峁┝撕芏嘈绿匦?,可以更好的?shí)現(xiàn)需求,穩(wěn)定且高效。

決定升級(jí)

所以,我決定把我開(kāi)源的項(xiàng)目從V1.16.x版本,升級(jí)到最新的V2.2.0版本,踩一下升級(jí)的坑,享受一下升級(jí)后的快樂(lè)。

歡迎小伙伴們加入到我的開(kāi)源項(xiàng)目中:電商前后臺(tái)系統(tǒng)API[1],目前V1版本已經(jīng)收尾,包括電商項(xiàng)目的常用功能,開(kāi)發(fā)了120多個(gè)接口。

一起參與

V2版本在開(kāi)發(fā)過(guò)程中,目前已經(jīng)開(kāi)發(fā)了30多個(gè)接口,計(jì)劃這個(gè)月內(nèi)開(kāi)發(fā)完畢,也開(kāi)源出去。歡迎小伙伴們參與共建,也歡迎閱讀我的源碼,多提寶貴建議:

V2版本GitHub地址

因?yàn)閮?nèi)容比較長(zhǎng)且硬核,所以我決定分兩篇文章分享:

  1. 這篇文章重點(diǎn):介紹GoFrame V2的新特性,和V1相比有哪些優(yōu)勢(shì)?最大的變化是什么?
  2. 下一篇文章會(huì)分享一下:我從V1升級(jí)到V2的踩坑之旅,相信對(duì)很多小伙伴都有幫助。

這個(gè)經(jīng)歷實(shí)屬不易,希望小伙伴們可以點(diǎn)贊、關(guān)注、轉(zhuǎn)發(fā)一波。

適合看的人群

  1. 掌握Go基礎(chǔ)后,想用成熟框架開(kāi)發(fā)項(xiàng)目的伙伴,建議讀完我的文章之后,直接使用GoFrame最新的V2版本實(shí)戰(zhàn)開(kāi)發(fā)
  2. 目前在用V1版本,有意愿但是沒(méi)有大量精力學(xué)習(xí)V2新特性的伙伴,擔(dān)心升級(jí)問(wèn)題太高不敢貿(mào)然升級(jí)的伙伴們。
  3. 想提高自己學(xué)習(xí)新知識(shí)效率的小伙伴,歡迎復(fù)刻我的這種實(shí)踐方式。

站在開(kāi)發(fā)者的角度

不管你是哪種人群,都建議先花時(shí)間仔細(xì)閱讀官方文檔,尤其是 框架介紹[2]這部分。

區(qū)別于官方文檔,這篇文章會(huì)結(jié)合我自己的經(jīng)驗(yàn),站在框架使用者的角度,幫大家更快更好的理解Goframe V2版的設(shè)計(jì)思路,基于V2版本如何更好的進(jìn)行商業(yè)項(xiàng)目的開(kāi)發(fā)。

踩的坑

在我升級(jí)版本的過(guò)程中發(fā)現(xiàn):一定要先了解清楚V2的新特性,然后再?gòu)腣1升級(jí)到V2,否則升級(jí)到一半會(huì)出現(xiàn)無(wú)從下手的問(wèn)題:

  1. 因?yàn)橥ㄟ^(guò)V2版本的CLI工具生成的dao、model,和V1版本是不一致的:廢棄了gmvc模塊等,也引入了新的模塊。
  2. V2版本支持gf gen service的方式生成service層,統(tǒng)一我們接口邏輯的實(shí)現(xiàn)方式,引入了logic層和service層的概念

結(jié)合自己的升級(jí)經(jīng)歷,分享給大家學(xué)習(xí)GoFrame V2必知必會(huì)的知識(shí)點(diǎn):

必知必會(huì)

  1. 項(xiàng)目工程結(jié)構(gòu)發(fā)生了變化,且需要按照V2的標(biāo)準(zhǔn)來(lái),因?yàn)間f工具生成代碼的目錄結(jié)構(gòu)發(fā)生了改變,更重要的:V2官方建議的目錄結(jié)構(gòu)也是我們踐行"高內(nèi)聚低耦合"比較好的工程目錄結(jié)構(gòu)。
  2. gf gen dao除了會(huì)像V1一樣生成dao層和model層,還會(huì)另外生成do層和entity層
  3. V2版本的目錄結(jié)構(gòu)實(shí)踐了業(yè)務(wù)模型和數(shù)據(jù)模型解耦的思想(也是我認(rèn)為非常贊的地方)
  4. V2相比于V1會(huì)出現(xiàn)方法或者模塊廢棄的情況,比如廢棄了gmvc耦合模塊,未來(lái)不再進(jìn)一步支持。同時(shí)也為我們提供了更好的實(shí)現(xiàn)方式。
  5. V2有點(diǎn)編寫(xiě)“微服務(wù)”的意思了,需要服務(wù)注冊(cè):controller調(diào)用一個(gè)或多個(gè)service實(shí)現(xiàn)具體的業(yè)務(wù)邏輯;但是復(fù)雜的業(yè)務(wù)邏輯又不是在service中實(shí)現(xiàn)的,為了解耦,V2版本引入了logic目錄,用于編寫(xiě)和復(fù)用復(fù)雜的業(yè)務(wù)邏輯。在logic中注冊(cè)服務(wù),在service中通過(guò)接口方式規(guī)范logic層要實(shí)現(xiàn)的方法。

重中之重

下面再介紹一下我花了很長(zhǎng)時(shí)間才消化的知識(shí)點(diǎn):

dao代碼生成(很重要)

gf gen dao

在業(yè)務(wù)項(xiàng)目中,官方推薦使用dao/do/entity的方式操作數(shù)據(jù)庫(kù),這些文件都是通過(guò)開(kāi)發(fā)工具自動(dòng)生成的,由開(kāi)發(fā)工具統(tǒng)一維護(hù)。

區(qū)別于V1版本,V2版本引入了do的概念,為什么這么設(shè)計(jì)?

在這里我只說(shuō)結(jié)論,文章最后會(huì)附上官方鏈接:

  1. dao層用于數(shù)據(jù)訪問(wèn),這是一層抽象對(duì)象,用于和底層數(shù)據(jù)庫(kù)交互,僅包含最基礎(chǔ)的 CURD 方法
  2. model層是結(jié)構(gòu)模型,是數(shù)據(jù)結(jié)構(gòu)管理模塊,管理數(shù)據(jù)實(shí)體對(duì)象,以及輸入與輸出數(shù)據(jù)結(jié)構(gòu)定義。2.1 model中的do是領(lǐng)域?qū)ο螅糜赿ao數(shù)據(jù)操作中業(yè)務(wù)模型與實(shí)例模型轉(zhuǎn)換,由工具維護(hù),用戶不能修改。2.2 model中的entity是數(shù)據(jù)模型,數(shù)據(jù)模型是模型與數(shù)據(jù)集合的一對(duì)一關(guān)系,由工具維護(hù),用戶不能修改。

后面我會(huì)帶著大家用實(shí)例講解

服務(wù)接口生成(更重要)

gf gen service

服務(wù)接口是非常重要的知識(shí)點(diǎn),也是我認(rèn)為在cli工具支持方面和V1版本最大的區(qū)別:

為了降低業(yè)務(wù)項(xiàng)目?jī)?nèi)部模塊間的耦合,框架將模塊間的依賴抽象為了接口,由internal/service包維護(hù)。internal/service可以由開(kāi)發(fā)者自定義維護(hù)接口,也可以通過(guò)internal/logic業(yè)務(wù)封裝的代碼按照一定規(guī)則自動(dòng)生成接口代碼文件。

實(shí)踐出真知

看10遍文檔,都不如一次動(dòng)手實(shí)踐。建議大家和我一起操練起來(lái),歡迎復(fù)刻:

我的思路是這樣:

  1. 下載官方的示例項(xiàng)目,學(xué)習(xí)一下官方是怎么寫(xiě)的。
  2. 給自己提需求,參考官方的實(shí)現(xiàn)方式,實(shí)現(xiàn)自己的業(yè)務(wù)場(chǎng)景。
  3. 我會(huì)帶著大家實(shí)現(xiàn)經(jīng)典的電商場(chǎng)景:添加和查詢商品信息。

1. 下載運(yùn)行官方示例的GitHub

官方示例GitHub[3]

1.1 下載部署好項(xiàng)目之后,啟動(dòng):非常順滑的就啟動(dòng)成功了:

圖片

1.2 請(qǐng)求接口,驗(yàn)證試一下DB是否連接正常。

圖片

1.3 查詢數(shù)據(jù)庫(kù),也是有值的。

圖片

驗(yàn)證環(huán)境無(wú)誤,下面開(kāi)始帶著大家參考官方示例實(shí)現(xiàn)自己的需求,進(jìn)而更好的理解V2版本新特性和工程實(shí)踐。

2. 基于V2編寫(xiě)商品管理

我們按照官方建議的工程方式去實(shí)踐,看看會(huì)不會(huì)踩坑:

2.1 創(chuàng)建goods表如下:

圖片

2.2 通過(guò)gf gen dao生成dao和model

初次嘗試,失敗,原因是沒(méi)有修改hack目錄下的config.yaml配置文件。

圖片

注意:和V1不同,官方說(shuō)hack目錄的作用是工具腳本,存放項(xiàng)目開(kāi)發(fā)工具、腳本等內(nèi)容。例如,CLI工具的配置,各種shell/bat腳本等文件。所以我們就不要像V1一樣把cli工具的配置文件也寫(xiě)到manifest/config目錄中了。

2.3 搞定,成功生成。

圖片

小技巧,如果我們不指定tables,則生成所有表對(duì)應(yīng)的數(shù)據(jù)。我是比較喜歡這么操作:因?yàn)槟鼙苊庾约焊牧硕鄠€(gè)tables,但是在配置文件中漏寫(xiě)了某個(gè)tables導(dǎo)致意料之外的問(wèn)題。

下面開(kāi)始正式擼代碼了:

我會(huì)先按照大家容易理解的方式進(jìn)行編寫(xiě),文章最后我會(huì)分享實(shí)踐經(jīng)驗(yàn):按照什么順序編寫(xiě)各個(gè)模塊的代碼是比較科學(xué)的。

2.4 首先我們實(shí)現(xiàn)api層,定義請(qǐng)求和響應(yīng)的結(jié)構(gòu)體

圖片

2.5 我們?cè)赾md中注冊(cè)Goods相關(guān)的路由

圖片

2.6 我們發(fā)現(xiàn)注冊(cè)路由時(shí),controller.Goods飄紅,原因是我們還沒(méi)有編寫(xiě)這個(gè)方法。

我們參考示例代碼去編寫(xiě)controller層:

我們發(fā)現(xiàn)右側(cè)的示例項(xiàng)目,方法內(nèi)部調(diào)用了service中的方法,但是我們目前還沒(méi)有定義service,怎么辦?

圖片

我們先點(diǎn)擊示例項(xiàng)目中的user.go,查看一下service中都定義了什么:

圖片

經(jīng)過(guò)查閱文檔得知:

我們需要通過(guò)編寫(xiě)logic層實(shí)現(xiàn)業(yè)務(wù)邏輯,通過(guò)配置goland插件,自動(dòng)生成service代碼。

這要是官方建議我們的最佳實(shí)踐:

2.7 導(dǎo)入官方提供的xml文件(只需要配置一次)

xml文件地址[4]

強(qiáng)烈建議大家這么操作,經(jīng)過(guò)這個(gè)配置在我們編寫(xiě)logic層代碼的時(shí)候,service能自動(dòng)生成接口定義文件。

當(dāng)然也可以不配置,只是每一次在開(kāi)發(fā)/更新完成logic業(yè)務(wù)模塊后,都需要手動(dòng)執(zhí)行一下 gf gen service 命令。太麻煩了?。。?/p>

圖片

2.8 我們參考右側(cè)的示例 編寫(xiě)商品goods的logic代碼,處理業(yè)務(wù)邏輯:

圖片

2.9 經(jīng)測(cè)試我發(fā)現(xiàn):在編寫(xiě)logic邏輯后,就自動(dòng)在service層生成了對(duì)應(yīng)的goods文件和方法,非常方便。

圖片

2.10 我們?cè)倮^續(xù)寫(xiě)添加商品邏輯和查看商品邏輯

我們發(fā)現(xiàn):在logic層編寫(xiě)完添加商品邏輯后,在右側(cè)的service層自動(dòng)生成了代碼。

圖片

2.11 細(xì)心的同學(xué)可能發(fā)現(xiàn)了service層的RegisterGoods方法,這是干嘛用的呢?

圖片

答案是:我們要在service層生成RegisterXX()方法后,在對(duì)應(yīng)的業(yè)務(wù)模塊中加上接口的實(shí)現(xiàn)注入。

圖片

小提示:該方法每個(gè)業(yè)務(wù)模塊加一次即可。

建議大家在編寫(xiě)完第一個(gè)logic方法后(或者說(shuō)service層生成了RegisterXX方法后):

  1. 就在logic層的init函數(shù)中實(shí)現(xiàn)服務(wù)的注冊(cè);
  2. 然后去查看logic.go文件是否添加了相關(guān)的依賴,沒(méi)有的話也可以手動(dòng)添加一下;

要成良好的編碼習(xí)慣,少出bug。

2.12 我們查看logic目錄下的logic.go文件,發(fā)現(xiàn)已經(jīng)自動(dòng)添加了我們本次編寫(xiě)的goods相關(guān)的import:

這個(gè)文件的作用是:將接口的具體實(shí)現(xiàn),在程序啟動(dòng)時(shí)執(zhí)行注冊(cè)。

圖片

好了,logic和service到此結(jié)束,我們已經(jīng)完成了業(yè)務(wù)邏輯的編寫(xiě)。

內(nèi)容不少,大家可以上劃再看一遍這部分內(nèi)容,消化吸收一下。

2.13 咱們回過(guò)頭來(lái),繼續(xù)編寫(xiě)controller層的代碼:

我們參考官方提供的controller/user.go 實(shí)現(xiàn)了我們自己的 controller/goods.go的添加商品方法:

圖片

2.14 到這里,我們已經(jīng)完成了新需求的編寫(xiě),啟動(dòng)服務(wù)查看一下效果:

圖片

很OK,已經(jīng)看到了對(duì)應(yīng)的接口。

編碼完畢,測(cè)試一下:

我們請(qǐng)求接口,添加數(shù)據(jù)看一下:

圖片

在數(shù)據(jù)庫(kù)中也查看到數(shù)據(jù):插入成功,流程走通!

圖片

反思回顧

按照上面這個(gè)流程走下來(lái),雖然整體跑通了。我個(gè)人感覺(jué)還是比較混亂的。

我又花了比較長(zhǎng)的時(shí)間消化吸收了官方文檔的工程實(shí)踐,結(jié)合我自己的經(jīng)驗(yàn)。

我們?cè)賮?lái)梳理一下V2項(xiàng)目的編寫(xiě)流程,我的建議是這樣的:

整理流程

  1. 設(shè)計(jì)表結(jié)構(gòu)
  2. 使用gf gen dao生成對(duì)應(yīng)的dao/do/model目錄代碼
  3. 編寫(xiě)api層:定義「業(yè)務(wù)模塊」的數(shù)據(jù)結(jié)構(gòu),提供對(duì)外接口的輸入/輸出數(shù)據(jù)結(jié)構(gòu)
  4. 編寫(xiě)model層:定義「數(shù)據(jù)模塊」的數(shù)據(jù)結(jié)構(gòu),提供對(duì)內(nèi)的數(shù)據(jù)處理的輸入/輸出數(shù)據(jù)結(jié)構(gòu)
  5. 編寫(xiě)logic層,自動(dòng)生成service層代碼。(通過(guò)配置goland File Watcher自動(dòng)生成,也可以通過(guò)gf gen service手動(dòng)執(zhí)行腳本生成,強(qiáng)烈建議前者)
  6. 在service層代碼生成RegisterXX()方法后,在對(duì)應(yīng)的logic模塊注冊(cè)服務(wù)(每個(gè)模塊只需要寫(xiě)一次)
  7. 編寫(xiě)controller層,接收/解析用戶輸入的參數(shù),調(diào)用service層的服務(wù)。
  8. 注冊(cè)路由,對(duì)外暴露接口,比如這個(gè)項(xiàng)目是編寫(xiě)cmd.go文件。
  9. 在main.go中 加入一行 _ "project-name/internal/logic" (只需寫(xiě)一次)
  10. 在main.go中加入一行 _ "github.com/gogf/gf/contrib/drivers/mysql/v2" (如果你使用的是mysql;只需寫(xiě)一次)

關(guān)鍵流程

  1. 上面的步驟只有3~8是每次開(kāi)發(fā)新需求都需要的
  2. 步驟1、2設(shè)計(jì)表結(jié)構(gòu)和自動(dòng)生成代碼很簡(jiǎn)單,涉及到新增表或者修改表時(shí)才需要
  3. 步驟9、10在創(chuàng)建項(xiàng)目時(shí)編寫(xiě)一次即可

再次實(shí)操

我按照上面這個(gè)步驟,編寫(xiě)了查詢商品邏輯,整體還是非常順滑的:

圖片

圖片

小伙伴們也動(dòng)手實(shí)踐吧,歡迎star fork我的開(kāi)源項(xiàng)目:https://github.com/wangzhongyang007/goframe-shop-v2

帶著問(wèn)題學(xué)習(xí)

我在編寫(xiě)商品管理需求的時(shí)候有些疑惑:

為什么要定義兩遍數(shù)據(jù)結(jié)構(gòu)呢?在api層定義了一遍,在model層又定義了一遍,我寫(xiě)了兩遍重復(fù)的結(jié)構(gòu)體,意義何在呀?

圖片

我靜下心來(lái)想想,這個(gè)設(shè)計(jì)還是值得好好推敲的,我結(jié)合之前的項(xiàng)目經(jīng)歷分享一下我的理解。拋磚引玉,小伙伴們有什么理解歡迎在評(píng)論區(qū)留言。

之前遇到的問(wèn)題

我們之前在在開(kāi)發(fā)商品中心統(tǒng)一入庫(kù)時(shí)就遇到了難以維護(hù)的問(wèn)題,原因就是業(yè)務(wù)邏輯和數(shù)據(jù)處理邏輯耦合在一起。

隨著業(yè)務(wù)的復(fù)雜度越來(lái)越高,項(xiàng)目維護(hù)成本越來(lái)越高,甚至達(dá)到了難以維護(hù)的程度。

我們是如何解決的呢?

解決辦法和GoFrame的數(shù)據(jù)模型和業(yè)務(wù)模型解耦,底層思想是一樣的:

我們把復(fù)雜的邏輯進(jìn)行了拆分:定義了業(yè)務(wù)模塊和數(shù)據(jù)處理模塊。

「業(yè)務(wù)模塊」:只處理接收的參數(shù),并不關(guān)心如何入庫(kù)和取值,按照「數(shù)據(jù)模塊」的要求,處理好前端傳入的數(shù)據(jù),統(tǒng)一結(jié)構(gòu)體傳遞給「數(shù)據(jù)模塊」即可。

「數(shù)據(jù)模塊」:不需要關(guān)心「業(yè)務(wù)模塊」的具體實(shí)現(xiàn),定義了統(tǒng)一的傳參標(biāo)準(zhǔn),要求業(yè)務(wù)模塊按照自己的要求,統(tǒng)一傳入數(shù)據(jù);數(shù)據(jù)模塊考慮的重點(diǎn)是如何高效的批量插入數(shù)據(jù),如何高效的按需取值,并不需要關(guān)心多變的業(yè)務(wù)側(cè)需求。

升華一下

經(jīng)過(guò)對(duì)冗余模塊的拆解,梳理清楚了「數(shù)據(jù)模塊」和「業(yè)務(wù)模塊」的邊界,我們不僅解決了之前項(xiàng)目難以維護(hù)的問(wèn)題,還提高了靈活對(duì)接客戶需求的能力。

結(jié)合自己的項(xiàng)目經(jīng)歷和這次實(shí)踐V2版本的經(jīng)歷,所以我開(kāi)篇說(shuō):讓開(kāi)發(fā)者更好的做到“模塊內(nèi)部高內(nèi)聚,模塊之間松耦合”,是我認(rèn)為GoFrame V2設(shè)計(jì)的精髓。

好了,這篇文章就到這里,硬核爆肝5千字,堅(jiān)持更新實(shí)屬不易,歡迎大家點(diǎn)贊、評(píng)論、轉(zhuǎn)發(fā)。

參考資料

[1]電商前后臺(tái)系統(tǒng)API: http://github.com/wangzhongyang007/GoFrame-shop

[2]框架介紹: https://GoFrame.org/pages/viewpage.action?pageId=3672399

[3]官方示例GitHub: https://github.com/gogf/gf-demo-user

[4]xml文件地址: https://GoFrame.org/pages/viewpage.action?pageId=49770772&preview=/49770772/49770777/watchers.xml

本文轉(zhuǎn)載自微信公眾號(hào)「 程序員升級(jí)打怪之旅」,作者「王中陽(yáng)Go」,可以通過(guò)以下二維碼關(guān)注。

轉(zhuǎn)載本文請(qǐng)聯(lián)系「 程序員升級(jí)打怪之旅」公眾號(hào)。

責(zé)任編輯:武曉燕 來(lái)源: 程序員升職加薪之旅
相關(guān)推薦

2017-12-15 11:09:05

設(shè)計(jì)師LottieAndroid

2017-12-15 14:20:24

AndroidAirbnbLottie

2010-07-29 10:16:17

Linux內(nèi)核Linux內(nèi)存

2013-09-02 11:33:38

百度

2012-06-13 01:23:30

開(kāi)發(fā)者程序員

2014-04-14 11:23:27

WP8.1Build2014

2012-09-27 09:03:02

開(kāi)發(fā)者iOS 6iPhone 5

2015-03-24 11:38:09

2014-07-21 10:00:37

框架HTML5框架模板

2015-08-11 11:01:22

設(shè)計(jì)原則開(kāi)發(fā)者

2023-07-04 09:00:00

開(kāi)發(fā)SPACE框架

2014-07-28 09:15:02

開(kāi)發(fā)框架

2015-06-05 09:12:52

OpenStack設(shè)計(jì)指導(dǎo)開(kāi)發(fā)者

2013-10-24 09:50:12

開(kāi)發(fā)者框架

2014-03-25 09:29:11

扁平化設(shè)計(jì)歷史

2021-12-31 09:04:39

軟件設(shè)計(jì)開(kāi)發(fā)函數(shù)

2014-09-01 09:53:50

Android框架

2015-03-12 13:53:11

開(kāi)發(fā)者PHP框架PHP

2018-07-25 15:43:27

機(jī)器學(xué)習(xí)框架開(kāi)發(fā)

2017-07-18 10:16:27

強(qiáng)化學(xué)習(xí)決策問(wèn)題監(jiān)督學(xué)習(xí)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)