Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   ООП - защита классов,функций и переменных.. не понимаю =( (http://www.flasher.ru/forum/showthread.php?t=137654)

u364 19.03.2010 12:08

ООП - защита классов,функций и переменных.. не понимаю =(
 
Здравствуйте флешеры)

скорее вопрос заключается в ООП, а не в именно в AC3, но все же...
Моя беда в том, что не могу я понять зачем нужно использовать private или protected при описании чего-либо... чаще всего использую ключевое слово public и последнее время меня начало это как-то очень сильно волновать, потому что в чужом коде есть и private и protected объекты.

хелп читал:
internal (по умолчанию) Видимый для ссылок внутри того же пакета.
private - Видимый для ссылок в том же классе.
protected - Видимый для ссылок в том же классе и в производных классах.
public - Видимый для всех ссылок.

Это понятно... но для чего они защищаются? Я не могу привести такой пример, в котором необходимо пользоваться private и protected.. какая у них выгода перед public?

Еще я не могу понять зачем использовать геттеры и сеттеры, когда можно устанавливать значения напрямую обращаясь к переменной..

Просветите, если не трудно, очень хорошо бы было, если на примерах :rolleyes:.
Спасибо.

CrazyFlasher 19.03.2010 12:12

ага...а ещё лучше везде юзать класс Object
это так...шутка.

Не хочется разводить демагогий долгих (ждём wvxvw :D ). Понимание необходимости придёт с опытом + без этого нельзя, если вы работает в команде

Gaen 19.03.2010 12:27

Private и protected нужны для того, чтобы никто без вашего разрешения не смог что-то изменить в вашем объекте. Со временем для вас станет нормой объявлять все свойства private, и только некоторые, в качестве исключения - public. Тут должен быть жёсткий принцип: всё, что не разрешено - запрещено.

mickfallout 19.03.2010 12:30

К примеру у тебя есть объект рубильник:MovieClip(мувик с двумя кадрами:рычаг поднят/опущен), у него есть свойство on:Boolean. если ты свойство on просто сделаешь public, вместо специального setter-метода ты можешь забыть что для переключения рубильника нужно не только изменить свойство on, но и перейти на другой кадр.

udaaff 19.03.2010 12:31

Цитата:

Моя беда в том, что не могу я понять зачем нужно использовать private или protected при описании чего-либо... чаще всего использую ключевое слово public и последнее время меня начало это как-то очень сильно волновать, потому что в чужом коде есть и private и protected объекты.

хелп читал:
internal (по умолчанию) Видимый для ссылок внутри того же пакета.
private - Видимый для ссылок в том же классе.
protected - Видимый для ссылок в том же классе и в производных классах.
public - Видимый для всех ссылок.

Это понятно... но для чего они защищаются? Я не могу привести такой пример, в котором необходимо пользоваться private и protected.. какая у них выгода перед public?
Инкапсуляция

Цитата:

Еще я не могу понять зачем использовать геттеры и сеттеры, когда можно устанавливать значения напрямую обращаясь к переменной..
Свойство_(программирование)

Psycho Tiger 19.03.2010 12:46

Цитата:

Еще я не могу понять зачем использовать геттеры и сеттеры, когда можно устанавливать значения напрямую обращаясь к переменной..
1) Ты можешь установить только геттер, без сеттера - например, считать текущее действие, а ля "Ждём ответа от сервера" - при этом можешь себе гарантировать, что это свойство никто не сможет поменять извне.
Цитата:

но для чего они защищаются? Я не могу привести такой пример, в котором необходимо пользоваться private и protected.. какая у них выгода перед public?
Аналогия - "Зачем защищать внутренние органы кожной и жировой прослойкой". Ответ - чтобы внешние факторы не могли нарушить работу всего организма.
И в правду, если у тебя есть метод
Код AS3:

public function onWorkEnds(e:Event):void{
//remove everything
}

который должен вызываться только после того, как твой модуль отработает, причем конец работы определяет лишь сам модуль - зачем тебе "сдирать кожу", убирая защиту и ставя public? Через полгода ты забудешь, что это делает и будешь думать - о, это чтобы работу прервать резко! И будешь огорчен, когда всё пойдёт не так.

А вообще поставь себе FlashDevelop, там автокомплит прикольный - будешь писать private/public/protected ради автокомплита) Я кстати начинал так писать только из за этого, понимание пришло потом)

Котяра 19.03.2010 13:14

Геттеры/ Сеттеры очень хорошая вещь:

1: в сеттере можно вставить проверку валидности данных
Код AS3:

public function set a(value:int):void
{
if(value<100)_a = value;
else throw(new Error("Invalid value on "+this.className+".a"));
}

2: в сеттере можно можно диспатчить событие об изменении (например, для MVC)
Код AS3:

public  function set a(value:int):void
{
_a = value;
dispatchEvent(new ChangeModelEvent("a"));
}

3: в геттере/сеттере можно инициировать создание объекта если он еще не создан.
Код AS3:

public  function get a():Object
{
if (!_a) _a=new Object();
return _a;
}

4: можно создать только геттер - тогда свойство будет "только для чтения" ( правда это не работает со сложными типами, т.к. для изменений свойств объекта достаточно ссылки на объект)

5: сеттеры позволяют выполнить некую операцию, например: при изменении width на самом деле изменяем масштабирование по scaleX

6: в геттере можно возвращать вычисляемое значение:
Код AS3:

function get square():int 
{
return _width*_height;
}

7: в геттере/ сеттере можно переопределить свойства вложенного в Композицию или в Декоратор объекта

Код AS3:

function get length():int 
{
return _innerArray.length;
}

Я настолько к ним привык, что практически все свойства у меня задаются через сеттеры/геттеры

cpu 19.03.2010 13:45

На 57 странице русской версии Мука есть таблица про модификаторы управления доступом переменными. Хотя бы скачайте эту книжку, там очень доходчиво про них написано. По крайней мере я понял))).

Bgg 19.03.2010 19:45

Цитата:

свойство никто не сможет поменять извне
На самом деле такие вопросы возникают из-за того что не понятно кто этот кто? :)

CrazyFlasher 19.03.2010 19:56

так пожалуйста, юзайте public, только Object или не, лучше * и код пишите в блокноте, а потом покажите результат мега-клёвого проекта

iflamberg 19.03.2010 20:46

когда работаешь в одиночку над проектом в пару тысяч строчек ООП не дает никаких приимуществ.
Попробуйте создать проект ~500кб текста. Откройте его через пол года и попробуйте вспомнить для чего какие методы и поля созданы, которые из них используются исключительно внутри класса, а какие вызваются другими классами.
Другими словами в не низкоуровневых языках типа явы или флеша ООП, так же как и типизация переменных, служит скорее для самоконтроля, упрощения работы с вашим кодом других людей, и придупреждения компилятором самых очевидных ошибок.

CrazyFlasher 19.03.2010 22:27

Цитата:

Другими словами в не низкоуровневых языках типа явы или флеша ООП
кхм...вообще-то это высокоуровневые языки (по терминологии) ;)
однако в обиходе программистов низкоуровневые и высокоуровнениые вещи относительно языка - это всё относительно (сорри за тавтологию). Грубо говоря компонет Button это высокий уровень относительно DisplayObject.
А ваще низкий уровень - это паяльник :)

iflamberg 19.03.2010 22:29

ты частицу "не" не видишь?

CrazyFlasher 19.03.2010 22:31

сорри, пригубил слегка, слова пропускаю :D

P.S. это не оффтоп, это ответ на вопрос :) если чё плюс ему :D

iNils 19.03.2010 22:37

Цитата:

Сообщение от iflamberg (Сообщение 894280)
когда работаешь в одиночку над проектом в пару тысяч строчек ООП не дает никаких приимуществ.

Ой, как не правы. 2 тыс. строк кода (именно кода, а не комментариев и пустых строк), это проект на пару недель для одного человека. Я видел пару работ, где все эти 2 тыс строк кода были в одном файле и это был не класс. Работать с этим складом невозможно.

wvxvw 19.03.2010 22:47

Вообще, чисто с практической точки зрения - private дает возможность оптимизировать объем програмы, ну и скорость вызова немного т.как не обязательно хранить имена приватных полей класса и можно смело записывать их как UInt (но AS3 компилятор этого не делает). А так, ну как уже было сказано - организационный момент - чтобы не забыть у чего откуда ноги растут, да и если все свойства вывалить в автокомплит, от него практической пользы будет не много :)

lowka 19.03.2010 22:50

Цитата:

Сообщение от iflamberg (Сообщение 894280)
Попробуйте создать проект ~500кб текста. Откройте его через пол года и попробуйте вспомнить для чего какие методы и поля созданы, которые из них используются исключительно внутри класса, а какие вызваются другими классами.

500кб это 1мб не ОПП кода не ООП кода как минимум - почувствуйте, как говорится, разницу. Т.к. по мере разрастания проекта ООП дает возможность сократить объем кода за счет выделения повторяющихся участков в отдельные методы, а наборы методов в классы. Если не используем ООП, то есть copy & paste, можно еще правда создавать наборы функций в которых первый аргумент это объект над которым совершается действие, а последующие параметры это модификаторы этого самого действия. Только последний метод в приближении к бесконечности дает нам то самое ОПП от которого мы пытались убежать.

Цитата:

Сообщение от iflamberg (Сообщение 894280)
Другими словами в не низкоуровневых языках типа явы или флеша ООП, так же как и типизация переменных, служит скорее для самоконтроля, упрощения работы с вашим кодом других людей, и придупреждения компилятором самых очевидных ошибок.

Вот только на яве никто проекты в тысячу строчек не пишет (себе дороже). А если пишут, то эти проекты за собой тянут мегабайты библиотечного ООП кода.

iflamberg 19.03.2010 23:23

Цитата:

Сообщение от iNils (Сообщение 894301)
Ой, как не правы. 2 тыс. строк кода (именно кода, а не комментариев и пустых строк), это проект на пару недель для одного человека. Я видел пару работ, где все эти 2 тыс строк кода были в одном файле и это был не класс. Работать с этим складом невозможно.

Просто мы все обленились. Я смотрю иногда на старые сеговские игрушки и думаю о том, что какие-то ребята на асме делали потрясающие вещи без всяких там tween'ов, ооп, подсветки кода, инспекторов класса, автокомплита и прочих прелестях современного программирования.

iNils 19.03.2010 23:45

Цитата:

Сообщение от iflamberg (Сообщение 894312)
Просто мы все обленились. Я смотрю иногда на старые сеговские игрушки и думаю о том, что какие-то ребята на асме делали потрясающие вещи без всяких там tween'ов, ооп, подсветки кода, инспекторов класса, автокомплита и прочих прелестях современного программирования.

А мы в детстве играли на улице. И компьютеров у нас не было.

u364 20.03.2010 02:02

Спасибо, начинаю понимать...

до этого код писался прямо во Flash безо всякого автокомплита и прочих примочек....

сейчас скачал Flash Develop и Flex SDK + прочитал несколько тем по этому поводу...

эм... ну да, код пишется более удобно... объявляешь переменную какого-либо класса и сразу же появляется import этого класса.. кайф... правда не компилируется пока.. :) но это уже другая тема...

боюсь правда, что мозг атрофируется при использовании всех прелестей автоматизации FD..(

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

Wolsh 20.03.2010 11:32

Не атрофируется мозг)) Просто работать будет не над вспоминанием, в каком же пакете лежит этот URLLoaderDataFormat, а думать об организации проекта, что во Флэш ИДЕ мучительно трудно) Как всякий профессиональный инструмент, ФД только помогает избавиться от ненужной рутины и заняться творчеством)))


Часовой пояс GMT +4, время: 00:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.