Где я должен поместить функции, не связанные с каким-либо одним дочерним объектом, а скорее связанные с их «коллекцией»? - PullRequest
0 голосов
/ 07 июня 2019

Я недавно взялся за простой php-проект, чтобы немного лучше узнать ООП.

По сути, проект состоит из одной таблицы, в которую можно вставить несколько предметов разных типов (продукты питания, мебель, электроника и т. Д.).

У меня есть abstract class Items(), который создает соединение с базой данных и определяет abstract function save_item(). У меня также есть класс для каждого типа элемента, который расширяет Items (), т.е. class FurnitureItem extends Items()

Класс ItemsFactory() просто генерирует правильный объект.

Это сделано из-за того, что каждый тип элемента имеет немного разные свойства и входные данные должны обрабатываться по-разному.

Однако у меня также есть такие функции, как fetch_items() (просто выводит все элементы из таблицы) и delete_items() (массовое удаление элементов, не заботящихся об их типе). Эти функции функция не имеет отношения к типу элемента.

У меня вопрос, куда мне положить fetch_items() и delete_items()?

Очевидно, что они не имеют отношения к конкретному типу элементов (поэтому их не следует определять в дочерних классах), однако определение их в родительском классе Items() кажется нелогичным, поскольку дочерние классы также наследуют эти функции. Но они не должны, по вышеуказанной причине.

Должен ли я создать новый класс только для этих функций? Тогда, по сути, я буду делать класс, который содержит только общие функции проекта.

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 07 июня 2019

Очевидно, что они не имеют отношения к конкретному типу элементов (поэтому их не следует определять в дочерних классах), однако определение их в родительском классе Items () представляется нелогичным, поскольку дочерние классы также наследуют эти функции. Но они не должны, по вышеуказанной причине.

Но вы действительно хотите определить эти функции для каждого из подтипов. Вы хотите, чтобы класс FurnitureItem имел функцию delete_items() (потому что вы будете вызывать эту функцию для этого класса позже). Поскольку эта функция является общей для других подтипов, имеет смысл включить ее в родительский класс Items, потому что это базовая реализация для удаления любых «элементов». Базовые классы обычно всегда содержат логику, общую для всех дочерних классов.

Кроме того, если вы хотите пользовательскую реализацию delete_items() позже для определенного подкласса, вы можете переопределить функцию в этом классе

...