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

mexoboy 19.02.2010 12:21

Строгая типизация данных. Как правильно писать код?
 
Здравствуйте. Так-уж вышло, что со строгой типизацией данных столкнулся только при изучении as3. Отсюда есть сомнения по правильности их использования в некоторых моментах. Приведу пример:

Код AS3:

public class MyObject {
        private var color:uint;
 
        public function MyObject(){}
 
        public function get value():*
        {
                return color;
        }
 
        public function set value(val:uint):void
        {
                color = val;
        }
}

В данном классе есть переменная color:uint - которая хранит установленный пользователем цвет. И как правильно теперь поступить, если мне необходимо проверить - устанавливался-ли пользователем цвет?
Варианты ответа :moder: :
A) Изменить тип данных color:*
B) Добавить флаг в класс empty:Boolean и делать проверку через флаг
С) Изменить типа данных color:int и пустоту использовать, как -1
D) Ваш вариант ответа.

proxiServer 19.02.2010 12:28

Думаю флаг. Вариант В.

Партизан 19.02.2010 12:51

Если цвет не ARGB то можно использовать uint.MAX_VALUE (0xffffffff)

mexoboy 19.02.2010 13:02

Цвет как раз ARGB и все значения uint заняты.

ratin 19.02.2010 13:28

А я бы Number использовал бы, и не парился.

Партизан 19.02.2010 14:03

Цитата:

Сообщение от mexoboy (Сообщение 887866)
Цвет как раз ARGB и все значения uint заняты.

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

ulik 19.02.2010 14:58

Код AS3:

public class MyObject {
        private var color:uint;
 
        public function MyObject(){}
 
        public function get value():uint
        {
                return color;
        }
 
        public function set value(val:uint):void
        {
                color = val;
                colorChanged();
        }
        private function colorChanged():void
        {
                // your logic
        }
}

* = зло

mexoboy 19.02.2010 15:48

Мне как раз не нужно выполнять никаких логик. Все что мне требуется это возвращать color либо как uint, либо как null.
Пока пришел к выводу, что этот вариант будет правильнее:
Код AS3:

public class MyObject {
        private var color:int = -1;
 
        public function MyObject(){}
 
        public function get value():*
        {
                return color === -1 ? null : color;
        }
 
        public function set value(val:uint):void
        {
                color = val;
        }
}


alexcon314 19.02.2010 16:00

А что мешает использовать нормальное дефолтное значение?
Код:

public class MyObject {
private const DEFAULT_COLOR:uint = 0;
...
public function MyObject(){
color = DEFAULT_COLOR;
}
public function get value():uint
{
    return color;
}
public function set value(val:uint):void
{
  if(val == DEFAULT_COLOR)return;// если хотите, толко это несколько нелогично
        color = val;
}
}
// снаружи
if(myobj.color == myobj.DEFAULT_COLOR){
//  ...
}

и никаких *.

mexoboy 19.02.2010 16:10

Так, по поводу private var color:int = -1; Отменяется =( uint диапозон больше, чем int.

2alexcon314
Проблема в том, что есть понятие пустота и что-то. В данном случае для color:uint = 0 в ARGB соответствует черный цвет с альфой 100%.

Партизан 19.02.2010 16:10

Цитата:

Сообщение от alexcon314 (Сообщение 887914)
А что мешает использовать нормальное дефолтное значение?

Я так понимаю мешает такое равенство 0x00000000 === 0 :)

alexcon314 19.02.2010 16:34

Причем тут пустота?
Дефолтные значения как раз и призваны, чтобы не было никаких "пустот".
Вы создаете объект с цветом по умолчанию, каким он будет, 0х000000 или 0х01ad45fe - это уж ваше дело. Если пользователь задавал цвет, отличный от дефлотного, то вы это увидите. Если важен именно сам факт изменеия, то в сеттере можно записывать предыдущие колоры в массив, к примеру, для отката, или эвент диспатчить или еще что-то.. помнится в АС была чудная фича Object.watch(), кажется..
Мне не понятно ваше стремление к пустоте :)

wvxvw 19.02.2010 16:52

Если из чисто абстрактных соображений (на практике я как-то тоже не сталкивался с необходимостью uint - null), то, можно сделать класс обертку для uint, скажем UInt и задать в нем константу (или много констант никак не трансформирующихся в uint, но тем не менее типа UInt, и потом все мат. операции проводить через myUInt.valueOf(), где:
Код AS3:

public function valueOf():Object
{
if (this === UInt.NULL) throw NullUintError;
return this._value;
}

Но, для решения практических задач я бы так не делал. Дефолтное значение - лучше.

mexoboy 19.02.2010 16:56

Цитата:

Причем тут пустота? Дефолтные значения как раз и призваны, чтобы не было никаких "пустот".
Это не дефолтное значение - это просто определение var colot:uint; Я не преследую целей устанавливать каких-то значений по умолчанию, т.к. "значения по умолчанию" наследуются от родителя. А вот самой проверки перед наследованием я не могу сделать - т.к. мне возвращается 0 - что соответствует 0x00000000 - не самому редкому в использовании цвету =)

Ну вот допустим:
Код:

<container1>
        <container2>
                <container3>
                </container3>
        </container2>
</container1>

Есть класс Контейнер. В нем есть методы установки и получения параметра color - который возвращается в uint либо как null. Хочу узнать значение в контейнере3 и если он null попросить вернуть color от родительского контейнера и так, пока родители типа Контейнер не закончатся.

alexcon314 19.02.2010 17:12

Цитата:

"значения по умолчанию" наследуются от родителя
Каламбур: "значения по умолчанию" наследуются по умолчанию от родителя по умолчанию.
Не вижу каких-то проблем. Пустоты с * в топку :). Впрочем, настаивать особо смысла тоже не вижу. Делайте как хотите.

wvxvw 19.02.2010 17:24

Ну так вам просто нужно зарегестрировать факт изменения цвета пользователем, а цвет не может быть "никаким", он как раз и должен быть в диапазоне от 0 до FFFFFFFF. T.e. в сеттере поставьте флаг который бы и оповещал о том, вывывался сеттер или нет. Но, по-моему, об этом уже было тут сказано...

Wolsh 19.02.2010 19:25

Цитата:

Есть класс Контейнер. В нем есть методы установки и получения параметра color - который возвращается в uint либо как null.
Да? Любопытно.. Параметр Вы тоже принимаете как * ?
Был ли изменен цвет - булевы данные. uint - другой тип данных. null - третий. Не надо пытаться в стандартном типе данных передать еще и другой тип. Измените свою логику. Чтобы передать цвет - uint. Чтобы передать, был ли он изменен - Boolean. И все встанет на свои места. Не пишите новый язык для своей программы. Пишите программу по законам выбранного языка.

Партизан 21.02.2010 12:44

Возмите Number...

TERRORist 21.02.2010 13:17

Цитата:

Сообщение от mexoboy (Сообщение 887916)
альфой 100%.

0% :taunt:

mikhailk 22.02.2010 23:18

Не совсем понятно, причем тут строгая типизация...

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

Да и вообще, как показывает практика, лучше отделять фиксацию факта действия пользователя от фиксации результата его действия.


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

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