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

?by hzwusibo 20181210

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

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

用例圖:

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



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

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

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

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

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

ManagerShelf?進(jìn)行對 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)容。 通過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)分別見上面兩張圖,最終實(shí)現(xiàn)時(shí)業(yè)務(wù)層的搜索沒有拆分成module,本來打算管理公共數(shù)據(jù)模型的module_common_model也沒有使用,因?yàn)槟壳肮玫臄?shù)據(jù)模型還無法完全剝離,暫時(shí)還是放在module_base中,另外模塊通信層目前看算是各個(gè)業(yè)務(wù)依賴的中間層,通信用到的數(shù)據(jù)模型也都放在了module_communication,下個(gè)Q閱讀重構(gòu)還會持續(xù)做,模塊化也會繼續(xù)實(shí)踐和探索,下面的依賴圖也會隨著我們的不斷實(shí)踐來更新。

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

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

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

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

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


四、書架對外接口:

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

void updateBookShelfFromServers();

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

@param userName:用戶名

@return 對應(yīng)用戶的書架書籍列表,列表元素?cái)?shù)據(jù)模型見? {@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);// 同步后臺新增書

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、更新是否是語音閱讀

@param is_voice_reading 是否是語音閱讀

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為書籍長按操作彈框 。? ? 綠色的部分為推展功能, ShelfFilterPopWindow為篩選框, BookRecommendPopWindow為書架推薦。


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

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

初始化 BookShelf 以及 DataManager

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

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

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

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

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

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


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

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

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

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

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

界面刷新

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

請求 detail.json 接口,此接口是按需請求,也就是沒有顯示出來的視圖不會請求對應(yīng)書籍的詳細(xì)信息。此接口主要包含的是書籍信息當(dāng)中的用戶行為相關(guān)的數(shù)據(jù),例如書籍進(jìn)度,包月數(shù)據(jù)等。由于是按需請求,所以這里可能需要有高并發(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ù)庫

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


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


關(guān)健步驟

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

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


需要注意的是客戶端閱讀過的書籍,相應(yīng)的書架上的書籍就會顯示本地的閱讀進(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í)序圖

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

書籍詳情加入書架

包月加入書架

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

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

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

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

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

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

8.1 刪除流程圖

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

刪除書架書籍

刪除包月

刪除、批量刪除場景邏輯可以分為多種:


8.2 移出分組



九、 數(shù)據(jù)庫設(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容