系统设计之----抽象的质量

抽象以及抽象的质量

一、权限案例分析

1.1、案例简介

最近在一个项目中,设计权限相关的。说到权限,很多会提到RBAC以及ACL模型。技术上JAVA领域也会想到SpringSecurity,以及更早的Acegi;还有不错的Apache Shiro 等。抛开这些技术点,我们提炼到模型设计上来。RBAC以及ACL是什么,请找谷哥或是度娘吧。

常见业务系统中,权限需求:一般分为菜单操作权限以及数据操作权限。简化起见,我们称为菜单权限,以及数据权限。

菜单权限:哪些对象(用户)具有对哪些对象(菜单)的哪些操作(功能操作)。

数据权限:哪些对象(用户)具有对哪些对象(数据)的哪些操作(数据过滤)。

除此之外,还会有权限分配,继承,扩展等,更进一步有的还需要针对组织架构、岗位职称等的授权要求。由于组织结构是非常容易发生变更,不同的公司或是业务组织的架构是不尽相同的。那我们要怎么设计呢,既满足现有需求,又要灵活设计,扩展性要求。

1.2、模型设计

我们依赖什么呢?

抽象,抽象是管理复杂性的关键。一个好的抽象可以将一个不可能完成的任务分成两个可管理的部分:第一个部分是有关抽象的定义与实现;第二部分是随时使用它解决问题。人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。所谓的“类型”是指“所抽象的是什么?所谓的“质量”是指所要解决问题引入的复杂度。即需要处理的本质复杂度的量减到最少,并不要让偶然性的复杂度无谓地快速增长。

具体到这个权限设计模型,以及需求。提到菜单权限,我们抽象除了角色这个概念。说到角色,大多人说,那不就是RBAC模型提到的概念么,是的。可是为什么是这个概念呢,有认真思考过的同学,一定会想到软件工程中的一个环节叫系统分析,其中一个最重要的篇幅说到用例图。其中最首要的就是识别出系统具有哪些角色用户。想一想,为什么不是组织或是部门岗位呢?角色这个抽象模型对于一个组织或是部门岗位是我们系统抽象出来的一个概念,是对部门或是岗位最终用户的一个稳定抽象。它去除了部门岗位的多变,差别大等非权限本质属性,只保留针对系统需要关注的对资源的统一划分,资源分配以及资源继承等等权限系统最核心的权限本质属性。

那我们的数据权限划分是不是也需要统一到角色这个抽象的模型上呢?比如:品牌数据维度的权限,仓储数据维度的权限,店铺数据维度的等等,目前为止已经具有八类,每一类数据的量有多有少。说到这里,计算下这些数据维度的组合会有多少的量级。并且大多数拥有同一个菜单的用户具有不同的数据维度的权限。

面对一个数十多个系统,数万菜单,数十万用户级别,上百万千万计之的数据权限分配,管理上讲,使用ACL模型将消耗太多太大的人力成本,不可取。RBAC也只是对菜单权限做了稳定的抽象。那这些数据维度的权限,怎么来设计呢?

人类认识规律,类,分类。不同的东西不同的分类。

那引入用户类型(注意区分用户机构、组织部门等)或是叫用户组,粗粒度上不同的类型或是组分配不同的数据权限维度(细粒度可以区分控制每个数据维度的,单对目前这个系统不需要,不需要就不引入导致系统设计复杂度上升的模型)。

有人将权限设计分为垂直型与水平型权限设计,RBAC归于垂直型。而很多系统中,同一个角色的用户可以加入不同的用户组,这些一个个的用户组,就是一个水平权限控制的系统。只是问题往往出在访问控制系统的粒度上。如果划分的粒度不够细,那么一个用户组内的用户是否可以删除或修改各自的数据?

对于粒度的划分,我把一个访问控制系统中的最小单位称之为一个原子权限。无论是水平权限系统还是垂直权限系统,可能都是对原子权限的不同组合。

看到用户组的同学说,那RBAC里面也曾提到有用户组的概念啊,这个怎么区分啊?

我们可将其提高一个层次,对于一个业务系统来讲(不涉及流程控制),无非就是这些菜单权限与数据权限的叠加。所以,可以在用户角色与用户类型之上组合一个用户组的模型设计。即对用户的权限分配,划归到某个组里面,就拥有改组对应的角色菜单以及类型数据。

二、抽象的匹配

就是说不管何种形式的抽象,都是基于下面的事实:场景与目标。

三、抽象的能力

怎么抽?

抽象能力本身是一种思维能力,也就是说你只有不断的进行思维锻炼才能获得。

要想去打铁,就得去打铁。

这是一句法国谚语,要想提高抽象能力,就得不断的思考。

四、讨论

数据集的列权限是否算权限系统的范畴?

页面需要展示一个数据集(dataset),那么对某些列的展示、可读、可写的控制,是否要放在权限系统中解决?答案是,为了简化,为了避免过度侵入业务逻辑,列权限不在权限系统范畴内。

时间: 2024-07-30 10:18:06

系统设计之----抽象的质量的相关文章

.NET 高级架构师 架构师之路(5)---开闭原则

2 开闭原则(Open-Closed Principle,OCP) 2.1 什么是开闭原则     开闭原则是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 1988年,Bertrand Meyer在他的著作<Object Oriented Software Construction>中提出了开闭原则,它的原文是这样:"Software entities should be open for e

互联网架构师必备技能

一.每个好架构师都是一位出色的程序员 这一点毋庸置疑,如果不是写过N年代码的优秀程序员,一定不是好的架构师.“架构师”这是一个听上去比较虚的职位,它的主要价值在于“落地”的过程中,而不是“指点江山”.eBay的架构师总结架构师在项目中的职责: 1)产品团队要做一个产品,架构师要帮助团队把技术可行性,技术方案权衡取舍一一剖析清楚: 2)技术方案权衡取舍出来了,架构师要设计整体的技术实现步骤,这个过程一定是和团队其他成员一起完成的,常见的实践是,1到2个核心成员出一个初稿,然后大家讨论完善: 3)技

C#设计模式系列:开闭原则(Open Close Principle)

1.开闭原则简介 开闭原则对扩展开放,对修改关闭,开闭原则是面向对象设计中可复用设计的基石. 2.开闭原则的实现 实现开闭原则的关键就在于抽象,把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征.作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改:同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的. 3.如何使用开闭原则 抽象约束 1>.通过接口或者抽象类约束扩展

五大设计原则之(三)--------开闭原则

开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 开闭原则的定义: 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭. 遵循开闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.也就是说,我们可以改变模块的功能. (2)对于修改是关闭的(Closed

java程序设计原则

所有的设计模式都是对不同的可变性的封装,从而使系统在不同角度达到"开闭原则"的要求. 在软件软件系统中,一个模块设计得好不好的最主要.最重要的标志,就是该模块在多大程度上将自己的内部数据和其他与实现有关的细节隐藏起来.一个设计得好的模块可以将它所有的实现细节隐藏起来,彻底地将提供给外界的API和自己的实现分隔开来.这样一来,模块与模块之间就可以仅仅通过彼此的API相互通信,而不理会模块内部的工作细节. OO设计根本的指导原则是提高可维护性和可复用性.这些原则主要有: 1. 开闭原则 一

程序员职业晋升

程序员从初级走向资深的过程中,会面临两个支路. 技术主管 架构师 技术主管 技术主管,有些公司可能又叫「技术经理」,一个人的工作角色中至少有百分之五十以上的时间是花费在管理事务上,那么他的角色才算是一个经理(Manager).所以技术主管(经理)类似产品经理属于以经理命名却是非经理的角色. 「技术主管」是开发团队中的某位程序员需要对一起创建系统的整个开发团队负责时所承担的角色.通常他既要对最终交付的软件系统负责,另外也会像一个程序员一样去开发实现系统.一个技术主管的 60% - 70% 的时间可

《软件工程思想-适合初学者》第4-6章阅读笔记2

很高兴又读完了3章内容,也许这本电子书也适合软件工程的教学课本,讲的基本都是老师上课所讲, 比如第4章主讲可行性分析与需求分析,第5章讲系统设计,第6章讲述C++面向对象程序设计. 可行性分析就是软件项目能否可行,即做与不做,需求分析是做什么不做什么.可行性分析与需求分 析是软件项目的前提,没有这两项软件项目将无从谈起.因此,做软件项目之前一定要做好可行性分析与 需求分析,说实话,我目前对需求分析还不是很熟悉,只知道,这一概念,具体做一个项目时,可能不太 熟练这一过程,需要多参与实践项目提高这方

面向对象设计(OOD)七大原则

这篇文章我会不停的维护它,它将会越来越长,但它是关于我在面向对象中的一些学习的思考心得.希望对自己对各位都能实用处. 开篇前,说明一下写这篇文章的原因.原因是由于设计模式.由于设计模式里的各种模式.都是建立在这些原则之上的. 好比盖房子须要夯实的地基,或者比作数学论证中的使用到的公理.你不能说为什么盖房子一定要建立在地基之上.也不能说为什么两点一直线,三点一面这些公理为什么就这么牛逼的存在,由于这是自然规律.你必须遵守它们. 这些设计原则也类似,它们没有24种设计模式那样华丽的身姿,但它们是程序

全栈软件工程师和系统架构师的异同

看完后.发现.不用怕....因为程序员不会看完.只有"架构师"才有耐心看这么长的. 一 每个好架构师都是一位出色的程序员(卓越的程序员) 架构师,听起来是如此神秘的一个称号.尤其是在开发领域刚入门不久的菜鸟级程序员眼中,架构师都是高手,都是牛人,都是如此高高在上的存在. 不过,在搞了四.五年编程之后,程序员们往往早已失去了当年对这些"高级"职位的神秘感,甚至会对自己所在项目的架构师抱怨不已,背后里称他们是一群水王.所以有江南白衣曾撰文述说:"国内的架构师到