Это может оказаться смущающе глупым вопросом, но лучше, чем потенциально создать смущающе глупый код. :-) Это действительно вопрос дизайна ОО.
Допустим, у меня есть объектный класс 'Foos', представляющий набор динамических элементов конфигурации, которые получаются путем запроса команды на диске 'mycrazyfoos -getconfig'. Скажем, есть две категории поведения, которые я хочу, чтобы объекты 'Foos' имели:
Существующие: во-первых, запрашивайте те, которые существуют в выводе команды, о котором я только что упомянул (/ usr / bin / mycrazyfoos -getconfig`. Вносите изменения в существующие с помощью команд оболочки.
Создание новых, которые не существуют; новые 'crazyfoos', использующие сложный набор /usr/bin/mycrazyfoos
команд и параметров. Здесь я на самом деле не просто запрашиваю, а на самом деле выполняю кучу команд system (). Влиять на изменения.
Вот моя структура классов:
Foos.pm
пакет Foos, который имеет новый конструктор ($ hashref -> {name => 'myfooname',), который принимает 'crazyfoo NAME' и затем запрашивает существование этого NAME, чтобы увидеть, существует ли оно уже (путем выделения и запуск команды mycrazyfoos выше). Если этот crazyfoo уже существует, верните объект Foos :: Existing. Любые изменения в этом объекте требуют обстрела, запуска команд и получения подтверждения того, что все в порядке.
Если это путь, то конструктор new () должен иметь тест, чтобы увидеть, какой конструктор подкласса использовать (если это даже имеет смысл в этом контексте). Вот подклассы:
Foos / Existing.pm
Как упоминалось выше, это для случая, когда объект Foos уже существует.
Foos / Pending.pm
Это объект, который будет создан, если, как указано выше, 'crazyfoo NAME' на самом деле не существует. В этом случае вышеописанный конструктор new () будет проверен на наличие дополнительных параметров, и он будет продолжен, и при вызове с помощью -> create () будет выложен с помощью system () и создаст новый объект ... возможно, возвращая ' Существующий 'один ...
ИЛИ
Набирая это, я понимаю, что, возможно, лучше иметь один:
(альтернативное расположение)
класс Foos, который имеет
-> new (), который принимает только имя
-> create (), который принимает дополнительные параметры создания
-> delete (), -> change () и другие параметры, которые влияют на существующие; это нужно будет просто динамически проверять.
Итак, мы здесь, два основных направления в этом направлении. Мне любопытно, что было бы более разумным путем.