代码之家  ›  专栏  ›  技术社区  ›  Mrignainee

流媒体的多个操作能否违反德米特定律?

  •  10
  • Mrignainee  · 技术社区  · 9 年前

    请分享您的想法,我已经按照评论员的建议进行了更改,但他无法解释原因,我想了解更多关于流的信息,以及如何正确利用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);
    
    }
    
    2 回复  |  直到 9 年前
        1
  •  14
  •   Sean Van Gorder    9 年前

    Java 8流是 fluent interface functional programming documentation for Stream 表明您正在按照Java语言设计器的意图使用它。

    如果这对你的评论者来说还不够,请注意,得墨忒尔定律(也称为 )就是通过最小化一个类直接与之通信的类的数量来保持程序的松散耦合。什么时候 A B B 有一个 C ,而你想要 A. C 做点什么,你应该告诉别人 B B 已使用。

    流动 正在返回的另一个实例 流动 ,所以您仍然只耦合到 流动

    我还要说,一种语言中的任何类都应该被视为与该语言的标准库相耦合。因此 任何标准库对象 豁免 从得墨忒尔定律,因为你无论如何都无法与他们脱钩。否则你甚至不能打电话 get 在 List Set 属于 Map.Entry 从…起 Map.entrySet() 流动

    将中间对象存储在局部变量中 如果修复了违反德米特定律的情况,您仍然可以访问其他对象返回的对象。听起来你的评论者只是盲目的 dot-counting .

        2
  •  -1
  •   Robert Bräutigam    9 年前

    Here 是对得墨忒尔定律的详细解释。当然有一些灰色区域,但它实际上是相当明确的。

    然而,最有可能违反的是这一部分:

    element.getText().contains(name);
    

    根据LoD,你不能访问/调用任何你不能直接访问的方法 getText() 返回的一些内部状态 element 。这不是您可以直接访问的内容,因此 contains(name) 方法调用非法。