我的应用程序中有2个服务端点,a
并且b
(两个都是“ Singles”)。服务请求b
取决于的响应a
。在响应之后,b
我需要访问订户中的两个响应。我打算这样打电话:
services.a()
.flatMap(a -> services.b(a))
.subscribe(b ->
// Access a and b here
)
Run Code Online (Sandbox Code Playgroud)
但是通过这种方式,我只能访问b
订户中的结果。我又如何传递对此的回应a
?
我的第一个尝试是使用类似这样的东西:
// Note: Code will not compile... Just to show the concept
services.a()
.flatMap(
a -> Observable.combineLatest(
Observable.just(a)
services.b(a).toObservable()
Bifunction((a, b) -> {return Pair<ResponseA, ResponseB>(a, b)}))
)
.toSingle()
.subscribe(pair -> {
ResponseA a = pair.first();
ResponseB b = pair.second();
})
Run Code Online (Sandbox Code Playgroud)
但是随着用例变得更加复杂,代码将演变为丑陋的怪物。
我有一个如下所示的 Java 类:
public class MyClass {
/** Database Connection. */
private dbCon;
public MyClass() {
dbCon = ...
}
public void doSomethingWith(MyData data) {
data = convertData(data);
dbCon.storeData(data);
}
private MyData convertData(MyData data) {
// Some complex logic...
return data;
}
}
Run Code Online (Sandbox Code Playgroud)
由于这个类的真正逻辑在于convertData()
方法,所以我想为这个方法编写一个单元测试。所以我读了这篇文章
很多人说需要测试私有方法是一种设计味道。怎样才能做得更好呢?
我看到两种方法:
convertData()
使用公共 api 将方法提取到某个实用程序类中。但我认为这也是一种不好的做法,因为此类实用程序类将违反单一责任原则,除非我创建大量可能只有一两个方法的实用程序类。
编写第二个允许注入的构造函数dbCon
,这允许我注入数据库连接的模拟版本并针对公共doSomething()
方法运行测试。这将是我首选的方法,但也有关于模拟的需要如何也是一种代码味道的讨论。
对于这个问题有什么最佳实践吗?
我在模型的MVVM模式之后有一个tornadoFX应用程序:
data class Person (
val name: String,
val cars: List<Car>
)
data class Car (
val brand: String,
val model: String
)
Run Code Online (Sandbox Code Playgroud)
该应用程序定义以下视图:
有一个列出所有人员的列表视图。除了listView之外,还有一个详细信息视图,其中包含用于该人姓名的文本字段和用于该人的汽车的表格视图。
双击表中的汽车条目会打开一个对话框,您可以在其中编辑汽车的属性。
我想要,如果我打开汽车细节并编辑条目,那么更改将反映在表格视图中。由于我无法通过添加fx-properties来更改Car模型(这是不可变的类型),因此我提出了以下视图模型:
class PersonViewModel(): ItemViewModel<Person> {
val name = bind(Person::name)
val cars = bind { SimpleListProperty<CarViewModel>(item?.cars?.map{CarViewModel(it)}?.observable()) }
override fun onCommit {
// create new person based on ViewModel and store it
}
}
class CarViewModel(item: Car): ItemViewModel<Car> {
val brand = bind(Car::name)
val model = bind(Car::model)
init {
this.item = item
}
}
Run Code Online (Sandbox Code Playgroud)
这样,如果双击表视图中的汽车条目并打开汽车详细视图,则对汽车的更新将直接反映在表视图中。
我的问题是,我找不到将表中所有CarViewModel的脏属性绑定到PersonViewModel的方法。因此,如果我换车,PersonViewModel不会被标记为脏车。 …