Позвольте мне провести вас через мои рассуждения:
Методы класса
Основной принцип: Сопротивление - это поведение класса и должно быть методом класса
Вам нужно разделить задачи, поэтому вы помещаете базу данных в класс DAO и используете ее из класса для реализации методов.
Первая проблема: если вам нужно поддерживать разные наборы DAO, вам нужно создать их через Factory.
Вторая проблема: не все персистентные поведения конкретно связаны с экземпляром класса. Например, методы List и Search: они возвращают списки классов, а не классы и не зависят от экземпляра. Таким образом, они в основном статические методы.
Третья проблема: вы хотите поддерживать наследование в этом классе. Как таковые, детали постоянства отличаются от родителя к ребенку. Если у вас есть статические методы, это будет проблемой.
Итак, вы переходите к
Контроллер
Основной принцип: Методы персистентности не принадлежат к одному классу, они больше и поэтому должны быть отделены
Разделение проблем необходимо снова, поэтому вам нужны DAO. Это класс Utility, поэтому все методы в основном static .
Первая проблема: вам нужна фабрика для создания DAO, если вы хотите поддерживать более одного метода персистентности.
Вторая проблема: вы хотите поддерживать иерархию классов, чтобы вы не могли использовать статический класс. Вам нужно генерировать контроллеры через фабрику.
Третья проблема: вы предлагаете слишком сложный API своим разработчикам.
Пример кода клиента:
PurchaseOrder po;
PurchaseOrderController poc;
poc = PurchaseOrderControllerFactory.Instance.Create();
po = poc.GetPurchaseOrder(42);
// do stuff
poc.SavePurchaseOrder(po);
тогда я бы начал с нуля.
Начните с поведения
Основной принцип: Упорство - это не поведение. Поведения больше, чем настойчивость.
В вашей системе будет подсистема заказа на покупку. Ваш пользователь сможет взаимодействовать с ним только на высоком уровне (уровень использования). Таким образом, методы будут реализовывать варианты использования заказа на поставку. Эти методы будут использовать DAO через фабрику, если необходимо, для доступа к базе данных и делать все, что им нужно.
Короче говоря, ваш PurchaseOrder - это, по сути, DTO, быстрый способ передачи данных. Не должно быть поведения.
Пример кода клиента:
// It could be a factory if needed.
PurchaseOrderSystem pos = new PurchaseOrderSystem();
List<PurchaseOrder> transacted;
transacted = pos.TransactPurchaseOrders(john, 23);
// Show transacted purchase orders or whatever...