标签: design-principles

规则引擎用户界面设计

在工作中,我们有优化引擎,这些引擎使用的输入之一是业务规则,我们使用专有规则编辑器创建和编辑.

这些规则属于我们自己的专有格式,因为现有的规则引擎无法表示我们所需的复杂性的业务规则.

无论如何,我们对规则引擎当前的工作方式或多或少感到满意- 它对复杂的业务规则非常有效,但对用户界面(规则编辑器)不满意.基本上,这当前包含一组表格,这些表格使用复杂的电子表格式表格GUI进行编辑.

虽然这是功能性的,但它是一个非常糟糕的界面,可以呈现给非开发人员而非等同于业务分析师的最终用户.在弄脏之前,我认为最好询问StackOverflow社区对特定于这种情况的用户界面设计的看法.

我的问题

  • 您在现有规则编辑器中看到了哪些最佳用户界面?
  • 您认为在规则编辑器中设计用户界面背后的最佳原则是什么?

我分别使用术语规则引擎规则编辑器.对于这个问题,我只关心规则编辑器

StackOverflow上有关规则引擎的其他问题,但规则编辑器和用户界面设计都没有:

user-interface rule-engine design-principles

10
推荐指数
1
解决办法
1万
查看次数

正确地实现两个具有不同类型但在语义上等效的对象的比较

我发现了类似的问题

如何比较具有相似属性的两个截然不同的对象

这可能含蓄地和/或部分地回答了我的问题.

假设我想要比较(没有很多嵌套条件)这个对象:

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)

由于我也有一个 …

c# design-patterns design-principles

10
推荐指数
1
解决办法
6262
查看次数

"取决于抽象而非具体类"和"程序到界面"之间的区别

这两个原则之间的区别对我来说并不清楚.它们看起来像是一样的东西.

有什么区别?

oop design-principles

9
推荐指数
1
解决办法
1841
查看次数

单一责任原则:班级或方法级别

我在理解单一责任原则方面存在问题.应该在班级或方法级别应用SRP.假设我有学生班,我需要创建学生,更新学生和删除学生.如果我创建一个具有这三个操作方法的服务类,这会破坏SRP原则.

oop design-principles

9
推荐指数
1
解决办法
2845
查看次数

为什么永远不应该对可选Java对象使用同步

我正在学习Java可选包装器,为此,我正在阅读以下教程

但是,我有一个简单的问题未在文章中得到解答:在第25项:避免对Optional使用身份敏感操作时,他们提到永远不要以这种同步方式使用可选对象:

Optional<Product> product = Optional.of(new Product());

synchronized(product) {

    ...

}
Run Code Online (Sandbox Code Playgroud)

但没有解释为什么,所以请在这里的任何人向我解释为什么这是一种不好的做法吗?

java synchronized design-principles optional java-8

9
推荐指数
1
解决办法
166
查看次数

是否使用Java的instanceOf兼容"程序到界面"的设计原则?

如您所知,"接口程序"设计原则广泛地倾向于使用超类型而不是具体类型或实现.

是否与在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的骰子模拟器.具体类型是不同的测试类型 - 成功测试,反对测试,扩展测试 - 它们的成功操作都有非常不同的因素和参数.超类型基本上包含骰子池!

java instanceof design-principles

8
推荐指数
2
解决办法
527
查看次数

RAII和单元测试原理

RAII(资源获取是初始化)是构建对象的建议方法之一.它如何与单元测试原则相关:构造函数中没有完成复杂的工作?尤其是"新"运算符没有明确创建对象?但是,有时创建某些对象需要一些更复杂的步骤,并且将工厂传递给构造函数会使API"变脏",这意味着降低了易读性.同时满足这两个原则的一般方法是什么?

我在SO上找到了另一个主题:堆栈分配RAII对象与DI原理,但它看起来像一个更普遍的问题,并没有得到很好的解释.

unit-testing raii tradeoff design-principles

8
推荐指数
1
解决办法
299
查看次数

违反了哪些SOLID原则?

介绍


我研究了关于继承问题的硕士论文,并找出了一些表明存在遗传问题的指标.

如下例所示:


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原则.

我认为上面的例子违反了:

  1. 单一责任原则(SRP)
  2. 开放/封闭原则(OCP)
  3. Liskov替换原理(LSP)
  4. 依赖倒置原则(DIP)

但我不确定这是否适用于所有人.

我想:

原则上的违规行为


SRP违规

因为条件语句完全违反了SRP,因为像switch语句或多个if-else语句一样会考虑多个责任.

它存在两种情况,因此改变方法的原因不止一个.

OCP违规

因为如果添加新动物,必须在方法中添加新案例,因此方法不会接近修改.

LSP违规

每个分支执行依赖于动物子类型的不同动作.我认为这违反了LSP?!我知道矩形和正方形以及getArea的例子,但我认为这些例子也适用于违规.

DIP VIOLATION

条件语句具有依赖性,这意味着语句依赖于细节,而不依赖于违反DIP的抽象.

题:


因此,对于给定的例子,问题是真正违反的给定原则并且推理是否正确?

oop inheritance design-principles solid-principles

8
推荐指数
1
解决办法
2612
查看次数

"代码转移到数据"而不是代码数据的原理是什么?

在最近关于分布式处理和流媒体的讨论中,我遇到了"代码转移到数据"的概念.请有人帮忙解释一下.这个短语的参考是MapReduceWay.

就Hadoop而言,它是在一个问题中陈述的,但仍然无法用科技不可知的方式找出原理的解释.

architecture hadoop mapreduce distributed-computing design-principles

8
推荐指数
1
解决办法
3496
查看次数

干净的架构:用例输出端口

我有一个关于 Uncle Bob 的Clean Architecture 中的“用例输出端口”的问题 。

在图像中,鲍勃叔叔将端口描述为接口。我想知道是否要这样或者如果调用的用例交互器还可以返回一个“简单”的价值。在任何一种情况下,应用程序和业务规则层都将定义接口适配器层必须使用的接口。所以我认为对于简单的调用,只返回一个值不会违反架构理念。

真的吗?

此外,我认为演示者实现的这个输出端口接口应该像观察者模式一样工作。演示者只是观察交互者的相关“事件”。在 .NET 事件是一等公民的情况下,我认为使用其中一个是相同的想法。

这些想法是否与 Clean Architecture 背后的想法兼容?

architecture oop design-principles solid-principles

7
推荐指数
1
解决办法
622
查看次数