可以通过Streaming进行多项操作打破Demeter法吗?

Mri*_*nee 7 java selenium law-of-demeter pageobjects java-stream

我很少去幻想和写硒页面对象与Java 8流,如下面的代码中提到并得到了我的代码是打破得墨忒耳定律,因为我在一行做很多操作的审查意见.我被建议将代码分解为第一个流来收集列表并运行另一个流操作来进行匹配(简而言之,根据需要将其分解为多个流).我不相信Stream是用于处理数据处理的,如果我们将其分解为多个流,那么使用流是没有意义的.在此之前,我曾参与过网络安全项目,数百万条记录通过流媒体处理,并通过多种逻辑操作对数据进行排序.

请分享您的想法,我已经按照审稿人的建议对其进行了更改,但他无法解释原因,我想了解更多关于流和正确利用这一强大的java 8补充方法的方法.

以下是示例代码:

listOfWebElements.stream().filter(element -> element.getText().contains(name)).findFirst().ifPresent(match -> match.click());
Run Code Online (Sandbox Code Playgroud)

我在这个问题中指的是这条线,提供方法使它更有意义.

@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);

}
Run Code Online (Sandbox Code Playgroud)

Sea*_*der 11

Java 8流是流畅接口的一个示例,旨在允许以函数式编程风格进行编写.关于破坏LoD以及它是否重要的​​问题存在很多分歧,但除此之外,文档中Stream的示例表明您正在使用Java语言设计者的预期.

如果这对于您的评论者来说还不够,请注意Demeter法则(也就是最不知识原则)的目的是通过最小化类直接与之通信的类的数量来使程序松散耦合.当ABBC,你要AC做一些事情,你应该有它告诉B的这一切,让B有关如何以及何时细节担心C被使用.

在这种情况下,每个中间方法Stream都返回另一个实例Stream,所以你仍然只是耦合到Stream类.我不认为这是德米特违法法.

我还要说语言中的任何类都应该被认为与语言的标准库相关联.因此,任何标准库对象都应该免于 Demeter法则,因为无论如何你都不能解除它们.否则,你甚至不能够调用getList,是由它返回一个对象,或应对SetMap.EntryMap.entrySet().Stream当然,这也包括在内.

我被建议将代码分解为第一个流来收集列表并运行另一个流操作来进行匹配(简而言之,根据需要将其分解为多个流).

将中间对象存储在局部变量中并不能修复Demeter违规定律,您仍然可以访问其他对象返回的对象.听起来你的评论家只是盲目点数.