Спустя 9 минут, 36 секунд (17.05.2011 - 13:19) linker написал(а):
Почитай про петтерн синглтон - самый банальный и простой пример.
Спустя 14 минут, 17 секунд (17.05.2011 - 13:33) Krevedko написал(а):
угу. вот тут понятно описан этот паттерн
http://www.irbis-team.com/15/23/1
http://www.irbis-team.com/15/23/1
Спустя 41 минута, 56 секунд (17.05.2011 - 14:15) program90 написал(а):
А зачем нужно прятать как private статический член экземлпяра класса? Т.е. есть функция с помощью которой дается доступ к экземпляру класса, а зачем его скрывать с помощью private инкапсуляции? Просто те кто его используют наверняка знаю что нужно получать доступ через a::getInstance().
Или здесь имеется ввиду что инкапсуляция это как бы доступ к переменной через функцию, т.е. это инкапсуляция не в смысле применения private?
Или здесь имеется ввиду что инкапсуляция это как бы доступ к переменной через функцию, т.е. это инкапсуляция не в смысле применения private?
Спустя 6 минут, 38 секунд (17.05.2011 - 14:22) linker написал(а):
program90
Получить да, а вот изменить не смогут. В это суть этого паттерна.
Получить да, а вот изменить не смогут. В это суть этого паттерна.
Спустя 2 минуты, 32 секунды (17.05.2011 - 14:24) twin написал(а):
Тормоза придумали трусы
Инкапсуляцию тоже. Да никогда не остановит меня свойство private от того, чтобы непосмотреть изменить класс к лучшему.
Это по идее защита от дурака.

Инкапсуляцию тоже. Да никогда не остановит меня свойство private от того, чтобы не
Это по идее защита от дурака.
Спустя 31 минута, 56 секунд (17.05.2011 - 14:56) Arni написал(а):
Цитата (twin @ 17.05.2011 - 11:24) |
Тормоза придумали трусы ![]() Инкапсуляцию тоже. Да никогда не остановит меня свойство private от того, чтобы не Это по идее защита от дурака. |
Человек склонен ошибаться. Это защита, и она очень эффективна в больших проектах. Если автор задал этот вопрос, значит я даю 100% гарантию что он не писал систем которые состоят не менее чем с 2000 строк. Как только наступит время и вы поработаете над большим проектом, все сами поймете.
twin, я с вами категорически не согласен, и даже принимаю слова
Цитата |
Это по идее защита от дурака |
как личное оскорбление, и оскорбление в сторону очень многих программистов. Уже 100 раз подымался вопрос про недостатки ООП. И я очень хорошо знаком с вашей точкой зрения. И да, я согласен с тем что ООП в пхп это что-то чуток парадоксальное и далеко не всегда уместно. Но это не значит что так будет всегда, и что абстрагировать в данный момент нечего. Это не так.
Автору объясню зачем это нужно очень просто.
Все эта жуть с ооп, а именно. Инкапсуляция, Иерархия, Полиморфизм создана для того чтобы.
Инкапсуляция - помогает удержать пространство имен в чистоте.
Иерархия - помогает избежать повторения кода, а также упрощает отслеживание логических связей кода.
Полиморфизм - Легкость модификации объекта, для адаптации под схожие задачи.
Автору объясню зачем это нужно очень просто.
Все эта жуть с ооп, а именно. Инкапсуляция, Иерархия, Полиморфизм создана для того чтобы.
Инкапсуляция - помогает удержать пространство имен в чистоте.
Иерархия - помогает избежать повторения кода, а также упрощает отслеживание логических связей кода.
Полиморфизм - Легкость модификации объекта, для адаптации под схожие задачи.
Спустя 30 минут, 21 секунда (17.05.2011 - 15:27) program90 написал(а):
Arni
Цитата |
Если автор задал этот вопрос, значит я даю 100% гарантию что он не писал систем которые состоят не менее чем с 2000 строк. |
может и писал, почему нет...
И потом смотря как писать - многие пишут каждый раз отделяя пустыми строками, и перенося фигурные скобки без конца на новую строку. В результате то что у вас 10000 строк - может быть и 1000 или меньше.))
Цитата |
Иерархия - помогает избежать повторения кода, а также упрощает отслеживание логических связей кода. |
Именно повторения кода, или еще позволяет уменьшить объем занимаемой памяти? Вместо создания 1000 копий одного объекта, с разными дополнениями, создается один базовый а остальные как дополнения?
Спустя 7 минут, 33 секунды (17.05.2011 - 15:34) linker написал(а):
program90
Объектов создается именно столько сколько ты сам создашь.
twin
Опрометчиво разрушать фундамент здания, если рухнет - по голове начальство не погладит.
Объектов создается именно столько сколько ты сам создашь.
twin
Опрометчиво разрушать фундамент здания, если рухнет - по голове начальство не погладит.
Спустя 18 минут, 41 секунда (17.05.2011 - 15:53) Arni написал(а):
Цитата (program90 @ 17.05.2011 - 12:27) | ||
Arni
может и писал, почему нет... |
Ну так вот и отвечайте, писали систему более чем 2000 строк (не интересно как сжимали код), или нет?
Цитата |
Именно повторения кода, или еще позволяет уменьшить объем занимаемой памяти? Вместо создания 1000 копий одного объекта, с разными дополнениями, создается один базовый а остальные как дополнения? |
Про економию памяти мне трудно сказать, я бы даже сказал хз. Класс, это модель объекта или как бы еще точнее сказать. Объект рождается когда черным по белому (ну или как у вас там редактор настроен) $obj = new classname(); Все, если мы подключили либу где намучено всяких наследований и прочей лабуды, мы об этом не узнаем. Если конечно не заглянем в исходники. И сколько оно сожрет памяти зависит от того сколько объект потребует этого. И само наслеование никак по идее не должно помогать (если я ниче не пропустил) экономить память. Создается экземпляр объекта в памяти со всеми его методами и полями по идее. Но с другой стороны, я не владею информацией как это в пхп, может в пхп оно и экономит память, потому что как я уже заметил, Пхп создает объект не так полноценно как это делается в С++. Тоисть переменные получают память, а вот для вызова методов, пхп обращется к файлу (ну не обязательно на диск, механизм запуска пхп приложения достаточно сложный процесс.). Потому можно предположить что если идет вызов метода который находится в родительском классе, то пхп будет искать код там где он есть. И может быть такое что память в этом случае экономит. Но утверждать на 100% не могу. Такой вопрос надо задать разработчикам пхп.
Спустя 17 минут, 11 секунд (17.05.2011 - 16:10) program90 написал(а):
Так получается что инкапсуляция нужна только для того чтобы программист не ошибся и ему было проще писать, обращаться с переменными? Только для этого? Может быть Страуструп придумал это не только для этого?...
Спустя 2 минуты, 19 секунд (17.05.2011 - 16:12) linker написал(а):
Мериться объемом кода, всёравно что мериться пиписьками, у индусов всёравно длиннее.
Спустя 32 секунды (17.05.2011 - 16:13) program90 написал(а):
linker
))))))Да. точно!
))))))Да. точно!
Спустя 36 минут, 1 секунда (17.05.2011 - 16:49) program90 написал(а):
Arni
Написано, что в Javascript при создании объектов через prototype экономится память
Написано, что в Javascript при создании объектов через prototype экономится память
Спустя 1 час, 17 минут, 17 секунд (17.05.2011 - 18:06) Arni написал(а):
Цитата (program90 @ 17.05.2011 - 13:10) |
Так получается что инкапсуляция нужна только для того чтобы программист не ошибся и ему было проще писать, обращаться с переменными? Только для этого? Может быть Страуструп придумал это не только для этого?... |
Надо же .... А вы искали во всем этом некий глубокий смысл создания вселенной?
Цитата |
Написано, что в Javascript при создании объектов через prototype экономится память |
Ну вот поищите что написано про пхп. Я вот к примеру не интересовался. Хотя для того чтобы это выяснить достаточно поставить эксперимент вот и все.
Спустя 15 часов, 15 минут, 44 секунды (18.05.2011 - 09:22) kirik написал(а):
Цитата (program90 @ 18.05.2011 - 02:11) |
Arni Ну, извините, но если вы не знаете то лучше не отвечать, пусть ответят те кто знают)). А то так можно все темы закрывать сразу)) |
Если бы ты прочитал как реализуется наследование в JS, а не выхватывал куски утверждений, то не задавал бы таких вопросов не по теме.
В php наследование основано на классах, а в JS на объектах (прототипах) - отсюда экономия памяти.
Спустя 8 часов, 5 минут, 57 секунд (18.05.2011 - 17:28) Greg1978 написал(а):
Добавлю от себя немного 
ООП предоставляет полиморфизм и др. свойства, так же дают большой инструмент для "сокрытия" сложных алгоритмов и возможных изменений как в архитектуре так и в требованиях от заказчика, что даёт безопасно изменять код и даже алгоритмы в работе определённых функций.
Ну а теперь к инкапсуляции переменной.
Вспомним что, если проект имеет большое количество кода (десятки тысяч строк, да ещё и в разных файлах), имеет так же и глобальные переменные, которые могут неожиданно себя повести, в зависимости от их использования. Решение проблемы в этом случае будет обходится на много дороже если эти данные не инкапсулировать в одном - двух классах, где легче и быстрее найти ошибку, а так же проследить логику использования переменной даже для непосвящённого во всю архитектуру программиста.
Возьмём случай с инкапсуляцией в функциях.
Переменные будут доступны только в пространстве функции (а это уже хардкод и уменьшает гибкость логики архитектуры в разы) и если эти данные понадобятся в других не связанных функциях их нужно либо заново воспроизводить ну или же делать глобальными.
Вот и вернулись в начало
С ув. Greg1978

ООП предоставляет полиморфизм и др. свойства, так же дают большой инструмент для "сокрытия" сложных алгоритмов и возможных изменений как в архитектуре так и в требованиях от заказчика, что даёт безопасно изменять код и даже алгоритмы в работе определённых функций.
Ну а теперь к инкапсуляции переменной.
Вспомним что, если проект имеет большое количество кода (десятки тысяч строк, да ещё и в разных файлах), имеет так же и глобальные переменные, которые могут неожиданно себя повести, в зависимости от их использования. Решение проблемы в этом случае будет обходится на много дороже если эти данные не инкапсулировать в одном - двух классах, где легче и быстрее найти ошибку, а так же проследить логику использования переменной даже для непосвящённого во всю архитектуру программиста.
Возьмём случай с инкапсуляцией в функциях.
Переменные будут доступны только в пространстве функции (а это уже хардкод и уменьшает гибкость логики архитектуры в разы) и если эти данные понадобятся в других не связанных функциях их нужно либо заново воспроизводить ну или же делать глобальными.
Вот и вернулись в начало

С ув. Greg1978

Спустя 9 дней, 2 часа, 52 минуты, 14 секунд (27.05.2011 - 20:20) program90 написал(а):
Greg1978
Спасибо
Спасибо
Спустя 2 часа, 9 минут, 12 секунд (27.05.2011 - 22:29) fallow написал(а):
А мне нравится private, public, как то структурированно всё, создается некая иерархия в классах. В которых всё красиво описанно, что можно внешне брать, что нельзя.
Инкапсуляция - это как в капсуле. Т.е к примеру есть класс Car там есть куча методов, и свойств как приватных, так и публичных. Например чтобы завести машину, нужно у обьекта вызвать какой то метод. Но для работы этого метода в классе например можно создать ещё приватные методы, например: Подать электросигнал,отдать топливо, и т.п. Может при других ситуациях не надо полностью заводить машину а просто включить дворники. Тогда в паблик методе вызывать приватный метод - подать электросигнал (ведь нельзя из обьекта просто подать электросигнал), и т.д. Анологично и свойства. И всё это хозяйство инкапсулировано. А дальше создаешь хоть завод по сборке автомобилей.
Берёшь и аккуратненько складываешь классы в свою супер библиотеку. Так и собираешь свой автомобиль
Для этого они и создавались, наверно)
Инкапсуляция - это как в капсуле. Т.е к примеру есть класс Car там есть куча методов, и свойств как приватных, так и публичных. Например чтобы завести машину, нужно у обьекта вызвать какой то метод. Но для работы этого метода в классе например можно создать ещё приватные методы, например: Подать электросигнал,отдать топливо, и т.п. Может при других ситуациях не надо полностью заводить машину а просто включить дворники. Тогда в паблик методе вызывать приватный метод - подать электросигнал (ведь нельзя из обьекта просто подать электросигнал), и т.д. Анологично и свойства. И всё это хозяйство инкапсулировано. А дальше создаешь хоть завод по сборке автомобилей.
Берёшь и аккуратненько складываешь классы в свою супер библиотеку. Так и собираешь свой автомобиль

Для этого они и создавались, наверно)
Спустя 22 дня, 15 часов, 29 минут, 34 секунды (20.06.2011 - 13:59) program90 написал(а):
fallow
Спасибо!
Спасибо!
Спустя 4 дня, 11 часов, 11 минут, 50 секунд (25.06.2011 - 01:11) Greg1978 написал(а):
Цитата (fallow @ 27.05.2011 - 19:29) |
А мне нравится private, public, как то структурированно всё, создается некая иерархия в классах. В которых всё красиво описанно, что можно внешне брать, что нельзя. Инкапсуляция - это как в капсуле. Т.е к примеру есть класс Car там есть куча методов, и свойств как приватных, так и публичных. Например чтобы завести машину, нужно у обьекта вызвать какой то метод. Но для работы этого метода в классе например можно создать ещё приватные методы, например: Подать электросигнал,отдать топливо, и т.п. Может при других ситуациях не надо полностью заводить машину а просто включить дворники. Тогда в паблик методе вызывать приватный метод - подать электросигнал (ведь нельзя из обьекта просто подать электросигнал), и т.д. Анологично и свойства. И всё это хозяйство инкапсулировано. А дальше создаешь хоть завод по сборке автомобилей. Берёшь и аккуратненько складываешь классы в свою супер библиотеку. Так и собираешь свой автомобиль ![]() Для этого они и создавались, наверно) |
А исчё круче это в типизированных языках выявляется типа C++ и т.д.

Спустя 3 дня, 22 часа, 31 минута, 43 секунды (28.06.2011 - 23:42) program90 написал(а):
Спасибо
Спустя 10 часов, 41 минута, 42 секунды (29.06.2011 - 10:24) twin написал(а):
Цитата | ||
twin, я с вами категорически не согласен, и даже принимаю слова Цитата
как личное оскорбление, и оскорбление в сторону очень многих программистов. |
Тут разницы нет, как ты это воспринимаешь. Суть от этого не меняется. Если знать, что есть суть защиты от дурака.
Спустя 6 дней, 22 часа, 36 минут (6.07.2011 - 09:00) ExpJ написал(а):
Синглтонами лучше много не пользуйтесь - это аналог глобальной переменной, а глобальные переменные - это как всем известно - зло.
Спустя 2 минуты, 33 секунды (6.07.2011 - 09:03) bulgakov написал(а):
Синглтон аналог глобальной переменной???
Спустя 13 минут, 48 секунд (6.07.2011 - 09:17) linker написал(а):
ExpJ
Чтобы подобную фигню больше не писать нужно разобраться в обоих вопросах. А то услышали звон, да не знаете где он.
Чтобы подобную фигню больше не писать нужно разобраться в обоих вопросах. А то услышали звон, да не знаете где он.
Спустя 11 часов, 54 минуты, 39 секунд (6.07.2011 - 21:11) ExpJ написал(а):
Цитата (bulgakov @ 6.07.2011 - 06:03) |
Синглтон аналог глобальной переменной??? |
Все правильно я написал, естественно сам по себе он не является глобальной переменной. А вот более удачным объектно ориентированным аналогом глобальной переменной его назвать вполне можно в том плане, что он один.
Вот даже совет написал http://expertjournal.ru/advice/view/id/36
Спустя 2 минуты, 26 секунд ExpJ написал(а):
Цитата (linker @ 6.07.2011 - 06:17) |
ExpJ Чтобы подобную фигню больше не писать нужно разобраться в обоих вопросах. А то услышали звон, да не знаете где он. |
Ну почему же фигню? Что же вы так сразу резко ...
Спустя 10 минут, 38 секунд (6.07.2011 - 21:22) Winston написал(а):
Цитата (ExpJ @ 6.07.2011 - 21:11) |
Ну почему же фигню? Что же вы так сразу резко ... |
А вы что хотите чтобы все мягко было и в шоколаде ?
Этот человек не будет писать, что либо, для набивания постов.
Так что к его словам можно (нужно) прислушаться
Спустя 7 часов, 27 минут, 30 секунд (7.07.2011 - 04:49) twin написал(а):
ExpJ по сути то прав. Дело в том, что ООП в своей идее опирается на локализацию функционала. А не всегда это выгодно и интересно. И вот, вместо того, чтобы пользоваться обычным глобальным пространством, и был придуман этот костыль - синглетон. Потому как общим пространством пользоваться вера не позволяет.
А опасность синглетона очевидна. Допустим в академическом примере с классом подключения к БД мы не можем закрыть соединение в деструкторе и вынуждены держать его открытым до завершения работы скрипта полностью. Иначе теряется его смысл. Если мы будем уничтожать объект синглетона, он перестанет быть таковым. А если сделаем отдельный метод (не деструктор) для закрытия, то не сможем открыть его вновь. Собственно за что боролись - на то и напоролись.
Ровно так же, как и с обычной функцией в глобальном пространстве. Закрыв соединение в одной части скрипта, придется открывать его вновь, если то потребуется.
Мало того, отследить состояние свойства объекта синглетон несколько сложнее, чем состояние переменной в глобальном пространстве. Поясню.
Если используются глобальные переменные, их можно обозначить. Допустим писать в верхнем регистре (что я обычно и делаю).
Когда в тексте программы встречаются такие переменные, сразу понятно - где то они используются с конструкцией global и изменять их не след. Только для чтения. А свойство объекта синглетон обозначить так нельзя, ибо они все такие.
Так что не все то золото, что блестит.
А опасность синглетона очевидна. Допустим в академическом примере с классом подключения к БД мы не можем закрыть соединение в деструкторе и вынуждены держать его открытым до завершения работы скрипта полностью. Иначе теряется его смысл. Если мы будем уничтожать объект синглетона, он перестанет быть таковым. А если сделаем отдельный метод (не деструктор) для закрытия, то не сможем открыть его вновь. Собственно за что боролись - на то и напоролись.
Ровно так же, как и с обычной функцией в глобальном пространстве. Закрыв соединение в одной части скрипта, придется открывать его вновь, если то потребуется.
Мало того, отследить состояние свойства объекта синглетон несколько сложнее, чем состояние переменной в глобальном пространстве. Поясню.
Если используются глобальные переменные, их можно обозначить. Допустим писать в верхнем регистре (что я обычно и делаю).
$CONFIG = array( 'password' => '12345',
.........
Когда в тексте программы встречаются такие переменные, сразу понятно - где то они используются с конструкцией global и изменять их не след. Только для чтения. А свойство объекта синглетон обозначить так нельзя, ибо они все такие.
Так что не все то золото, что блестит.
Спустя 4 дня, 5 часов, 9 минут, 48 секунд (11.07.2011 - 09:59) linker написал(а):
Вся проблема в том, что глобальные переменные - они супер глобальные. Их может изменять, удалять, создавать кто угодно, когда угодно и где угодно. В результате появляется неразбериха и тот самое чувство отвращения к глобальным данным. Суть синглтона в том, чтобы никто, нигде и никогда не смог подменить значение этой "глобальной" сущности. А теперь twin под раздачу попадёт:
class DBКак можешь заметить, закрытие соединения происходит в деструкторе оригинального объекта, а следовательно при любом первом попавшемся DB::getInstance() соединение вновь будет открыто и плевать в каком месте приложения был вызван DB::destroy(), мы всегда получаем нужный нам объект со всеми нужными соединениями.
{
private static $_instance = null;
private $link = null;
private function __construct()
{
$this->link = mysql_connect(...);
}
private function __clone() {}
public function __destruct()
{
mysql_close($this->link);
}
public static function getInstance()
{
return self::$_instance instanceof self ? self::$_instance : self::$_instance = new self();
}
public static function destroy()
{
self::$_instance = null;
}
}
$o = DB::getInstance();
unset($o); // Так убивается только ссылка, а не оригинальный объект
DB::destory(); // А вот так убиваем синглтон
DB::getInstance(); // А так опять создаём и получаем его