- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有点想用 Java 8 流编写 Selenium 页面对象,如下面的代码所述,并收到评论说我的代码违反了 Demeter 法则,因为我在一行中执行了很多操作。我被建议将代码分解为第一个流以收集列表并运行另一个流操作来进行匹配(简而言之,根据需要将其分解为多个流)。我不相信,因为引入 Stream 是为了处理数据处理,如果我们将它分解成多个流,那么使用流就没有意义了。之前我曾在一个网络安全项目中工作,其中数百万条记录通过流式处理和多个逻辑操作对数据进行排序。
请分享您的想法,我已按照审阅者的建议对其进行了更改,但他无法解释原因,我想了解有关流的更多信息以及利用 Java 8 的这一强大新增功能的正确方法。
示例代码如下:
listOfWebElements.stream().filter(element -> element.getText().contains(name)).findFirst().ifPresent(match -> match.click());
是我在这个问题中所指的行,它提供了方法以使其更有意义。
@FindBy(css = "#someTable td.some-name li a") List<WebElement> listOfWebElements;
public SomeClass doSomething(String name) {
wait.until(visibilityOfAllElements(listOfWebElements));
listOfWebElements.stream().filter(element -> element.getText().contains(name)).findFirst()
.ifPresent(match -> match.click());
return new SomeClass(driver);
}
最佳答案
Java 8 流是 fluent interface 的一个示例, 并旨在允许写入 functional programming风格。关于什么打破了 LoD 以及它是否重要存在很多分歧,但除此之外,documentation for Stream
中的示例表明您正在按照 Java 语言设计者的意图使用它。
如果这对您的审阅者来说还不够,请注意 Demeter 法则(又名最少知识原则)的目的是通过最小化类的数量来保持程序的松散耦合一个类直接与之通信。当A
有一个 B
和 B
有一个 C
,你想要 A
制作C
做某事,你应该让它告诉B
完成它并让B
担心如何以及何时的细节C
被使用。
在这种情况下,Stream
上的每个中间方法正在返回 Stream
的另一个实例, 所以你仍然只耦合到 Stream
类(class)。我不认为这是违反 Demeter 法则。
我还想说,一种语言中的任何类都应该被认为与该语言的标准库耦合。因此,任何标准库对象都应该豁免得墨忒耳法则,因为无论如何您都无法与它们解耦。否则,您甚至无法调用 get
在 List
上由对象返回,或处理 Set
的 Map.Entry
来自 Map.entrySet()
.这也将涵盖 Stream
,当然。
I was suggested to break the code to first stream to collect to list and run another stream operation to do match( in short break it down into multiple streams as needed).
在局部变量中存储中间对象不会解决得墨忒尔定律的违规问题,您仍然会访问其他对象返回的对象。听起来你的审稿人只是盲目的dot-counting .
关于java - Streaming 的多项操作能否打破 Demeter 法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45491555/
我正在尝试了解如何正确使用被动 View 。在我看来,我在被动 View 上看到的每个例子都违反了德米特法则: //In the presenter code myview.mytextfield.t
如果我有一个包含方法 f 的类 C,该方法将 D 类型的对象(我定义的另一个类)作为参数 如果我在方法f中调用对象D的方法,是否会违反得墨忒耳定律?为什么? 例如: public C { pu
我愿意遵守得墨忒耳法则。但我也想延迟加载一些传递给构造函数的对象。我应该如何实现?通过包装类?传递函数指针? 最佳答案 您实际上可以编写一个通用包装器来完成此操作: template class L
从这里引用:https://en.wikipedia.org/wiki/Law_of_Demeter More formally, the Law of Demeter for functions r
以下代码打破了 Law of Demeter : public class Student extends Person { private Grades grades; public Stu
感觉好像走到了死胡同。如果我理解正确,那么如果我遵循 Law of Demeter我永远无法制作一个返回对象的方法,然后客户端代码调用它。我只是在考虑总是返回一个对象的工厂模式。是的,有返回对象的映射
我有一个简单的 Store 类,其中包含一个 Inventory。 Inventory 包含一个 Item 列表。为了修改 Inventory 中的其中一个 Item,我必须这样写: Store st
public class BigPerformance { public decimal Value { get; set; } } public class Performance
我知道以下是一个主观问题,但您的指导方针确实有助于我追求干净、可测试的代码。 请考虑以下示例,我认为它违反了一系列设计原则。 public class OfferEligibilityCheckerS
我最近才知道 Law of Demeter . 像很多事情一样,我意识到这是我已经在做但没有名字的事情。虽然有几个地方我似乎违反了它。 例如... 我可能有一个地址对象: public class A
在敏捷开发人员的基本技能中,在需求与能力接口(interface)中,第 12 章,我试图理解作者在本章末尾提到的应用分度法则的挑战所提出的主要解决方案。 为了使故事简短。 我们从以下研究案例开始:
我经常发现自己做了很多 delegating . 在Ruby Science ,它说: Many delegate methods to the same object are an indicato
我有点想用 Java 8 流编写 Selenium 页面对象,如下面的代码所述,并收到评论说我的代码违反了 Demeter 法则,因为我在一行中执行了很多操作。我被建议将代码分解为第一个流以收集列表并
我有一个游戏引擎,我将物理模拟从游戏对象功能中分离出来。所以我有一个物理 body 的纯虚拟类 class Body 我将从中导出物理模拟的各种实现。我的游戏对象类看起来像 class GameObj
我对如何避免一对多关联违反得墨忒耳法则感到困惑。假设我有一个这样的模型: class Organization < ActiveRecord::Base has_one :address ha
如果我有一个对象的 ArrayList,那么任何时候我需要调用 ArrayList 成员的任何方法时,我都需要这样做: list.get(i).doSomething(); 这看起来很可疑地违反了 D
我在设计在 SpringMVC/Hibernate Rest Web 应用程序中的 @ManyToMany 集合上运行的服务方法时遇到问题,而不使用违反 Demeter 法则的长方法链。我的应用程序有
这可能是一个幼稚的问题,但是 RSpec 的测试 DSL 是否违反了 Demeter 法则? 这是来自 http://rspec.info 的 RSpec DSL 示例: bowling.score.
假设您有一个类 Car,它有一个 Driver。如果你想访问司机的年龄,你会这样做: @car.driver_age 代替 @car.driver.age 如果您在 Car 模型中委托(delegat
我正在使用一个工具来自动生成按层次结构组织的 XML 文件的类表示形式。 XML 文件是我的应用程序需要能够访问的设置文件(只读)。 如果我将顶级节点(例如,AppSettings)传递给需要访问一项
我是一名优秀的程序员,十分优秀!