Feed 流設計(三):隱私控制
在上一篇文章中,我們談到推模式的種種好處,尤其是大大提升了讀的效能。在推送新的動態至各個佇列時,有大量的邏輯判斷。以 facebook 舉例,使用者釋出動態時,可以選擇6個隱私級別。
- 公開(Public) ,所有人都可以看到。
- 朋友(Friends),只有朋友才可以看到釋出的內容。
- 所有的朋友都可以看,除了某某某。(Friends except…)
- 只給幾個指定的朋友看。 (Specific friends)
- 不允許任何人(Only Me)。
- 只給某個組別的人看(Group)
我們可以用 Policy Pattern 來抽象。在《Design Pattern》一書中,GoF 將 Strategy Pattern 和 Policy Pattern 歸為一類。談論隱私時,我們習慣稱之為「Privacy Policy」。為了提高程式碼的可讀性,選用 Policy 這個術語,而不是 Strategy。
以下虛擬碼是對 Policy 的抽象,你可以根據自己的業務來修改資料結構。
class FeedPrivacyPolicy { string level// e.g. public, friends, onlyme, group, list array allowed_user_ids array blocked_user_ids array group_ids array company_ids array tag_ids array user_list_ids FeedPrivacyPolicy(level, allowed_user_ids, blocked_user_ids, group_ids, company_ids, tag_ids) { level = level; allowed_user_ids = allowed_user_ids; blocked_user_ids = blocked_user_ids; group_ids = group_ids; company_ids = company_ids; tag_ids = tag_ids } }
各種 Policy 範例
如果使用者選擇 公開(Public) ,所有人都可以看到
,相應的 Policy 物件應該如此構建:
policy = new FeedPrivacyPolicy policy.level = 'public'
如果使用者選擇 朋友(Friends),只有朋友才可以看到釋出的內容
,相應的 Policy 物件應該如此構建:
policy = new FeedPrivacyPolicy policy.level = 'friends'
如果使用者選擇 所有的朋友都可以看,除了某某某。(Friends except...)
,相應的 Policy 物件應該如此構建:
policy = new FeedPrivacyPolicy policy.level = 'friends' policy.blocked_user_ids = [1, 33, 351]
如果使用者選擇 只有某幾個特定的朋友可以看到
,相應的 Policy 物件應該如此構建:
policy = new FeedPrivacyPolicy policy.level = 'friends' policy.blocked_user_ids = [1, 33, 351]
如果使用者選擇 不允許任何人(Only Me)
,相應的 Policy 物件應該如此構建:
policy = new FeedPrivacyPolicy policy.level = 'onlyme'
如果使用者選擇分享內容給 一組朋友
,相應的 Policy 物件應該如此構建:
policy = new FeedPrivacyPolicy policy.level = 'list' user_list_ids = [81643]
你可以根基自己的業務需要,隨意的拓展各種各樣的 policy。你可以使用繼承的關係,讓不同的 policy 更加嚴肅。也可以只定義一個類,然後把不同的規則簡單儲存為 JSON,更加靈活。
Policy 如何與其他組建協作?
1 當用戶分享內容時 (event),會選擇隱私級別 (privacy),他們之間如何協作?
1.1 隱私級別可以作為一個屬性儲存到 event 中
policy = new Policy event = event Event event.policy = policy
1.2 也可以直接將 event 與 policy 傳遞給分發系統
class RouteService event event policy policy RouteService(event, policy){ event = event policy = policy } // route! 方法是分發邏輯。 void route!(){ } end
2 配置 context 物件 RouteService
。
3 route! (分發)
為了效能和使用者體驗,分發工作通常不會在 web server 上執行,而是委託給另外的程序去執行。
Note
- ofollow,noindex" target="_blank">騰訊的隱私政策
長按二維碼,打賞我個微信紅包。

26 September 2018