[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопрос про инкапсуляцию
program90
Зачем нужно защищать от кого-то данные, и инкапсулировать их. Кому может быть нужно использовать те переменные которые не нужно использовать. И что может дать это тому кто их будет использовать. И почему он не может начать использовать на свое усмотрение?



Спустя 9 минут, 36 секунд (17.05.2011 - 13:19) linker написал(а):
Почитай про петтерн синглтон - самый банальный и простой пример.

Спустя 14 минут, 17 секунд (17.05.2011 - 13:33) Krevedko написал(а):
угу. вот тут понятно описан этот паттерн
http://www.irbis-team.com/15/23/1

Спустя 41 минута, 56 секунд (17.05.2011 - 14:15) program90 написал(а):
А зачем нужно прятать как private статический член экземлпяра класса? Т.е. есть функция с помощью которой дается доступ к экземпляру класса, а зачем его скрывать с помощью private инкапсуляции? Просто те кто его используют наверняка знаю что нужно получать доступ через a::getInstance().
Или здесь имеется ввиду что инкапсуляция это как бы доступ к переменной через функцию, т.е. это инкапсуляция не в смысле применения private?

Спустя 6 минут, 38 секунд (17.05.2011 - 14:22) linker написал(а):
program90
Получить да, а вот изменить не смогут. В это суть этого паттерна.

Спустя 2 минуты, 32 секунды (17.05.2011 - 14:24) twin написал(а):
Тормоза придумали трусы biggrin.gif
Инкапсуляцию тоже. Да никогда не остановит меня свойство private от того, чтобы не посмотреть изменить класс к лучшему.
Это по идее защита от дурака.

Спустя 31 минута, 56 секунд (17.05.2011 - 14:56) Arni написал(а):
Цитата (twin @ 17.05.2011 - 11:24)
Тормоза придумали трусы biggrin.gif
Инкапсуляцию тоже. Да никогда не остановит меня свойство 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
Опрометчиво разрушать фундамент здания, если рухнет - по голове начальство не погладит.

Спустя 18 минут, 41 секунда (17.05.2011 - 15:53) Arni написал(а):
Цитата (program90 @ 17.05.2011 - 12:27)
Arni
Цитата
Если автор задал этот вопрос, значит я даю 100% гарантию что он не писал систем которые состоят не менее чем с 2000 строк.

может и писал, почему нет...

Ну так вот и отвечайте, писали систему более чем 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 экономится память

Спустя 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 написал(а):
Добавлю от себя немного smile.gif
ООП предоставляет полиморфизм и др. свойства, так же дают большой инструмент для "сокрытия" сложных алгоритмов и возможных изменений как в архитектуре так и в требованиях от заказчика, что даёт безопасно изменять код и даже алгоритмы в работе определённых функций.
Ну а теперь к инкапсуляции переменной.
Вспомним что, если проект имеет большое количество кода (десятки тысяч строк, да ещё и в разных файлах), имеет так же и глобальные переменные, которые могут неожиданно себя повести, в зависимости от их использования. Решение проблемы в этом случае будет обходится на много дороже если эти данные не инкапсулировать в одном - двух классах, где легче и быстрее найти ошибку, а так же проследить логику использования переменной даже для непосвящённого во всю архитектуру программиста.
Возьмём случай с инкапсуляцией в функциях.
Переменные будут доступны только в пространстве функции (а это уже хардкод и уменьшает гибкость логики архитектуры в разы) и если эти данные понадобятся в других не связанных функциях их нужно либо заново воспроизводить ну или же делать глобальными.
Вот и вернулись в начало smile.gif
С ув. Greg1978 smile.gif

Спустя 9 дней, 2 часа, 52 минуты, 14 секунд (27.05.2011 - 20:20) program90 написал(а):
Greg1978
Спасибо

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

Спустя 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 там есть куча методов, и свойств как приватных, так и публичных. Например чтобы завести машину, нужно у обьекта вызвать какой то метод. Но для работы этого метода в классе например можно создать ещё приватные методы, например: Подать электросигнал,отдать топливо, и т.п. Может при других ситуациях не надо полностью заводить машину а просто включить дворники. Тогда в паблик методе вызывать приватный метод - подать электросигнал (ведь нельзя из обьекта просто подать электросигнал), и т.д. Анологично и свойства. И всё это хозяйство инкапсулировано. А дальше создаешь хоть завод по сборке автомобилей.
Берёшь и аккуратненько складываешь классы в свою супер библиотеку. Так и собираешь свой автомобиль biggrin.gif
Для этого они и создавались, наверно)

А исчё круче это в типизированных языках выявляется типа C++ и т.д. smile.gif

Спустя 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 по сути то прав. Дело в том, что ООП в своей идее опирается на локализацию функционала. А не всегда это выгодно и интересно. И вот, вместо того, чтобы пользоваться обычным глобальным пространством, и был придуман этот костыль - синглетон. Потому как общим пространством пользоваться вера не позволяет.

А опасность синглетона очевидна. Допустим в академическом примере с классом подключения к БД мы не можем закрыть соединение в деструкторе и вынуждены держать его открытым до завершения работы скрипта полностью. Иначе теряется его смысл. Если мы будем уничтожать объект синглетона, он перестанет быть таковым. А если сделаем отдельный метод (не деструктор) для закрытия, то не сможем открыть его вновь. Собственно за что боролись - на то и напоролись.

Ровно так же, как и с обычной функцией в глобальном пространстве. Закрыв соединение в одной части скрипта, придется открывать его вновь, если то потребуется.

Мало того, отследить состояние свойства объекта синглетон несколько сложнее, чем состояние переменной в глобальном пространстве. Поясню.

Если используются глобальные переменные, их можно обозначить. Допустим писать в верхнем регистре (что я обычно и делаю).
$CONFIG = array( 'password' => '12345',
.........

Когда в тексте программы встречаются такие переменные, сразу понятно - где то они используются с конструкцией global и изменять их не след. Только для чтения. А свойство объекта синглетон обозначить так нельзя, ибо они все такие.

Так что не все то золото, что блестит.




Спустя 4 дня, 5 часов, 9 минут, 48 секунд (11.07.2011 - 09:59) linker написал(а):
Вся проблема в том, что глобальные переменные - они супер глобальные. Их может изменять, удалять, создавать кто угодно, когда угодно и где угодно. В результате появляется неразбериха и тот самое чувство отвращения к глобальным данным. Суть синглтона в том, чтобы никто, нигде и никогда не смог подменить значение этой "глобальной" сущности. А теперь twin под раздачу попадёт:
class DB
{
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(); // А так опять создаём и получаем его
Как можешь заметить, закрытие соединения происходит в деструкторе оригинального объекта, а следовательно при любом первом попавшемся DB::getInstance() соединение вновь будет открыто и плевать в каком месте приложения был вызван DB::destroy(), мы всегда получаем нужный нам объект со всеми нужными соединениями.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.