Я просматривал несколько классов, которые у меня есть в проекте Android, и я понял, что я смешиваю логику с данными. Поняв, насколько плохо это может быть с точки зрения удобочитаемости и тестовой способности моего проекта, я решил сделать некоторые рефакторинг, чтобы абстрагировать логику всех служб на отдельные модули услуг. Однако, поскольку я полагался на полиморфизм Java, я потерялся и нуждаюсь в некоторых рекомендациях.
Предположим, что у меня есть этот "to-be-changed" макет для суперкласса данных и два подкласса:
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()
и render()
в класс службы. Однако иногда мне нужно иметь возможность вызвать этот метод в экземпляр скомпилированного типа 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();
}
}
Где я все еще сохраняю методы 'dummy' в каждом подклассе, который вызовет соответствующий метод службы. Тем не менее, я не думаю, что это действительно достигает разделения, которое я хочу, поскольку классы данных все равно будут знать об услугах (плохо!).
Любые идеи о том, как это решить?
Изменить: обратите внимание, что render()
и saveToDB()
являются просто типичными примерами того, что эти методы могут быть, поэтому проблема заключается не в выборе методов ORM или SQL.