- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我审查一些代码时,我看到了这个片段。
List<User> users = /* Some code that initializes the list */;
users.stream()
.filter(user -> user.getAddress().isPresent())
.map(/* Some code */)
// And so on...
方法的调用user.getAddress()
返回 Optional<Address>
.遵循著名的 Demeter 法则 (LoD),上面的代码并不干净。但是,我不知道如何重构它以使其更清洁。
第一次尝试可能是添加到 User
类方法 hasAddress()
, 但这种方法克服了拥有 Optional<Address>
的需要, 国际海事组织。
我应该如何重构上面的代码?在这种情况下,是否值得满足 LoD?
编辑:我错过了在 map
中指定的内容方法我不想返回地址。
最佳答案
嗯,你自己总结得很好:如果你想通过引入 hasAddress()
来更松散地耦合,为什么要返回一个 Optional
。
Reading into what the LoD says ,它谈到对“密切相关”单位的“有限”了解。对我来说这听起来像是一个灰色地带,但更进一步,它还提到了“只有一个点”的规则。不过,我同意对您的问题的评论,即空检查(或 isPresent()
)完全没问题(哎呀,从技术上讲,真正的空检查甚至不需要点 ;P )。
如果你真的想封装更多,你可以完全删除 getAddress()
并提供:
class User {
private Optional<Address> address;
boolean hasAddress() {
return address.isPresent();
}
// still exposes address to the consumer, guard your properties
void ifAddressPresent(Consumer<Address> then) {
address.ifPresent(then::accept);
}
// does not expose address, but caller has no info about it
void ifAddressPresent(Runnable then) {
address.ifPresent(address -> then.run());
}
// really keep everything to yourself, allowing no outside interference
void ifAddressPresentDoSomeSpecificAction() {
address.ifPresent(address -> {
// do this
// do that
});
}
}
但是,正如评论者指出的那样:值得/有必要吗?所有这些法律/原则很少是绝对的,比教条更具有指导意义。在这种情况下,它可能是关于平衡 LoD 与 KISS。
最后,由您决定此特定示例是否受益于将流的功能移至 User 类。两者都是有效的,可读性/可维护性/清洁度取决于:
关于java - 可选的 monad 和 Java 中的 Demeter 法则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47347068/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!