iota client 重構

目錄

  • iota client 目前問題
  • 重構想法
  • 預計效益

iota client 目前問題

  • 跨層分工不明確
  • 同層分工不明確
  • 元件拆解過少
  • 狀態難以管理
    • ​mutable data,到處都可以改
    • data object 包山包海
    • Read 完之後存到不知名的地方
  • 不當重用程式

iota client 目前問題

  • 跨層分工不明確
  • 同層分工不明確
  • 元件拆解過少
  • 狀態難以管理
    • ​mutable data,到處都可以改
    • data object 包山包海
    • Read 完之後存到不知名的地方
  • 不當重用程式

目前問題 - 分工不明確

  • Dependency 複雜
    • 雙向依賴流
  • 容易改 A 壞 B
  • 越來越難擴充
  • 不好找 bug 的源頭
  • 容易有重複程式碼 / 重複呼叫

目前問題 - 跨層分工不明確

沒有規定在哪邊寫 DB

Xmpp Received

目前困境 - 跨層分工不明確

沒有 Observer,只能使用 $evalAsync 更新

ChatsService(聊天室列表)

service vs controller

目前問題 - 跨層分工不明確

DB

ChatController(聊天室)

controller 跨 DB

而不是由 service call

Service

目前問題 - 同層分工不明確

ChatService(聊天室)

語意模糊,身兼兩份工作:

  • 聊天室頁面的 Service
  • message 操作處理

目前問題 - 同層分工不明確

ChatsService (聯絡人列表)

FriendsService 語意模糊,身兼兩份工作:

  • 聯絡人頁面的 Service
  • 拿 ChatRoom

目前問題 - 同層分工不明確

FriendsService (聯絡人列表)

FriendsService vs AvatarService

目前問題 - 分工不明確

  • Dependency 複雜
    • 雙向依賴流
  • 容易改 A 壞 B
  • 越來越難擴充
  • 不好找 bug 的源頭
  • 容易有重複程式碼 / 重複呼叫

重構想法

  • 單向的 Dependency
  • Observer Pattern
  • 持久化資源接視為一個 Repository

重構想法 - 架構部分

File

...

...

...

Page Service

根據 use case

操作 Repository 層

操作 Storage

隱藏去哪拿的細節

只接觸 Service

只接觸 Repository

使用 Observer 向上通知

interface == use case

interface == 要持久化的所有 CRUD

不可向上使用!

UserRepository

RosterRepository

ChatRoomRepository

FileRepository

AvatarRepository

PreferenceRepository

Note: 不要直接改 instance

重構想法 - 架構部分

File

Pref

...

...

...

Service

根據 use case

操作 Repository 層

操作 Storage

隱藏去哪拿的細節

不接觸 Repository

boundary 不會超出 entity 範圍

boundary 只會是 Aggregate

不會超出 entity 範圍

use case == interface

interface == 要持久化的所有 CRUD

照 Entity 區分 Repo

Clean Architecture

File

Pref

...

...

...

Service

根據 use case

操作 Repository 層

操作 Storage

隱藏去哪拿的細節

不接觸 Repository

boundary 不會超出 entity 範圍

boundary 只會是 Aggregate

不會超出 entity 範圍

有些 Aggregate 在 Repo

有些 Aggregate 在 Service

如何區分?

hide chat room (delete file)

in Service both Repository?

 

set avatar update status

in Repository?

Clean Architecture

File

Pref

...

...

...

Service

根據 use case

操作 Repository 層

操作 Storage

隱藏去哪拿的細節

不接觸 Repository

boundary 不會超出 entity 範圍

boundary 只會是 Aggregate

不會超出 entity 範圍

想成只有一個 Storage

要持久化的東西都經過他

1use case => 多 repo interface

hideChatRoom => showStatus == 0

hideFile => delete local DB/File

缺點:思維的轉換

need update => updateStaus == 0

interface == 要持久化的所有 CRUD

hide chat room (delete file)

in Service both Repository?

 

set avatar update status

in Repository?

Clean Architecture

File

Pref

...

...

...

Service

根據 use case

操作 Repository 層

操作 Storage

隱藏去哪拿的細節

不接觸 Repository

boundary 不會超出 entity 範圍

boundary 只會是 Aggregate

不會超出 entity 範圍

Notification Service?

Badge Service?

重構想法 - Repository

UserService

架構比較 - 使用者觸發

View

Controller

app.DB / Xmpp

Repository

View

Controller

app.DB / Xmpp

Repository

UserService
ChatService

FriendsService

FileService

AvatarService

ChatService

ChatsService

FriendsService

ChatService

ChatsService

FriendsService

UserRepository

RosterRepository

ChatRoomRepository

FileRepository

AvatarRepository

PreferenceRepository

一種資源定義一種 Repository

Page Service

Page Service

不可向上使用!

Shared

Shared

架構比較 - Server 觸發

View

Controller

Page Service

app.DB / Xmpp

Repository

View

Controller

app.DB / Xmpp

Repository

ChatService

UserService

FriendsService

FileService

AvatarService

ChatService

ChatsService

FriendsService

ChatService

ChatsService

FriendsService

Notify Subscriber

UserRepository

RosterRepository

ChatRoomRepository

FileRepository

AvatarRepository

PreferenceRepository

Page Service

不可向上使用!

Notify Subscriber

Notify Subscriber

Notify Subscriber

Notify Subscriber

一種資源定義一種 Repository

Shared

Shared

目前問題 - 元件拆解不夠

View Logic

desktop muc

需要為每個元件建立 Component

desktop uc

目前問題 - 不當重用函式

目前問題 - Read 完之後存到不知名的地方

預計效益

  • 易於插拔 framework
    • 單向流
  • 減少改 A 壞 B 的狀況
    • 高內聚,低耦合
  • 增加擴充性
    • 高內聚,低耦合 / 重用元件
  • 提升效能
    • 單向流 / 高內聚,低耦合

結論

討論並建立

更嚴謹的規範依賴流 & 定義各 class 職責

iota client 重構

By Chang Henry

iota client 重構

  • 25