Форум 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=209259)

Wormhole 24.10.2014 20:39

Цитата:

Сообщение от Gerbert (Сообщение 1174052)
elder_Nosferatu, в одном маленьком-маленьком городе,
живет один человечек, который носит трусы поверх брюк. И вот этот человечек встречает Вас
и спрашивает - "а почему ты не носишь трусы по верх брюк? Ответы, что это не правильно, не по дрескоду,
и прочие, я слушать НЕ ХОЧУ!".

Вот что Вы этому нехочухе ответите?

При чем тут это? То, что предложил элдер, не мешает коду, наоборот, делает его быстрее и лаконичнее.

Почему писать код в кадрах - это неправильно. Просто почему. Мне интересно знать, так как писать в кадрах я привык и это для меня кажется удобным. На крайняк могу сделать парочку простых классов.

Gerbert 24.10.2014 21:16

Цитата:

При чем тут это?
При том, что есть правило ооп, которое гласит, что обращаться к свойству можно только через аксессор.
Можно и без, но это не ооп. Но я запомню Ваше пожелания и буду показывать так, как неправильно,
но быстрее.
Цитата:

Почему писать код в кадрах - это неправильно. Просто почему.
Я посоветовал, но дело Ваше. Как хотите так и делайте, я не собираюсь Вам что-то доказывать, мне безразлична Ваша судьба и предпочтения.

nubideus 25.10.2014 02:10

Цитата:

Почему писать код в кадрах - это неправильно. Просто почему. Мне интересно знать, так как писать в кадрах я привык и это для меня кажется удобным.
я тебе честно скажу, все что ты сейчас делаешь, пока учишься программировать, пойдет в мусорку. и не потому что "код - испражнения, все переписать", а потому что вещи элементарные. то есть разницы особой нет, тебе главное мозг качать.
выучить ооп - в крайнем случае полгода, учиться программировать в целом - несколько лет.

Цитата:

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

elder_Nosferatu 25.10.2014 10:54

Цитата:

Сообщение от Gerbert (Сообщение 1174054)
При том, что есть правило ооп, которое гласит, что обращаться к свойству можно только через аксессор.

Ну раз так, то как Вы оправдаете это:
Код AS3:

private var _keyboardFlags: Object = {};
...
... _keyboardFlags.LEFT ...
... _keyboardFlags.RIGHT ...
... _keyboardFlags.STOP ...
...

Мало того, что свойства LEFT, RIGHT и STOP экземпляра класса Object ничем не прикрыты, так Вы еще и ссылку на этот экзепляр передаете наружу ПРАВОСЛАВНЫМ ГЕТ-АКСЕССОРОМ...
Если уж так приспичило ООПрограммировать, то делайте все правильно.
Пример 1: Геттер возвращает копию _keyboardFlags, тем самым не даем возможности изменить извне значения флагов. [Encapsulation completed ;)]
Код AS3:

public class KeyBoardController {
        private var _keyboardFlags:Object = {};
        public function get keyboardFlags( ):Object {
                var hash:Object = {};
                for (var key:String in _keyboardFlags) {
                        hash[ key ] = _keyboardFlags[ key ];
                }
                return hash;
        }
}

Пример 2: Возвращаем значение флага по его имени (без прямого доступа к незащищенному хранилищу флагов - _keyboardFlags). [Encapsulation completed ;)]
Код AS3:

public class KeyBoardController {
        private var _keyboardFlags:Object = {};
        public function getKeyboardFlagByName( name:String ):Object {
                return _keyboardFlags[ name ];
        }
}

Пример 3: То же, что и Пример 2, но доступ по имени заменяем на геттеры отдельных флагов. [Encapsulation completed ;)]
Код AS3:

public class KeyBoardController {
        private var _keyboardFlags:Object = {};
        public function get flagLEFT( ):Object {
                return _keyboardFlags[ "LEFT" ];
        }
        public function get flagRIGHT( ):Object {
                return _keyboardFlags[ "RIGHT" ];
        }
        public function get flagSTOP( ):Object {
                return _keyboardFlags[ "STOP" ];
        }
}

Пример 4: То же, что и пример 3, но хранилище флагов заменяем на соответствующие нужным флагам свойства. [Encapsulation completed ;)]
Код AS3:

public class KeyBoardController {
        private var _flagLEFT:Object;
        private var _flagRIGHT:Object;
        private var _flagSTOP:Object;
        public function get flagLEFT( ):Object {
                return _flagLEFT;
        }
        public function get flagRIGHT( ):Object {
                return _flagRIGHT;
        }
        public function get flagSTOP( ):Object {
                return _flagSTOP;
        }
}

ЗЫ: Если Вы охарактеризовали мой прежний пост, как ношение нижнего белья поверх брюк, то либо ничерта не поняли, либо огрызаетесь праведным идеологическим гневом вместо тог, чтобы аргументировано отстоять свою позицию. Я не предлагаю вам делать ничего противоестественного. Более того, я предлагаю не делать ничего неуместного. Приведу свою аналогию. Вы выставляете на показ яйцо Фаберже. Вы знаете, что посмотреть на него прийдут всякие сомнительные личности и пытаетесь защитить свое богатство охранной системой. Но вместо того, чтобы накрыть яйцо стеклянной витриной с сигнализацией, Вы подсоединяете напряжение к подставке для яйца. Я Вам говорю, что такой подход не страхует Вас от кражы яйца, а Вы мне заявляете, что нельзя же без охранной системы.:confused:

Gerbert 25.10.2014 13:47

Сорри, я не понял с первого раза о чем Вы.
Да Вы правы! Getter на _keyboardFlags в данной ситуации действительно не нужен.

И я даже больше скажу, своё мнение я пытался обосновать мыслями, которые феерически, как фейверк, промчались
по моему мозгу и точно так же растворились в потоке информации полученной из гугла. И после этого наступило
настоящие просветление в отношении set-get. Спасибо! До этого я не в полной картине понимал и аксессоры и даже типы
и даже само проектирование.

Добавлено через 30 минут
Но вот небольшой вопрос - SimpleButton от adobe имеет
Код AS3:

public function get upState():DisplayObject
public function set upState(value:DisplayObject):void

и для себя я объяснил это так - передаю Shape и SimpleButton не может изменить нарисованное,
так DO это не позволит. Но! Ведь я могу взять у кнопки этот стайт и поменять его координаты, ширину или даже
перерисовать прикастовав его к Shape, это ведь тоже не защищает объект. И если следовать этому пути,
то на DO вообще нельзя делать set-get... Что Вы по этому поводу можете сказать?

elder_Nosferatu 25.10.2014 15:04

Во первых, кнопке (экземпляру SimpleButton) плевать чем Вы ее напичкаете, главное, чтобы это были экранные объекты. А будут они прямоугольные, красные, большие или даже пустые внутри - дело Ваше.
Во вторых, как кнопка сможет сходу поменять разместить в себе Ваш апСтейт-объект, если бы у нее было просто публичное свойство upState без аксессоров? Можно, конечно прикрутить ей некий публичный метод refresh() и дергать его самостоятельно, после изменения значения одного из состояний, но зачем тогда аксессоры? Короче, предположу, что:
Код AS3:

private var _upState:DisplayObject;
public function get upState():DisplayObject {
        return _upState;
}
public function set upState(value:DisplayObject):void {
        if (_upState) {
                // remove old state
        }
        _upState = value;
        if (_upState) {
                // place new state
        }
}


Gerbert 25.10.2014 15:14

То есть, Вы считаете adobe таким примитивным, что у них состояния в сеттере меняются?)

Повторю вопрос в догонку - по Вашему мнению на DO вообще не нужно делать аксессоры,
если конечно, что-то да не меняется, как в примере выше?

Добавлено через 1 минуту
И не подумайте, что я пытаюсь придраться, я уточняю, так как Вы обосновали свое мнение
и я вижу в нем долю истины.

elder_Nosferatu 25.10.2014 17:48

Цитата:

Сообщение от Gerbert (Сообщение 1174091)
То есть, Вы считаете adobe таким примитивным, что у них состояния в сеттере меняются?)

Если установка нового значения должна сопровождаться изменением состояния, то сеттер как раз и берет на себя эту функцию. И не важно будет это сделано непосредственно в сеттере или он просто вызовет специальный метод, который отвечает за применение нового состояния или даже новое состояние сохранится в промежуточном свойстве, а из сеттера отправится запрос инвалидатции.
Например кнопка находится в состоянии "UP" и Вы заганяете новое значение для upState. Вы считаете adobe таким примитивным, что на enterFrame-обработчике висит проверка "а не изменилось ли какое нибудь состояние"? По моему им хватило ума из сеттера инициировать замену. А как она производится мне уже не так интересно. В своем же примере я показал только общую идею, а не конкретную реализацию.

Цитата:

Сообщение от Gerbert (Сообщение 1174091)
Повторю вопрос в догонку - по Вашему мнению на DO вообще не нужно делать аксессоры,
если конечно, что-то да не меняется, как в примере выше?

Нет никакой разници какого типа значение должно хранить свойство. Необходимость в защите свойства через методы-аксессоры определяется архитектурой. В большинстве случаев есть смысл использовать аксессоры, но только потому, что в этом же большинстве случаев установка нового значения должна вызвать ответную реакцию. А если я вижу такое:
Код AS3:

private var _param:int;
public function get param():int { return _param; }
public function set param(value:int):void { _param = value; }

то это уже бред... Спросим у Википедии на счет инкапсуляции:
Цитата:

Сообщение от Википедия
Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя.

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

Цитата:

Сообщение от Gerbert (Сообщение 1174091)
И не подумайте, что я пытаюсь придраться, я уточняю, так как Вы обосновали свое мнение и я вижу в нем долю истины.

Ну что Вы, придирайтесь на здоровье! Но только если по существу. Ато плодотворная дискуссия (в которлй между прочим может родится истина :) ) превратится в банальный срач.

Gerbert 25.10.2014 18:18

Думал, что можно ответить, но пришел к обычному - Спасибо!


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

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