gpt4 book ai didi

java - Streaming 的多项操作能否打破 Demeter 法则?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:59 25 4
gpt4 key购买 nike

我有点想用 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有一个 BB有一个 C ,你想要 A制作C做某事,你应该让它告诉B完成它并让B担心如何以及何时的细节C被使用。

在这种情况下,Stream 上的每个中间方法正在返回 Stream 的另一个实例, 所以你仍然只耦合到 Stream类(class)。我不认为这是违反 Demeter 法则。

我还想说,一种语言中的任何类都应该被认为与该语言的标准库耦合。因此,任何标准库对象都应该豁免得墨忒耳法则,因为无论如何您都无法与它们解耦。否则,您甚至无法调用 getList 上由对象返回,或处理 SetMap.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com