| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Общие вопросы > Как правильно передавать переменные в объекты? |
| Автор: Infod 31.3.2007, 16:28 |
| Есть класс MainClass.pm создаем объект $main = new MainClass; присваиваем объекту константу $main->{myconst} = "Something"; В главном пакете есть много разных подпакетов вида MainClass::SubClass1 MainClass::SubClass2 объекты создаются вида: $main->{obj1} = new MainClass::SubClass1; также есть вида: MainClass::SubClass1::SubSubClass1 и есть класс MainClass::Uni::LWP.pm так вот, этот универсальный класс используется многими другими подклассами. и при создании объекта $ua = new MainClass::Uni::LWP; в него нужно передать константу $main->{myconst} из главного класса Как это сделать, если объект LWP создается во всех классах? Пока приходят в голову глобальные переменные (фи Помогите плз, я не очень силен в ООП, подозреваю, что ответ должен быть простой Сорри, если сумбурно Спасибо |
| Автор: Nab 31.3.2007, 17:42 | ||
| У меня реализован такой механизм. Так как весь основной функционал реализуется через методы ядра, и плагины добавляют объекту ядра дополнительный функционал тоже в виде методов, то объект ядра у меня сквозной: передаеться как параметр всем объектам - плагинам при создании и доступен из любой точки приложения.
И еще, как правило напрямую к объекту как к хешу не стоит обращаться, нужно реализовать доступ к свойствам через методы, тогда контролировать легче будет кто где и чего изменяет... |
| Автор: Infod 31.3.2007, 19:35 | ||||
А есть ли более красивые способы? И сильно ли повлияет передача объекта во все другие объекты на использование памяти и быстродействие?
Я так и делаю, в примере для простоты написал |
| Автор: korob2001 31.3.2007, 20:07 | ||
Можно попробовать, в основном классе. Создать поле, в котором и будет храниться уже созданный объект класса MainClass::Uni::LWP. Создавать этот объект можно в конструкторе основного класса. Затем создать метод, который будет при необходимости возвращать уже готовый объект, всем подклассам, которые его используют или наследуют от него. В итоге у нас в памяти будет только один объект, с которым и будут работать все подклассы и наш основной класс. Разумеется такой подход не всегда уместен, но если при создании объекта используются одни и те же данные, то он вполне оправдан. Хотя возможно я не совсем понял условие задачи. |
| Автор: Infod 31.3.2007, 20:35 | ||||
Об этом я тоже сразу подумал, правда мне совсем не понятно, как это реализовать. Набросал пример, если не трудно, можете пояснить на этом коде?
т.е. не понятно, как созданным объектам получить доступ к объекту $obj. Или я создаю их неправильно? |
| Автор: nitr 31.3.2007, 21:43 | ||
сказано... |
| Автор: tishaishii 31.3.2007, 22:02 |
| Как получится - так и "правильно". |
| Автор: korob2001 31.3.2007, 22:28 | ||||
Ну так через конструкторы и передавай свою константу:
Константу мы передали до места назначения, но код этот глюковатый. Так как над ним можно, а главное нужно, хорошенько подумать. Для этого либо тебе нужно чётко изложить, цель всего, что написано выше, либо перейти на примеры попроще. Ты помоему сильно увлекаешься созданием методов-фабрик, т.е. в методе ты создаешь новый объект. Вот здесь например:
Перед тем как создавать такую фабрику объектов, нужно подумать: А действительно нужно создавать новый объект при каждом вызове метода main_func() или ua()? Или же можно создать этот объект один раз, в конструкторе или методе INIT, при созданнии текущего объекта, сохранить её в тот же анонимный хеш и пользоваться этой ссылкой везде, где объект не обязательно должен быть новым? |
| Автор: Infod 31.3.2007, 23:17 | ||||
Это ж неудобно. А если констант или переменных несколько, и каждому объекту нужны не все они? Передавать хеш с параметрами не предлагать
Это я в примере написал, чтобы показать, насколько бывает неудобно таскать эту константу по объектам. А цель у меня была - понять, как лучше всего обмениваться параметрами между объектами. Значит только передавать ссылку на главный объект или передавать каждому объекту нужные параметры через конструктор? |
| Автор: korob2001 1.4.2007, 04:07 |
| В принципе, можно передавать не только число или строку, можно создатьвать объект любого класса и передать его, твоему классу. Главное что бы твой класс был готов корректно работать с этим объектом. Как класс это будет делать, конечного программиста, использующего его, вообще не должно волновать. Он читает документацию, изучает интерфейс класса и работает с его открытыми методами и полями. Так же не стоит забывать о наследовании, если ответ на вопрос: "Является?", положительный. Например: Пудель, является Собакой? Да. Значит класс Pudel может быть подклассом класса Dog. Собака, является Животным? Да. Значит класс Dog может быть подклассом класса Animal. |