我一直在查看我在一个 android 项目中的几个类,我意识到我一直在将逻辑与数据混合在一起。意识到这对我的项目的可读性和可测试性有多么糟糕,我决定进行一些重构,以便将所有服务逻辑抽象为单独的服务模块。但是,由于我一直依赖 Java 的多态性,所以我迷路了,需要一些指导。
假设我有一个超级数据类和两个子类的“待更改”布局:
public class DataItem {
/* some variables */
public saveToDB(/* Some Arguments */) {
/* do some stuff */
}
public render() {
/* render the class */
}
}
public class ChildDataItemA extends DataItem {
@Override
public saveToDB(/* Some Arguments */) {
super.saveToDB();
/* more specific logic to ChildDataItemA */
}
@Override
public render() {
/* render logic for ChildDataItemA */
}
}
public class ChildDataItemB extends DataItem {
@Override
public saveToDB(/* Some Arguments */) {
super.saveToDB();
/* more specific logic to ChildDataItemB */
}
@Override
public render() {
/* render logic for ChildDataItemB */
}
}
现在,我考虑将saveToDB()
andrender()
方法移至服务类。但是,有时我需要能够在DataItem
不知道其运行时类型的情况下将这些方法调用到已编译类型的实例中。例如,我可能想拨打以下电话:
List<DataItem> dataList;
for (DataItem item: dataList) {
item.saveToDB();
item.render();
}
此外,我还想过做以下事情:
public class ChildDataItemB extends DataItem {
@Override
public saveToDB(/* Some Arguments */) {
super.saveToDB();
/* more specific logic to ChildDataItemB */
Service.saveToDBB();
}
@Override
public render() {
/* render logic for ChildDataItemB */
Service.renderB();
}
}
我仍然在每个子类中保留“虚拟”方法来调用适当的服务方法。但是,我认为这并没有真正实现我想要的分离,因为数据类仍然会知道服务(糟糕!)。
关于如何解决这个问题的任何想法?
编辑:请注意,这render()
只是saveToDB()
这些方法的通用示例,因此问题不在于选择 ORM 或 SQL 相关技术。