我只是在寻找一些灵感.特别是在性能和安全性方面,命名约定很重要但不像"酷";)
即使您的规则仅适用于您的域/项目,但演示了规则的强大程度,请告知我们.
我使用C#,但我对任何语言的规则感兴趣.
我将使用大学的图书馆系统来解释我的用例.学生注册库中的系统,并提供他们的个人资料:性别,年龄,部门,之前完成的课程,目前注册的课程,书籍已经借等,每本书在图书馆系统将定义基于学生的个人资料中的借贷规则,例如,计算机算法的教科书只能由目前在该课程注册的学生借用; 另一本教科书只能由数学系的学生借用; 也可能有规则,学生最多只能借2本电脑网络书.由于借用规则,当学生在图书馆系统中搜索/浏览时,他只会看到可以借用的书籍.因此,该要求实际上归结为有效生成学生有资格借阅的书籍清单.
以下是我使用Drools对设计进行设想的方法 - 每本书都有一个规则,对学生档案有一些字段限制作为LHS,书规则的RHS只是将书籍ID添加到全局结果列表,然后是所有书籍规则被加载到RuleBase中.当学生搜索/浏览图书馆系统时,会从RuleBase创建无状态会话,并且学生的个人资料被确认为事实,然后学生可以借用的每本书都会触发其图书规则并获得完整的图书清单.学生可以在全球结果列表中借阅.
一些假设:图书馆将处理数百万本书; 我不认为图书规则太复杂,平均每条规则最多3个简单的字段限制; 系统需要处理的学生数量在100K范围内,因此负载相当重.我的问题是:如果加载了一百万本图书规则,Drools会占用多少内存?所有这些百万条规则的解雇速度有多快?如果Drools是合适的,我想听听一些有经验的用户设计这样一个系统的最佳实践.谢谢.
我正在观察一个有趣的make行为,我想知道除了gmake中的一个bug之外是否还有合理的解释.
假设我们在makefile中有以下内容:
%-animal:
echo "$* is an animal"
%-fox: %-fox-animal
%-wolf: %-wolf-animal
Run Code Online (Sandbox Code Playgroud)
最后两个目标之间的差异是"%-wolf"没有任何配方,"%-fox"有一个空配方(即只有一行开头有一个标签).
当我们尝试执行规则时,会发生以下情况:
[root@cv19 tmp]# make freddy-animal
echo "freddy is an animal"
freddy is an animal
[root@cv19 tmp]# make freddy-wolf
make: *** No rule to make target `freddy-wolf'. Stop.
[root@cv19 tmp]# make freddy-fox
echo "freddy-fox is an animal"
freddy-fox is an animal
Run Code Online (Sandbox Code Playgroud)
iethe模式规则有一个配方(虽然是空的)工作,那个没有.我错过了它应该工作的方式吗?
为什么haskell需要多个重写规则,具体取决于函数组合技术和长度?有办法避免这种情况吗?
例如,给出以下代码......
{-# RULES
"f/f" forall a. f ( f a ) = 4*a
#-}
f a = 2 * a
Run Code Online (Sandbox Code Playgroud)
这适用于
test1 = f ( f 1 )
Run Code Online (Sandbox Code Playgroud)
但是我们需要添加规则
test2 = f . f $ 1
Run Code Online (Sandbox Code Playgroud)
和
test3 = f $ f 1
Run Code Online (Sandbox Code Playgroud)
给我们留下以下规则
{-# RULES
"f/f1" forall a. f ( f a ) = 4 * a
"f/f2" forall a. f . f $ a = 4 * a
"f/f3" forall a. f $ f $ a = …Run Code Online (Sandbox Code Playgroud) 我读到了Java变量的命名.它说除了$和_之外,Java变量不能以任何数字和特殊字符开头.
一些有效的例子:
int count;
int _count;
int $count;
Run Code Online (Sandbox Code Playgroud)
还有一些无效的例子:
int %count;
int 4count;
int #count;
Run Code Online (Sandbox Code Playgroud)
相同的规则是否适用于方法名称?
我想知道是否有一种方法可以在规则之间定义层次结构(而不仅仅是执行顺序)并控制规则执行 - 即如果父规则被触发,那么下面的规则不应该被评估等等......
此线程中的信息是一个选项,但它基本上是IF/THEN/ELSE
有不同的选择吗?
谢谢
请原谅任何无知,我对DDD相当新,所以要温柔.
我正在研究一个大型配置驱动的数据管理系统.通过在外部语法中指定配置(如业务规则,进程和验证)来构建系统.我们只是说语法是基于Groovy的DSL和Drools的集合体.
我喜欢DDD提供的简单性概念,特别是将基础架构问题与域的核心概念分离开来.
但是,由于系统的可配置性,我正在努力应用DDD的一些概念.行为(流程),验证和业务规则都是在系统外部定义的.因此,域中的实体本质上没有自己的行为.相反,它们对"验证器"或"规则引擎"或"工作流引擎"很敏感.
我将以一个例子来澄清.假设我的系统管理公司的员工.没有太多想法,您会想象我的域中有员工实体和公司实体.
在DDD之后,我试图模拟一个员工晋升的场景.您可能会在Employee上看到一个名为promote(Employee.promote)的新方法.我们可以有一个业务规则,表明员工在同一年内不能被提升两次(是的,这一切都已完成).因此我可以这样:
public void promote( EmployeeLevel newLevel ) {
if ( hasBeenPromotedThisYear( this ) {
throw new InvalidPromotionException
Run Code Online (Sandbox Code Playgroud)
好吧,在我正在使用此业务规则的应用程序中,将外部化为规则引擎.在DDD之后,我可以做类似的事情:
if( promotionRules.isEligibleForPromotion(this)
Run Code Online (Sandbox Code Playgroud)
外化我的规则.但是,该系统比这更通用."促销"操作本身通过外部配置定义为"过程".因此,在编译时,我甚至不知道我是否为该员工提供了"推广"操作.因此,从代码角度来看,我的员工对象变得非常简单,将所有功能委派给配置.它可能看起来像:
public class Employee {
public void execute( Process process )
Run Code Online (Sandbox Code Playgroud)
或者
public class EmployeeProcess {
public void process( Employee employee )
Run Code Online (Sandbox Code Playgroud)
我的问题是:DDD在这个应用程序中是否有意义?我是否应该在非DDD意义上模拟流程,验证,业务规则(规则引擎)的协作?
我喜欢洋葱架构,可以使用UI - >应用程序服务 - >核心 - >基础架构来保持关注点的良好分离.但核心可能是上面提到的合作者,而不是真正的"领域概念".
我的一部分认为,在这种情况下,"域概念"是验证器,处理器,业务规则,因为它们构成了我们在讨论系统时所讨论的无处不在的语言.在这种情况下,我会让实体没有真正的行为(大部分),以及处理器,验证器,规则引擎方面的域概念,它们实现了系统中的行为.
添加更多信息.鉴于我上面的问题,我正在努力寻找一个看起来像这样的解决方案:
org.example.app
org.example.domain - Employee - Company - EmployeeLevel
org.example.domain.shared - 进程 - BusinessRule - Validator
org.example.infrastructure
希望这个小片段增加一点清晰度.
因此,Process,BusinessRule和Validator概念将位于域内,但会根据系统所做的事情支持域模型.
(postgresql)我试图将COPYcsv数据放入表中,但是我遇到了重复的密钥违规错误,并且没有办法告诉COPY我们忽略这些错误,所以按照互联网的智慧我尝试添加这个规则:
CREATE OR REPLACE RULE ignore_duplicate_inserts AS
ON INSERT TO mytable
WHERE (EXISTS ( SELECT mytable.id
FROM mytable
WHERE mytable.id = new.id)) DO NOTHING;
Run Code Online (Sandbox Code Playgroud)
为了避免这个问题,但我仍然得到那些错误 - 任何想法为什么?
我正在尝试创建一个接受参数的自定义验证规则,但该参数是请求中另一个字段的名称,就像规则一样required_with。
我可以轻松处理规则中给定的参数,但我正在努力找出如何检索其他字段值。
目前我正在创建我的规则类
class MyClassRule
{
public function validate($attribute, $value, $parameters, $validator) : bool
{
// do some stuff here to return true/false
}
}
Run Code Online (Sandbox Code Playgroud)
并在我的服务提供商中注册
Validator::extend('my_rule', 'path\to\MyClassRule@validate');
Run Code Online (Sandbox Code Playgroud)
所以我可以在我的请求中使用它
public function rules()
{
return [
'field' => ['my_rule'],
];
}
Run Code Online (Sandbox Code Playgroud)
我想做的是
public function rules()
{
return [
'other_field' => [...],
'field' => ['my_rule:other_rule'],
];
}
Run Code Online (Sandbox Code Playgroud)
并使用other_field我的规则类中的值,但validate()的$parameters值只是['other_field']。即包含其他字段名称而不是其值的数组。
我怎样才能做到这一点?
我展示了我如何看待这个算法的实现,我把它分为两个步骤
第一步序列搜索
第二步检查中断规则
set.seed(123)
dat <- as.data.frame(matrix(sample(10,60,replace = T),ncol = 3))
colnames(dat) <- LETTERS[1:ncol(dat)]
dat
rule <- c("A==0","A==10 & B==4","C==9","A>10","B<0","C==0","A==5","A>10",
"B<0","C==0","A==9 & B==9","A>10","B<0","A==10","A==7 & B==5")
action <- c("break","next","next",rep("break",3),"next",rep("break",3),
"next",rep("break",3) ,"next")
rule <- cbind(rule,action)
Run Code Online (Sandbox Code Playgroud)