Design patterns 设计一个易于扩展的库-这个设计可以改进吗?
如果您能对我正在设计的库中的RBAC子系统的设计提供一些反馈,我将不胜感激。下表提供了类名和简要说明:Design patterns 设计一个易于扩展的库-这个设计可以改进吗?,design-patterns,architecture,rbac,Design Patterns,Architecture,Rbac,如果您能对我正在设计的库中的RBAC子系统的设计提供一些反馈,我将不胜感激。下表提供了类名和简要说明: Name Description User Abstract Base Class (so it can't be instantiated) IRole Interface Role Implements IRole RoleC
Name Description
User Abstract Base Class (so it can't be instantiated)
IRole Interface
Role Implements IRole
RoleCollection Collection of roles
Personnel ABC. Represents a user in the system. Derives from User, delegates to (i.e. has-a) collection of roles (RoleCollection)
PersonnelFactory Creates specific personnel types
PersonnelFactory创建的一些人员示例:
我想将角色划分为离散类,其中实现IRole接口的专用自定义角色类执行特定功能。也就是说,例如:
SystemAdminRole可以具有以下方法:
clearSystemCache();
createNewCache();
... etc.
updateUserAccount();
getAccountBalance();
addAmountToAccountBalance();
... etc
而AccountsRole可以有以下方法:
clearSystemCache();
createNewCache();
... etc.
updateUserAccount();
getAccountBalance();
addAmountToAccountBalance();
... etc
理想情况下,我希望系统显示以下属性:
能够向角色添加新功能,而无需修改代码。我打算通过使用脚本或可调用存储过程来实现这一点
当我向角色添加新方法时,我希望具有该角色的人员对象能够“自动”执行新功能,而无需重新编译代码
<> P>因为它的价值,这是我在许多项目中需要的系统组件——一旦我有了正确的设计,我设想用以下语言实现代码:不同的项目:java、Python、Ruby和PHP、C++,但是,我希望首先使系统设计正确,并与上面所提到的属性相一致,不必依赖于该语言提供的构造,系统就可以用它来实现
对于如何改进或修改上述设计以获得所需的功能扩展性而无需重新编码的任何建议,我们将不胜感激。由于现在没有太多响应,我只想给您一个抽象的答案。也许这也能帮助其他人做出贡献 数据库 能力表包含 Column Main:硬编码且永远无法更改的能力名称 角色表包含 FK列:作为外键的能力表PK Column Main:一些硬编码的代码永远不会更改,也永远不会重复每个角色 班级 在千个类中的每个类上,每个类代表千个类中的一个角色,它们的父类将是千个类父类。 在千分之一类的构造函数上,千分之一类的parent.RoleName存储表角色。除非角色已过时,否则您将永远不会再次更改它或在数据库中更改它 然后,调用一个存储过程,该过程使用ThoundandClassParent.RoleName从角色表和存储中筛选和选择正确的能力 他们有上千种能力。 当您向该角色添加功能时(用户必须重新启动才能选择并重新启动类OneOfAnhandClass),无需重新编译代码 所以有一个提示是否运行一个能力,这取决于用户角色,你们都有,那又怎样? 界面是好的。我会做得更少。所有1000个类都可以使用对helper静态类的调用。 构造函数上的静态类可以获取能力表中的能力列表 当用户与role类链接时,它将不时从ThoundandClassParent运行meat函数,并传递一个表示访问能力的参数 因此,对于函数千家万户类parent.Meat,它将是这样的 DebugValidate只是检查数据库中是否真的存在这种能力。除非你非常自信,否则抓住这些错误是件好事。 如果传递的类角色能力数组包含该能力,则该静态类可以有一个返回true或false的验证函数。 如果某个函数通过,则调用另一个函数;如果该函数未通过,则调用另一个函数,并将参数作为能力。有时,如果它没有通过,你做的事情比它通过时多。 这两个函数类似:它们将调用存储过程或文件名模板,并在与变量ability+post prefix fail/success同名的服务器上进行调用。你需要翻译模板 在代码中加入真正的编程代码。我想试图抽象这一点也太复杂了,这是一个比RBAC系统更一般的主题,你可以把它作为一个单独的问题来问
if (DebugValidate(Ithinkthisabilityexists string))
{
if (Validate(Ithinkthisabilityexists string, ThousandClassParent.Abilities))
PassesRunThis(Ithinkthisabilityexists string)
else
FailsRunThis(Ithinkthisabilityexists string)
}
else
{
SystemError
}