在工作中,我们有优化引擎,这些引擎使用的输入之一是业务规则,我们使用专有规则编辑器创建和编辑.
这些规则属于我们自己的专有格式,因为现有的规则引擎无法表示我们所需的复杂性的业务规则.
无论如何,我们对规则引擎当前的工作方式或多或少感到满意- 它对复杂的业务规则非常有效,但对用户界面(规则编辑器)不满意.基本上,这当前包含一组表格,这些表格使用复杂的电子表格式表格GUI进行编辑.
虽然这是功能性的,但它是一个非常糟糕的界面,可以呈现给非开发人员而非等同于业务分析师的最终用户.在弄脏之前,我认为最好询问StackOverflow社区对特定于这种情况的用户界面设计的看法.
我分别使用术语规则引擎和规则编辑器.对于这个问题,我只关心规则编辑器
StackOverflow上有关规则引擎的其他问题,但规则编辑器和用户界面设计都没有:
我发现了类似的问题
这可能含蓄地和/或部分地回答了我的问题.
假设我想要比较(没有很多嵌套条件)这个对象:
class ObjectA {
public string PropertyX { get; set; }
public char PropertyY { get; set; }
public long PropertyZ { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
到了System.String.我只对平等或不平等感兴趣(不是关于身份的一系列价值观).
实施IEquatable<string>中 ObjectA是一个正确的选择吗?我不关心什么只是简单的工作,我想确定这种情况的正确模式.
作为其他信息,请考虑ObjectA通常按顺序提供IEnumerable<ObjectA>.
我不需要知道是否"string" ==或!= objectA实例; 不涉及排序.
编辑以澄清(和帮助)
对不起,写一个好问题有时很难......
假设我不能将其表示ObjectA为字符串以进行比较(违反封装不是一种选择).
在上下文中,我要与之匹配PropertyY.
在context-2中,我要将它与应用于PropertyY/ 的算法相匹配PropertyZ.
@Oliver解决方案在问题的最后再次帮助我(再次+1).我可以简单地定义一个自定义界面:
interface IContextConverter {
string ToEquatableStringForContext1();
string ToEquatableStringForContext2();
}
Run Code Online (Sandbox Code Playgroud)
由于我也有一个 …
这两个原则之间的区别对我来说并不清楚.它们看起来像是一样的东西.
有什么区别?
我在理解单一责任原则方面存在问题.应该在班级或方法级别应用SRP.假设我有学生班,我需要创建学生,更新学生和删除学生.如果我创建一个具有这三个操作方法的服务类,这会破坏SRP原则.
我正在学习Java可选包装器,为此,我正在阅读以下教程
但是,我有一个简单的问题未在文章中得到解答:在第25项:避免对Optional使用身份敏感操作时,他们提到永远不要以这种同步方式使用可选对象:
Optional<Product> product = Optional.of(new Product());
synchronized(product) {
...
}
Run Code Online (Sandbox Code Playgroud)
但没有解释为什么,所以请在这里的任何人向我解释为什么这是一种不好的做法吗?
如您所知,"接口程序"设计原则广泛地倾向于使用超类型而不是具体类型或实现.
是否与在Java程序中使用instanceof从超类型派生具体类型的原则一致?
在我的应用程序中,Storehouse是一个抽象的超类型类,包含几个私有变量和公共getter和setter.
ConcreteStorehouseA继承自Storehouse,有很多具体的方法和变量.ConcreteStorehouseB类似但不同.
我的应用程序收到了一个仓库.但是,Storehouse不是一个有用的类型.因为具体类型中只包含真正有用的方法,所以我使用instanceof如下:
if (storehouse instanceof ConcreteStorehouseA) {
ConcreteStorehouseA concreteStorehouseA = (ConcreteStorehouseA) storehouse;
// perform operations on the concrete type's useful methods and variables
Run Code Online (Sandbox Code Playgroud)
使用instanceof与原理兼容吗?
编辑:
本质上,该应用程序是桌面RPG,Shadowrun的骰子模拟器.具体类型是不同的测试类型 - 成功测试,反对测试,扩展测试 - 它们的成功操作都有非常不同的因素和参数.超类型基本上包含骰子池!
RAII(资源获取是初始化)是构建对象的建议方法之一.它如何与单元测试原则相关:构造函数中没有完成复杂的工作?尤其是"新"运算符没有明确创建对象?但是,有时创建某些对象需要一些更复杂的步骤,并且将工厂传递给构造函数会使API"变脏",这意味着降低了易读性.同时满足这两个原则的一般方法是什么?
我在SO上找到了另一个主题:堆栈分配RAII对象与DI原理,但它看起来像一个更普遍的问题,并没有得到很好的解释.
介绍
我研究了关于继承问题的硕士论文,并找出了一些表明存在遗传问题的指标.
如下例所示:
例
public static String getAnimalNoise(Animal animal) {
if (animal instanceof Dog)
return "Woof";
if (animal instanceof Cat)
return "Miau";
return "";
}
Run Code Online (Sandbox Code Playgroud)
"Woof"如果给定的Animal实例是a Dog并且"Miau"它是a ,则该方法返回String Cat.空绳子,因为有些动物根本没有噪音.
因此,正确的解决方案应该是使用多态与getNoiseAnimal类中的Method.
我已经分析了继承问题的不同指标,并想说一些是否违反了SOLID原则.
我认为上面的例子违反了:
但我不确定这是否适用于所有人.
我想:
原则上的违规行为
SRP违规
因为条件语句完全违反了SRP,因为像switch语句或多个if-else语句一样会考虑多个责任.
它存在两种情况,因此改变方法的原因不止一个.
OCP违规
因为如果添加新动物,必须在方法中添加新案例,因此方法不会接近修改.
LSP违规
每个分支执行依赖于动物子类型的不同动作.我认为这违反了LSP?!我知道矩形和正方形以及getArea的例子,但我认为这些例子也适用于违规.
DIP VIOLATION
条件语句具有依赖性,这意味着语句依赖于细节,而不依赖于违反DIP的抽象.
题:
因此,对于给定的例子,问题是真正违反的给定原则并且推理是否正确?
在最近关于分布式处理和流媒体的讨论中,我遇到了"代码转移到数据"的概念.请有人帮忙解释一下.这个短语的参考是MapReduceWay.
就Hadoop而言,它是在一个问题中陈述的,但仍然无法用科技不可知的方式找出原理的解释.
architecture hadoop mapreduce distributed-computing design-principles
我有一个关于 Uncle Bob 的Clean Architecture 中的“用例输出端口”的问题 。
在图像中,鲍勃叔叔将端口描述为接口。我想知道是否有要这样或者如果调用的用例交互器还可以返回一个“简单”的价值。在任何一种情况下,应用程序和业务规则层都将定义接口适配器层必须使用的接口。所以我认为对于简单的调用,只返回一个值不会违反架构理念。
真的吗?
此外,我认为演示者实现的这个输出端口接口应该像观察者模式一样工作。演示者只是观察交互者的相关“事件”。在 .NET 事件是一等公民的情况下,我认为使用其中一个是相同的想法。
这些想法是否与 Clean Architecture 背后的想法兼容?
oop ×4
architecture ×2
java ×2
c# ×1
hadoop ×1
inheritance ×1
instanceof ×1
java-8 ×1
mapreduce ×1
optional ×1
raii ×1
rule-engine ×1
synchronized ×1
tradeoff ×1
unit-testing ×1