漫谈社区架构
現在Web最火的是什么?Web 2.0?Web 2.0最火的是什么?論壇和博客。論壇和博客以及諸如SNS等等,又可以合稱為社區(Community)。
?
一直以來,做一個屬于自己的論壇就是我的夢想,一個可以想怎么擴展就怎么擴展的論壇,一個內部架構與表現層完全分離的論壇,一個稍加改動就可以變成博客或者你所能想到的所有的東西的論壇。
?
這個東西如何才能從夢想變成一個切實的東西。最重要的便是,抽象架構。本文試圖從筆者自己對論壇和博客的理解,談談社區的抽象架構。
?
?
首先社區是由用戶發布的東西所構成的,這個東西可以是帖子、博文、照片等等等等,所有的這些,我通稱為文檔。文檔被定義為,用戶可以發布的最小單位。也就是說,用戶最少一次只能發布一個文檔(Document),而不能是一個文檔片段或者其他的什么。文檔這個東西,在論壇中,就是一個帖子,一個回復,一個BT種子(BitTorrentFileDocument)。而在博客中,便是一篇博文,一個評論,一個圖片(PictureDocument),或者其他任何可以發布的東西。
?
一個東西被發布(Publish)后,用戶就必須舍棄一部分權利。比如說,一個帖子如果被發布到一個重要的板塊(如投訴、建議、公告),就不能隨便修改。從法理上來說,一個文檔一旦被發布,其發布者就必須對發布時的狀態負責,而無論這個文檔是不是被人看過(比如說其中包含不實或詆毀他人的言論,或者一幅包含XX內容的圖片)。所以,一個文檔的發布與否,是非常重要的一件事情。所以我必須引入另一個概念,“已發布的文檔”(PublishedDocument)。
?
文檔發布后想要讓大家看到,就必須有個地方來展示。這個展示文檔的東西,我暫時就叫它話題(Topic)吧。如果你想要發布一個東西引起大家的討論,這就叫發起一個話題(LunchTopic)。如果你對這個話題有話要說,那么就叫做參與這個話題(AttachTopic),而你要說的話,還是必須被先包裝成文檔(Document),并發布(Publish)。
?
話題其實是很多東西的一個抽象表達,因為我們剛才說了,Document本身就是一個抽象的東西,可以是一個文本文檔(TextDocument),一個照片(PhotoDocument)。那么顯然,話題除了可以是一篇博文和它的評論或者一個帖子和它的回復,還可以是一個照片和它的評論,一個投票和他的參與以及評論,一個問題和大家的回答,一個相冊和大家的評價,等等等等……總而言之,一個“發布的文檔”的集合。當然,話題也可以僅僅就是一個公告,它就只有一個文檔。
?
但是話題又顯然不是一個文檔集合這么簡單,這是因為話題包含了“已發布的文檔”的關系和狀態。一個顯而易見的關系就是回應關系,我這個回復是針對哪個回復的,或者說我這個評論是針對哪個評論的。這是論壇上一個非常常見的功能。雖然這個關系可以用引用回復來解決,但這只是一種實現手段卻不是說抽象模型中沒有這個東西。
?
話題中文檔的另一個關系或狀態我將它稱為覆蓋或者叫遮蓋,在談這個關系之前,我必須說說“已發布的文檔”不可修改原則。
?
顯然,一個文檔的修改與發布一個新的文檔在本質上是沒有任何不同的,而且在實際操作中,修改功能已經凸現出越來越多的弊端了。比如說“占樓”,意思就是指,先把位置占住,然后再利用修改功能將要發布的東西放到那個位置去。所以,文檔的修改版本是不是要與原來的文檔版本相同或者是在其上修改,這完全是一個良心問題。修改在很多時候也可以當作刪除功能來使用,將回復修改成:“已被作者刪除”,就完成了與刪除回復雷同的功能。并且,很多人都習慣用修改來逃避應有的責任,雖然說這也是論壇上避免爭端的一個方法(刪除自己頭腦發熱的言論)。但是一個已經發布的東西改來改去帶來的扯皮遠比好處多。
?
綜上所述,不如干脆直接屏蔽“已發布的文檔”的修改功能,這個功能的替代是“重發布”(Republish)。這不僅僅是改個名字而已,而是在架構上重新設計了。重發布的意思是,再發布一個文檔到話題,以替換掉原先的文檔。這個原先的文檔(HistoricalDocument)的狀態,就叫做被被覆蓋(Shadowed)。這樣修改后,至少在架構上,所有已發布的文檔都會一直在話題中存在,至于被覆蓋的文檔,是不是被顯示出來,這完全是UI的問題。
?
這樣設計的好處是相當多的,“已發布的文檔”的版本關系不再是文檔本身的屬性,而是話題的屬性。這樣恰好避免了另一個問題:“管轄權限沖突”。這個沖突其實是比較麻煩的,也就是說,一個“已發布的文檔”的所有者(作者、發布者)所擁有的權限(如修改,刪除)會和這個文檔所處的話題的管理者的權限相沖突。簡單的說,你在一個板塊發了一個帖子,版主修改了你的帖子,你不滿意版主的做法,把帖子又擅自改回,版主又改過去。然后版主刪掉你的帖子,使得你的成果丟失,你非常氣惱,離開論壇?;蛘?#xff0c;一個菜鳥在他的博客上發表了一個問題,你覺得這個問題不怎么樣,但是延伸開來有很多有價值的東西可以說,你去發表一篇很長的回復,結果那個菜鳥不明就里的把你的回復給刪掉了,你氣惱,你苦悶,你無助,離開這個博客。
?
或者反過來,某人發表了一個詆毀你的言論,你氣惱,你回應了一篇長篇大論來駁斥這個胡說八道,但是,那個家伙把他的帖子刪掉了,這下子大家只看到你一個人在那里被當猴耍。
?
OK,其實上面這些問題都是私有權限和公有權限不明確所造成的。一個已發布的文檔不可以被修改(允許修改就等于允許刪除),已發布的文檔不能被所有者刪除。就能徹底的解決上面這些亂七八糟的問題。
?
事實上我考慮清楚重發布的問題后,很多問題都變得清晰起來了。
?
一個文檔沒有被發布之前,這個東西是用戶的私有財產,可以隨便亂改,隨便亂刪。但是一旦被發布,就會出來一個“已發布的文檔”的副本,不再是你的私有財產,必須受到話題的管轄。話題可以賦予用戶修改(重發布)和刪除的權利,也可以不賦予。并且,你發布后也可以對文檔進行修改,或者別的操作,不過這些操作都是對你的私有副本的操作,而不是那個“已發布的文檔”的副本。
?
而且,以前那些糾纏不清操作和權限,一下子全清楚了。
?
文檔顯然是可以被修改(Modify)的,也可以被刪除(Delete)。但是一個話題里面的文檔要被修改就叫做重發布(Republish),要刪除一個話題里面的文檔叫做從話題中移除(RemoveFromTopic)。
?
這樣梳理后,話題也可以被賦予一個新的定義,也就是管理權限的最小單位,所有的管理權限都可以被當成是對話題結構的修改(重發布、移除、拆分、合并、添加精華標記)。自此,話題成為公有區域和私有區域交接處。
轉載于:https://www.cnblogs.com/Ivony/archive/2008/10/31/1323388.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: 全年月平均工作时间和工资折算办法
- 下一篇: perl里字符串取长度,比较等一些操作