書架重構(gòu)設(shè)計(jì)(精簡(jiǎn)版)

?by hzwusibo 20181210

一邻储、 業(yè)務(wù)描述

重構(gòu)最重要的首要任務(wù)是梳理功能結(jié)構(gòu)背亥。書架模塊主要包含以下以下幾個(gè)界面:

用例圖:

中除了?WIFI 傳輸般眉、導(dǎo)入本地書籍、查看閱讀歷史以外的所有用例都屬于書架首頁(yè)這個(gè)界面內(nèi)部慎宾。



二丐吓、書架架構(gòu)(Android):

書架主要分為三層浅悉、 BookBean(對(duì)應(yīng)數(shù)據(jù)庫(kù))、ShelfItemData(對(duì)應(yīng)內(nèi)存)券犁、 ShelfModel(對(duì)應(yīng)界面)

BookBean? (和書架數(shù)據(jù)庫(kù)一一對(duì)應(yīng)术健, 用于網(wǎng)絡(luò)獲取、數(shù)據(jù)庫(kù)存儲(chǔ))

ShelfItemData 列表為內(nèi)存中數(shù)據(jù)(是 DB 讀取粘衬,進(jìn)行處理后(分組荞估、分區(qū)、排序)的數(shù)據(jù) list)稚新。

ShelfModel?只用于顯示(從 ShelfItemData 層生成)勘伺,類似于 MVVM 中的 ViewModel。

ManagerShelf?進(jìn)行對(duì) ShelfItemData 層數(shù)據(jù)進(jìn)行管理操作(置頂枷莉、分組娇昙、刪除等)尺迂,操作完成后更新ShelfModel界面層與 DB 笤妙。


三、客戶端模塊分層

模塊化噪裕,將一個(gè)程序按照功能蹲盘,分成相互獨(dú)立的模塊,以便每個(gè)模塊只包含與其功能相關(guān)的內(nèi)容膳音,書架重構(gòu)設(shè)計(jì)上把書架獨(dú)立一個(gè)模塊召衔。

? 將書架模塊、正文模塊等不相干業(yè)務(wù)相互獨(dú)立祭陷, 每個(gè)模塊只包含與其功能相關(guān)的內(nèi)容苍凛。 通過(guò)Arouter路由進(jìn)行通訊。

? 框架服務(wù)層: 基礎(chǔ)的組件兵志,如網(wǎng)絡(luò)醇蝴、圖片、通訊想罕、工具類等

? 業(yè)務(wù)模塊層: 書架悠栓、閱讀器等


補(bǔ)充部分實(shí)現(xiàn)內(nèi)容:

?(實(shí)現(xiàn)的時(shí)候略有些區(qū)別)

? ? ? ?閱讀重構(gòu)有些跟最初設(shè)計(jì)不符的地方,設(shè)計(jì)和實(shí)現(xiàn)分別見(jiàn)上面兩張圖按价,最終實(shí)現(xiàn)時(shí)業(yè)務(wù)層的搜索沒(méi)有拆分成module惭适,本來(lái)打算管理公共數(shù)據(jù)模型的module_common_model也沒(méi)有使用,因?yàn)槟壳肮玫臄?shù)據(jù)模型還無(wú)法完全剝離楼镐,暫時(shí)還是放在module_base中癞志,另外模塊通信層目前看算是各個(gè)業(yè)務(wù)依賴的中間層,通信用到的數(shù)據(jù)模型也都放在了module_communication框产,下個(gè)Q閱讀重構(gòu)還會(huì)持續(xù)做凄杯,模塊化也會(huì)繼續(xù)實(shí)踐和探索师溅,下面的依賴圖也會(huì)隨著我們的不斷實(shí)踐來(lái)更新。

客戶端模塊分層后的工程結(jié)構(gòu):base基礎(chǔ)的組件盾舌、 book_shelf書架墓臭、communication模塊之間通訊等。

模塊之間的通訊通過(guò)Arouter的服務(wù)管理實(shí)現(xiàn)妖谴, 以書架為例窿锉。

1、暴露書架對(duì)外提供的服務(wù)(聲明接口膝舅,其他組件通過(guò)接口來(lái)調(diào)用書架的服務(wù))嗡载,接口統(tǒng)一在module_communication模塊中聲明,例如這里書架暴露了void addShelfBook(String id);接口仍稀。

2洼滚、在書架模塊中實(shí)現(xiàn)外提供的服務(wù)的接口

3、其他模塊調(diào)用技潘,如購(gòu)物車模塊調(diào)用書架提供的加入服務(wù)遥巴。


四、書架對(duì)外接口:

1享幽、從服務(wù)器刷新書架:1,限免領(lǐng)取特權(quán)領(lǐng)取成功需要刷新書架 2,開通包月后需要更新書架信息

void updateBookShelfFromServers();

2铲掐、根據(jù)用戶名獲取所有書架書籍

@param userName:用戶名

@return 對(duì)應(yīng)用戶的書架書籍列表,列表元素?cái)?shù)據(jù)模型見(jiàn)? {@link BaseBook}

List<SearchBook> getAllShelfDataWithUserName(String userName);

3值桩、獲取內(nèi)存中所有的書籍摆霉,直接查詢內(nèi)存

List<SearchBook> getAllShelfData();

4、本地書加入書架

void addshelfLocalBook(LocalBook local, AddShelfLocalBookCallBack addShelfLocalBookCallBack);

5奔坟、加入書架

void addShelfBook(String id);? // 新增一本書

void addShelfBookAndUpdateBook(String id, boolean is_voice_reading, int read_cont, float total_percent);// 新增并且更新信息

void addShelfBaoyue(String id);// 新增包月

void addShelfBooks(List<String> list);// 新增多本書

void syncAddBooks(List<String> list);// 同步后臺(tái)新增書

void addShelfCallBackListener(AddShelfBookCallBack callBack);? // 添加回調(diào)

void removeShelfCallBackListener(AddShelfBookCallBack callBack); // 移出回調(diào)

6携栋、 打開了某本書,書架排到一個(gè)

@param bookid:書籍

void openBookItem(String bookid);

7咳秉、 更新書籍閱讀進(jìn)度

@param bookid 需要更新的書籍

@param read_cont 已讀的章節(jié)數(shù)

@param total_percent 書籍閱讀的進(jìn)度百分比

void updateBookProgressById(String bookid, int read_cont, float total_percent);

8婉支、更新是否是語(yǔ)音閱讀

@param is_voice_reading 是否是語(yǔ)音閱讀

void updateIsVoiceReading(String bookid, boolean is_voice_reading);

9、更新章節(jié)本地更新時(shí)間滴某,用于去除小紅

void doBookUpdateTimeLocal(String bookid);

10磅摹、查詢一本書是否在當(dāng)前用戶書架

@param bookid 書籍id

? @return true:在,false:不在

boolean isBookShelfBook(String bookid);

11霎奢、刪除書架上的書

void offLineDeleteShelfs();

12户誓、 同步上傳書

void updateSyncBook(SyncModel model);


五.主界面設(shè)計(jì)

備注:? 越紅色越重要, BookShelf為書架主要最重要的類幕侠,ShelfListAdapter和ShelfGridAdapter為書架的adapter帝美。? BookGroupDialog為組內(nèi)書的彈出框,BookGroupDialogAdapter為相應(yīng)的adapter晤硕。? 以上5個(gè)類是書架最核心的類悼潭。? BookOperateGroup為分組操作庇忌, BookManageActivity為批量操作, BookOperatePopWindow為書籍長(zhǎng)按操作彈框 舰褪。? ? 綠色的部分為推展功能皆疹, ShelfFilterPopWindow為篩選框, BookRecommendPopWindow為書架推薦占拍。


六略就、? 初始化時(shí)序圖

書架是屬于 TabBar 的子頁(yè)面,APP 打開的時(shí)候其就會(huì)進(jìn)行初始化緩存數(shù)據(jù)晃酒,以下時(shí)序圖描述的就是這個(gè)過(guò)程表牢。

初始化 BookShelf 以及 DataManager

DataManager 根據(jù) userName 獲取 userName 對(duì)應(yīng)的書籍記錄

DataManager 對(duì)各區(qū)的書籍進(jìn)行分組

DataManager 對(duì)各區(qū)的書籍進(jìn)行排序

DataManager 對(duì)書籍進(jìn)行分區(qū)

DataManager 對(duì)各區(qū)的書籍生成對(duì)應(yīng)的 ViewModel

BookShelf 根據(jù)生成的 ViewModel 進(jìn)行展示


七.? ?書架刷新流程時(shí)序圖(ShelfManagerBookBean)

刷新流程階段描述的是任何主動(dòng)/被動(dòng)因素導(dǎo)致界面重新請(qǐng)求服務(wù)器從而刷新界面數(shù)據(jù)的流程

整個(gè)流程大體分為幾個(gè)部分(下面的流程跟時(shí)序圖并不對(duì)應(yīng)):

請(qǐng)求推薦數(shù)據(jù):匿名用戶或者登錄用戶都會(huì)針對(duì)性的返回一些推薦數(shù)據(jù),這些數(shù)據(jù)也是需要展現(xiàn)在書架中的

請(qǐng)求 info.json 接口贝次,此接口主要是返回書架界面主要的顯示數(shù)據(jù)崔兴,例如書籍名稱、書籍封面等等蛔翅。此接口是全量拉取敲茄,是書架界面主要的瓶頸之一。

界面刷新

判定是否需要全量更新服務(wù)器和本地中的一方數(shù)據(jù)

請(qǐng)求 detail.json 接口搁宾,此接口是按需請(qǐng)求折汞,也就是沒(méi)有顯示出來(lái)的視圖不會(huì)請(qǐng)求對(duì)應(yīng)書籍的詳細(xì)信息。此接口主要包含的是書籍信息當(dāng)中的用戶行為相關(guān)的數(shù)據(jù)盖腿,例如書籍進(jìn)度,包月數(shù)據(jù)等损同。由于是按需請(qǐng)求翩腐,所以這里可能需要有高并發(fā)。

合并?detail.json?到顯示數(shù)據(jù)當(dāng)中并進(jìn)行界面刷新

重復(fù)4

時(shí)序圖當(dāng)中步驟?8. 根據(jù)用戶操作時(shí)間戳比較是否已替換信息邏輯進(jìn)一步可以細(xì)化為:


關(guān)健步驟

1膏燃、更新數(shù)據(jù)庫(kù)

2茂卦、通知 顯示界面重新從數(shù)據(jù)庫(kù)讀到內(nèi)存, 再 initBookData (主界面组哩、 組內(nèi)等龙, 批量刪除界面),更新界面


時(shí)序圖當(dāng)中步驟?18. 根據(jù)書籍更新時(shí)間伶贰、書籍進(jìn)度比較是否替換信息邏輯進(jìn)一步可以細(xì)化為:


關(guān)健步驟

更新數(shù)據(jù)庫(kù) 蛛砰,同時(shí)更新內(nèi)存數(shù)據(jù)

通知顯示界面刷新 (主界面、 組內(nèi)黍衙, 批量刪除界面)


需要注意的是客戶端閱讀過(guò)的書籍泥畅,相應(yīng)的書架上的書籍就會(huì)顯示本地的閱讀進(jìn)度,而非?detail.json?接口給的進(jìn)度琅翻。

8 和 18 都是同步操作位仁,但是本質(zhì)上面兩個(gè)操作還是有區(qū)別的:

第 8 步主要是更新書籍的基本顯示數(shù)據(jù)

第 18 步主要更新的是用戶閱讀書籍進(jìn)度以及包月信息等數(shù)據(jù)? ??


7.1? 分組操作流程圖


7.2 分區(qū)操作流程圖


7.3. 排序流程圖


7.4. 重置Order流程圖


7.6 . 加入置頂區(qū)流程圖


7.7 移到第一本




八柑贞、 加入書架時(shí)序圖

此圖描述的是書架模塊對(duì)外提供的加入書架接口,可能涉及到的業(yè)務(wù)有:

書籍詳情加入書架

包月加入書架

外部提供加入書架的書籍id/包月id

書架請(qǐng)求獲取添加書架接口(addshelf.json)

添加書架接口(addshelf.json)返回是否添加成功聂抢,并且返回相應(yīng)書籍的“書架信息”钧嘶,返回包含書籍與用戶關(guān)聯(lián)的數(shù)據(jù)。

書架將書籍的書架信息添加到緩存琳疏,并且將書籍添加到非置頂區(qū)的首位并刷新視圖

書架將書籍的書架信息保存到數(shù)據(jù)庫(kù)

同步書架數(shù)據(jù) ? Android : 最后一步略有差別康辑, 更新數(shù)據(jù)庫(kù),再?gòu)臄?shù)據(jù)庫(kù)讀數(shù)據(jù)更新內(nèi)存

8.1 刪除流程圖

圖描述的是書架模塊對(duì)外提供的刪除書架接口轿亮,可能涉及到的業(yè)務(wù)有:

刪除書架書籍

刪除包月

刪除疮薇、批量刪除場(chǎng)景邏輯可以分為多種:


8.2 移出分組



九、 數(shù)據(jù)庫(kù)設(shè)計(jì)

9.1. 書架表(book_shelf)

十我注、接口設(shè)計(jì)

10 /shelf/info.json

接口描述: 返回書架省略信息接口按咒,用于展示/排列書架信息

10.2? /shelf/detail.json

接口描述: 批量接口,外層為數(shù)組

10.3? /shelf/saveGroup.json

接口描述: 批量接口但骨,外層為數(shù)組

10.4? /shelf/addShelf.json

接口描述:添加到書架励七,支持包月以及書籍添加

10.5 /shelf/deleteShelf.json

接口描述:批量接口,外層為數(shù)組移除書架項(xiàng)奔缠。支持包月以及書籍的移除掠抬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市校哎,隨后出現(xiàn)的幾起案子两波,更是在濱河造成了極大的恐慌,老刑警劉巖闷哆,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腰奋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抱怔,警方通過(guò)查閱死者的電腦和手機(jī)劣坊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屈留,“玉大人局冰,你說(shuō)我怎么就攤上這事」辔#” “怎么了康二?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乍狐。 經(jīng)常有香客問(wèn)我赠摇,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任藕帜,我火速辦了婚禮烫罩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洽故。我一直安慰自己贝攒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布时甚。 她就那樣靜靜地躺著隘弊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荒适。 梳的紋絲不亂的頭發(fā)上梨熙,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音刀诬,去河邊找鬼咽扇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛陕壹,可吹牛的內(nèi)容都是我干的质欲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼糠馆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嘶伟!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起又碌,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤九昧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后赠橙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耽装,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年期揪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片规个。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凤薛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诞仓,到底是詐尸還是另有隱情缤苫,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布墅拭,位于F島的核電站活玲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舒憾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一镀钓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镀迂,春花似錦丁溅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至箱季,卻和暖如春涯穷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藏雏。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工拷况, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诉稍。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓蝠嘉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親杯巨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚤告,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,931評(píng)論 2 89
  • 法國(guó)作家讓·德·拉布呂埃:“人一輩子只做三件事:出生、生活和死亡服爷。人無(wú)法感受出生的喜悅杜恰,只能飽受死亡的煎熬,忘記了...
    日月明呂閱讀 631評(píng)論 1 1
  • 我思考萬(wàn)事 思考你 外面瓢潑大雨 我的心仿佛被丟棄在雨里 暴露在天地間 又是一夜的思念 又是難以入睡的一夜 你對(duì)我...
    翔于閱讀 397評(píng)論 0 1
  • 愛(ài)情來(lái)的遲或者早取決于什么呢仍源,時(shí)間心褐,人際,機(jī)緣笼踩。 天時(shí)地利人和缺一不可逗爹,可假如都是假的呢…… “耳邊輕輕悠悠一首歌...
    一筆成說(shuō)閱讀 370評(píng)論 0 0
  • 【希伯來(lái)書11:6】人非有信就不能得神的喜悅。因?yàn)榈缴衩媲皝?lái)的人嚎于,必須信有神掘而,且信他賞賜那尋求他的人。 想起一位傳...
    高橋先生閱讀 1,880評(píng)論 0 0