zoukankan      html  css  js  c++  java
  • 漫谈社区架构

    现在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的问题。

    这样设计的好处是相当多的,“已发布的文档”的版本关系不再是文档本身的属性,而是话题的属性。这样恰好避免了另一个问题:“管辖权限冲突”。这个冲突其实是比较麻烦的,也就是说,一个“已发布的文档”的所有者(作者、发布者)所拥有的权限(如修改,删除)会和这个文档所处的话题的管理者的权限相冲突。简单的说,你在一个板块发了一个帖子,版主修改了你的帖子,你不满意版主的做法,把帖子又擅自改回,版主又改过去。然后版主删掉你的帖子,使得你的成果丢失,你非常气恼,离开论坛。或者,一个菜鸟在他的博客上发表了一个问题,你觉得这个问题不怎么样,但是延伸开来有很多有价值的东西可以说,你去发表一篇很长的回复,结果那个菜鸟不明就里的把你的回复给删掉了,你气恼,你苦闷,你无助,离开这个博客。

    或者反过来,某人发表了一个诋毁你的言论,你气恼,你回应了一篇长篇大论来驳斥这个胡说八道,但是,那个家伙把他的帖子删掉了,这下子大家只看到你一个人在那里被当猴耍。

    OK,其实上面这些问题都是私有权限和公有权限不明确所造成的。一个已发布的文档不可以被修改(允许修改就等于允许删除),已发布的文档不能被所有者删除。就能彻底的解决上面这些乱七八糟的问题。

    事实上我考虑清楚重发布的问题后,很多问题都变得清晰起来了。

    一个文档没有被发布之前,这个东西是用户的私有财产,可以随便乱改,随便乱删。但是一旦被发布,就会出来一个“已发布的文档”的副本,不再是你的私有财产,必须受到话题的管辖。话题可以赋予用户修改(重发布)和删除的权利,也可以不赋予。并且,你发布后也可以对文档进行修改,或者别的操作,不过这些操作都是对你的私有副本的操作,而不是那个“已发布的文档”的副本。

    而且,以前那些纠缠不清操作和权限,一下子全清楚了。

    文档显然是可以被修改(Modify)的,也可以被删除(Delete)。但是一个话题里面的文档要被修改就叫做重发布(Republish),要删除一个话题里面的文档叫做从话题中移除(RemoveFromTopic)。

    这样梳理后,话题也可以被赋予一个新的定义,也就是管理权限的最小单位,所有的管理权限都可以被当成是对话题结构的修改(重发布、移除、拆分、合并、添加精华标记)。自此,话题成为公有区域和私有区域交接处。

  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/Ivony/p/1323388.html
Copyright © 2011-2022 走看看