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++test 关于resource参数和include/exclude参数说明
    开发程序 ip 127.0.0.0 0.0.0.0原理与区别
    安装rails旧版本出错bin_path': can't find gem railties (["3.0.5"]) with executable rails (Gem::GemNotFoundException)
    rails excel的创建
    ruby nil? empty? blank? 的区别
    rails 调试工具pry 换掉debugger 和 rails c
    rails respond_to 的原理与使用
    rails transaction 的用法
    ssh的传送文件命令
    出现了pid的错误A server is already running. 和如何改变webrick的端口值
  • 原文地址:https://www.cnblogs.com/Ivony/p/1323388.html
Copyright © 2011-2022 走看看