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

КорДум 07.11.2010 13:08

Правильная реализация эффектов для мыши
 
Давненько я не делал всякие эффекты. Тогда я еще маловато знал об as3 и усердно зачитывал Мука. Итак, с утра что-то стукнуло в голову, дай-ка, думаю, пока выходной, понаделаю шаблончиков - авось когда пригодятся. Сделалось вот такое:
Код AS3:

package  {
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.events.Event;
        import kordum.utils.MathExtend;
 
        /** @author KorDum **/
 
        public class CursorStarEffect extends Sprite {
                private var arrStar:Vector.<Shape> = new Vector.<Shape>();
                private var speedRotation:uint = 10;
                private var alphaDown:Number = .1;
 
                public function CursorStarEffect() {
                        addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        var i:uint;
                        for (i = 0; i < 15; i++) createStar();
                        this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
 
                private function onEnterFrame(e:Event):void {
                        for each (var star:Shape in arrStar) {
                                star.rotation += speedRotation + MathExtend.randomRange( -5, 5);
                                star.alpha -= alphaDown;
                                if (star.alpha <= 0) {
                                        arrStar.splice(arrStar.indexOf(star), 1);
                                        removeChild(star);
                                        createStar();
                                }
                        }
                }
 
                private function createStar():void {
                        var star:Shape = new Shape();
                        star.graphics.beginFill(0x000000);
                        star.graphics.drawRect(MathExtend.randomRange(-10, 10), MathExtend.randomRange(-10, 10), 10, 10);
                        star.x = stage.mouseX + MathExtend.randomRange(-10, 10);
                        star.y = stage.mouseY + MathExtend.randomRange(-10, 10);
                        arrStar.push(star);
                        addChild(star);
                }
        }
}

Кому лень тестировать, скажу, что это своего рода крутящиеся звездочки, образующие хвост за курсором. Вообще, можно в конструктор пихать любой графический объект, будь то звезда, квадрат или еще чего, но вариант черновой и меня больше всего интересует, правильная ли реализация, что можно поменять, изменить?

TanaTiX 07.11.2010 13:51

Да в основном по мелочи вроде...
speedRotation и alphaDown лучше сделать константами - их значения все равно не меняются.
Код AS3:

var i:uint;
                        for (i = 0; i < 15; i++) createStar();

есть мнение что с int-ом флеш работает быстрее, да и 15 тоже в константу, в настройки вынести, возможно еще какие-то значения.

КорДум 07.11.2010 13:57

Где-то тут на форуме видел, что константы после компиляции становятся переменными. Вообще, хотелось бы потом сделать полные настройки. То есть, в конструктор передаем Object:
Код AS3:

{
 obj:DisplayObject, // объект, из которого будет состоять хвост
 alphaStep:Number,
 count:uint, // сколько будет таких фигнюшек в хвосте
 ...
}

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

Psycho Tiger 07.11.2010 15:54

Код AS3:

function func(a:int=5,s:String="hello"):void

Цитата:

хочешь задавать параметр - задавай, не хочешь - не задавай, будут использоваться дефолтные значения.

КорДум 07.11.2010 16:09

Порядок важен, Тигер. А все случаи не предусмотришь. Нужно мне в твоем коде вместо hello написать hell. И придется перед этим писать все другие параметры тоже, переписывая их дефолтные значения.
А с обджектом хоть местами меняй, хоть какое значение задавай. Я свой фреймворк сейчас на обджекты перевожу - удобно, на мой взгляд.

Psycho Tiger 07.11.2010 16:17

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

КорДум 07.11.2010 16:26

Цитата:

Обджекты - ущерб автокомплиту
Единственный их минус. Хотя, еще к минусам можно отнести отсутствие типизации элементов.
Цитата:

Как яркий пример - твинеры.
Именно по такому подобию я и делаю, вот, смотри пример:
Код AS3:

public function BgSimple(properties:Object = null) {
        if (properties) {
                if (properties.x !== undefined) $x = properties.x;
                if (properties.y !== undefined) $y = properties.y;
                if (properties.width !== undefined) $width = properties.width;
                if (properties.height !== undefined) $height = properties.height;
                if (properties.color !== undefined) $color = properties.color;
                if (properties.alpha !== undefined) $alpha = properties.alpha;
                if (properties.border !== undefined) $border = properties.border;
                if (properties.borderColor !== undefined) $borderColor = properties.borderColor;
                if (properties.borderAlpha !== undefined) $borderAlpha = properties.borderAlpha;
        }
        this.addEventListener(Event.ADDED_TO_STAGE, ifAdd);
}

Я еще немного не определился со стилями у переменных, но знаком $ стараюсь отмечать приватные переменные.
Так вот, здесь нужно только заглянуть в класс, где заботливой рукой я указал все возможные параметры, в коструктор передавать объект с этими параметрами. Ты же это и имел в виду? Больше ни для чего обджекты я не использую из-за той же типизации и того же автокомплита.

TanaTiX 07.11.2010 16:29

КорДум, а зачем такая колбаса, если можно передать готовый, уже настроенный DisplayObject?

КорДум 07.11.2010 16:34

TanaTiX, в смысле? Класс в примере с обджектом - это создание прямоугольного фона нужной ширины/высоты/прозрачности/итд. Если не указываешь обджект в конструкторе - берутся дефолтные значения, уже заданные в классе.

TanaTiX 07.11.2010 16:45

Зачем его создавать в том классе? Проще передать готовый. И вся надобность в Object-ах отпадет. Передали DisplayObject, пересохранили ссылку на объект и делаем что хотим. Если нет DisplayObject-а в параметре - тогда создаем некую форму, определенную по умолчанию, но ей не нужно передавать хренову тучу значений, т.к. все параметры определены внутри класса. Или имеется в виду определить все параметры внутри функции на тот случай, если DisplayObject отсутствует, чтоб не плодить лишние свойства, и их передать параметром для функции, которая запустится опять же только в том случае, если не определен DisplayObject? Но даже в таком случае, т.к. это закрытая функция, нет ИМХО особой надобности создавать Object.

Или я что-то не так понял?

КорДум 07.11.2010 16:52

TanaTiX, либо вы не поняли меня, либо я вас. По какому принципу работают твинеры?
Код AS3:

TweenLite.to(mc, 5, {alpha:.4, width:60} );

Вот как пример. Мы передаем Что_будем_изменять, Время и обджект с параметрами. Можно указать ширину, а можно высоту. А можно и высоту, и ширину, и альфу и чего там только нельзя. Вот по такому же принципу и я свое сделал. По умолчанию в классе определены приватные переменные с какими-то значениями. Можно не передавать обджект, тогда создастся экземпляр класса с этими дефолтными параметрами. Но можно передать, скажем, {x: 100} - и все, дефолтное значение меняется на это и координата по иксу уже другая.
Вот полный код, надеюсь, меня не покарают за такие большие листинги:
Код AS3:

package kordum.components {
        import flash.display.Sprite;
        import flash.events.Event;
 
        /** @author KorDum
          * @param x, y : int
          * @param width, height : uint
          * @param color : uint
          * @param alpha : Number [0, 1]
          * @param border : uint (0 - border 1px)
          * @param borderColor : uint
          * @param borderAlpha : Number [0, 1]
          * @version 1.1 **/

 
        public class BgSimple extends Sprite {
                private var $x:int = 0;
                private var $y:int = 0;
                private var $width:uint = 550;
                private var $height:uint = 400;
                private var $color:uint = 0xFFFFFF;
                private var $alpha:Number = 1.0;
                private var $border:uint;
                private var $borderColor:uint = 0x000000;
                private var $borderAlpha:Number = 1.0;
 
                public function BgSimple(properties:Object = null) {
                        if (properties) {
                                if (properties.x !== undefined) $x = properties.x;
                                if (properties.y !== undefined) $y = properties.y;
                                if (properties.width !== undefined) $width = properties.width;
                                if (properties.height !== undefined) $height = properties.height;
                                if (properties.color !== undefined) $color = properties.color;
                                if (properties.alpha !== undefined) $alpha = properties.alpha;
                                if (properties.border !== undefined) $border = properties.border;
                                if (properties.borderColor !== undefined) $borderColor = properties.borderColor;
                                if (properties.borderAlpha !== undefined) $borderAlpha = properties.borderAlpha;
                        }
                        this.addEventListener(Event.ADDED_TO_STAGE, ifAdd);
                }
 
                private function ifAdd(e:Event):void {
                        this.removeEventListener(Event.ADDED_TO_STAGE, ifAdd);
                        this.graphics.lineStyle($border, $borderColor, $borderAlpha);
                        this.graphics.beginFill($color, $alpha);
                        this.graphics.drawRect(0, 0, $width, $height);
                        this.x = $x;
                        this.y = $y;
                }
        }
 
}


Psycho Tiger 07.11.2010 16:57

Символом $ отмечаются финализированные методы по конвенции. Для приватов существует "_".

В твинерах мы не знаем что будем менять. x,y, vasya или petya.

В твоём случае было бы логичней вообще конструктор оставить пустым, а width/height и ко сделать сеттерами.

TanaTiX 07.11.2010 17:00

Я имею в виду следующее:
Вот сейчас мы хотим создавать прямоугольник, завтра круг, а послезавтра улыбающуюся девочку. И если с кругом и прямоугольником все относительно просто, то вариантов настройки девочки гораздо больше - запаримся все описывать.
Вот я и предлагаю в BgSimple передавать не Object, а DisplayObject, уже настроеный как хотим. В результате избавляемся от передачи тучи параметров и их переопределения+гибкость во внешнем отображении. Сравнение с твином ИМХО не очень удачное - там другие задачи, там все параметры у объектов уже есть, а в этом случае все создается нами.

КорДум 07.11.2010 17:02

Цитата:

В твоём случае было бы логичней вообще конструктор оставить пустым, а width/height и ко сделать сеттерами.
Ага, а потом писать кучу строчек-настроек:
Цитата:

var bg:BgSimple = new BgSimple();
bg.width = 100;
bg.height = 200;
...
Цитата:

В твинерах мы не знаем что будем менять. x,y, vasya или petya.
У меня тоже не знаем. Но удобнее же в конструктор сразу же запихать все нужное, верно? Конечно, если это статичный класс, то есть, как фон, который нам менять по рантайму не нужно.

Psycho Tiger 07.11.2010 17:04

Цитата:

Но удобнее же в конструктор сразу же запихать все нужное, верно?
Странно вот, что например нативный Sprite в конструктор вообще ничего не принимает. А ведь так хочется сразу задавать x,y,widht,height,rotation и тот дисплей обджект, куда его добавить...

КорДум 07.11.2010 17:06

TanaTiX, класс BgSimple создает только прямоугольники. Он не подразумевает создание 3Д-фона, меняющегося по времени. Все параметры по умолчанию есть. Хочешь - меняй. Не хочешь - не меняй. Или меняй только ширину-высоту. Конечно, если мы делаем, скажем, скроллбар, в него пихаем уже ДисплейОбджекты, уже настроенные визуально. В таком классе реализуется только сборка воедино, позиционирование и функционал.

Если мы будем передавать уже настроенный обджект в класс создания фона, необходимость в классе пропадет, ибо дисплей обджект уже настроен, как надо, разве нет?

Добавлено через 1 минуту
Psycho Tiger, класс фона статичный, он не требует, чтобы его в рантайме переделывали. Так зачем делать сеттеры, если можно сразу указать в конструкторе все, что нужно?

Цитата:

Странно вот, что например нативный Sprite в конструктор вообще ничего не принимает. А ведь так хочется сразу задавать x,y,widht,height,rotation и тот дисплей обджект, куда его добавить...
Напиши такой класс :D

TanaTiX 07.11.2010 17:19

Тогда я перестаю понимать связь кода в 1м сообщении и в 11м.

КорДум 07.11.2010 17:19

Чтобы не отходить от темы, переложим нашу дискуссию на эффект со звездами. Тут я уже сомневаюсь. Наверно придется сеттерами делать. Ибо вдруг я захочу через пару секунд звездочки заменить летающими девочками? А тут раз, переопределил - и все, звездочки отживают свое, на их место встают бомбардировщики ИЛ-Девочка-2. А потом бац! - я захотел ускорить их сорость или проредить их толпу. И тут сеттером я изменяю все это. Это да, тут сеттеры хороши.
Но в случае с фоном, имхо, удобнее написать
Код AS3:

addChild(new BgSimple({x:100});

и забыть про фон, не так ли?

Добавлено через 2 минуты
TanaTiX, это мы так тихонечко подошли к гибкости настройки.

iNils 07.11.2010 17:25

Цитата:

Сообщение от Psycho Tiger (Сообщение 948179)
Странно вот, что например нативный Sprite в конструктор вообще ничего не принимает. А ведь так хочется сразу задавать x,y,widht,height,rotation и тот дисплей обджект, куда его добавить...

А тоже нативный TextFormat позволяет все задать в конструкторе.

КорДум 07.11.2010 17:33

Так, еще, логика эффекта не была совсем правильной. Сейчас подобраны такие параметры, что все смотрится очень даже плавно. Но стоит только сменить шаг прозрачности на меньший - хвост создается вспышками, как бы облаками. Сделал по таймеру создание кусочка хвоста.
Хочется при создании каждой звездочки определять начальные значения скорости и шага поворота. Как это лучше сделать? Конечно, можно создать класс одной звезды, определить у нее публичные свойства. Но как-то не хочется создавать еще один класс.

Psycho Tiger 07.11.2010 17:45

Цитата:

Сообщение от iNils (Сообщение 948188)
А тоже нативный TextFormat позволяет все задать в конструкторе.

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

К тому же, ни один параметр не является обязательным - как раз случай Кордума. И если думать что г-да Адоубовцы пользовались каким-то другим образом мышления, отличного от моего - то один фиг не Object в конструкторе.

КорДум 07.11.2010 17:57

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

Psycho Tiger 07.11.2010 18:10

Я бы самое важное вынес в конструктор. Конструктор бы дёргал сеттеры. Опциональное - оставил только на сеттерах.

Тут смотри как тебе удобнее. Однозначно против хэшей в таких случаях я из за того что мне нужно помнить, как же зовутся параметры (спорно - подсказки к коду, но не всегда удобно искать глазами, как я назвал метод - destruct, destroy, clear или clean, по автокомплиту искать проще), не ошибиться при их вводе (а опечатка эта может проявится не сразу - не факт, что код выполнится, а значит, не факт что опечатка всплывет), не ошибится с их типом (принимаю только интовые, а захотел половину - и не могу понять, в чем дело - не вижу тип).

iNils 07.11.2010 18:16

Цитата:

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

КорДум 07.11.2010 18:17

Цитата:

Я бы самое важное вынес в конструктор. Конструктор бы дёргал сеттеры
Код AS3:

public function BgSimple(border:uint) {
        this.border = border;
}
public function set border(value:uint):void {
        _border = value;
}

Типа того?

Psycho Tiger 07.11.2010 18:21

Цитата:

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

Неа, мимо. Я уже года два собираюсь прочитать хоть одну - то нет возможности, то желания (художественная не в счет). Это лично моё мнение, основанное на моём опыте.

Вообще редкий класс задаёт всё что только может в конструкторе. Если задаёт - на то есть причины.


@Кордум, ага. Часто встречаю что люди в сеттерах и в конструкторе код копипастят фактически. Сказал на всякий )

КорДум 07.11.2010 18:26

Тигер, неудобство такого подхода в том, что приходится придумывать вменяемые имена сеттерам, ибо, допустим, width уже используется. Писать, что ли
Код AS3:

public function set setWidth(value:uint)

?

Psycho Tiger 07.11.2010 18:29

Ну width можно переопределить, я очень сомневаюсь что доступ к оригинальному width DisplayObject`а нужен в подобного рода эффектах. А если нужен - делай сеттер effectWidth

iNils 07.11.2010 18:31

Цитата:

Неа, мимо. Я уже года два собираюсь прочитать хоть одну - то нет возможности, то желания (художественная не в счет). Это лично моё мнение, основанное на моём опыте.
Значит ты погряз в бюрократии сам по себе. Это еще хуже.

КорДум 07.11.2010 18:32

В таких эффектах - да. Я спрашивал на будущее. Хорошо, с передачей параметров/настройкой разобрался. Есть еще что-то, что можно в целях оптимизации/исключения быдлокодности сделать? Опираемся на код первого поста, с поправкой, что там поселился таймер создания звездочек.

Добавлено через 50 минут
Повторюсь маленько:
Хочется при создании каждой звездочки определять начальные значения скорости и шага поворота. Как это лучше сделать? Конечно, можно создать класс одной звезды, определить у нее публичные свойства. Но как-то не хочется создавать еще один класс.

Bgg 07.11.2010 19:40

Цитата:

Сообщение от Psycho Tiger (Сообщение 948199)
Ну width можно переопределить, я очень сомневаюсь что доступ к оригинальному width DisplayObject`а нужен в подобного рода эффектах. А если нужен - делай сеттер effectWidth

А что плохого в том чтобы сделать свойство просто публичным? Иногда вижу классы в которых сеттеры и геттеры пустые, т.е. просто присваивают одно значение другому - тоже по моему бюрократия чистой воды, 5 приватных свойств с префиксом "_", 5 сеттеров и 5 геттеров в итоге, вместо просто 5и публичных свойств.

КорДум 07.11.2010 19:45

Bgg, сейчас Тигер скажет, что это не трушно ;)
Я тоже не вижу смысла делать сеттер с простым переназначением переменной. Не вижу смысла - и не делаю.
Но здесь есть некоторый плюс. Скажем, у нас есть класс, внутри таймер. Нужно поменять задержку таймера. При простом свойстве нжно писать obj.timer.delay, а с геттером-сеттером можно сделать просто: obj.timerDelay

Bgg 07.11.2010 19:53

Цитата:

Сообщение от КорДум (Сообщение 948211)
Bgg, сейчас Тигер скажет, что это не трушно ;)
Я тоже не вижу смысла делать сеттер с простым переназначением переменной. Не вижу смысла - и не делаю.
Но здесь есть некоторый плюс. Скажем, у нас есть класс, внутри таймер. Нужно поменять задержку таймера. При простом свойстве нжно писать obj.timer.delay, а с геттером-сеттером можно сделать просто: obj.timerDelay

Вряд ли так скажет, скорей всего приведет пример какой нибудь, и сошлется что даже у Adobe тот же width меняется с помощью сеттера и геттера. Интересно есть ли в сеттере width класса DisplayObject какие нибудь проверки?

f.g.programmer 07.11.2010 20:09

Цитата:

Цитата:
Цитата:

Обджекты - ущерб автокомплиту
Единственный их минус. Хотя, еще к минусам можно отнести отсутствие типизации элементов.
Отсутствие типизации и определённости это пожалуй минус номер 1, а ущерб автокомплиту - 2. Такой приём кажется неудачным, особенно если повсюду в коде объекты вместо нормальных параметров.
Чтобы сделать это менее бажным, нужно как минимум добавлять везде дополнительный метод checkArguments(obj), который будет проверять валидность всех имён аргументов и их типов.

Psycho Tiger 07.11.2010 21:03

Цитата:

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

Цитата:

А что плохого в том чтобы сделать свойство просто публичным? Иногда вижу классы в которых сеттеры и геттеры пустые, т.е. просто присваивают одно значение другому - тоже по моему бюрократия чистой воды, 5 приватных свойств с префиксом "_", 5 сеттеров и 5 геттеров в итоге, вместо просто 5и публичных свойств.
Эээ.. я где то говорил что это плохо?

Цитата:

Вряд ли так скажет, скорей всего приведет пример какой нибудь, и сошлется что даже у Adobe тот же width меняется с помощью сеттера и геттера. Интересно есть ли в сеттере width класса DisplayObject какие нибудь проверки?
Наверное, объект перерисовывается после установки ему нового width. А где заставить его перерисоваться, как не в сеттере?

f.g.programmer 07.11.2010 21:55

Цитата:

Наверное, объект перерисовывается после установки ему нового width
Вряд ли, скорее всего это сделано для скрытия реализации и для предоставления возможности переопределить поведение. В родных флешевых классах вроде вообще нет публичных переменных.

iNils 08.11.2010 13:24

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

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

Mur4ik 08.11.2010 13:37

Раз пошел уже оффтоп... iNils, ты про эту забавную, но жизненную статейку?

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

iNils 08.11.2010 13:50

Типа того.

easy.proger 08.11.2010 13:55

Цитата:

Сообщение от iNils (Сообщение 948303)
Где-то и как-то читал про ступени в развитии программиста. Точно все не помню, поэтому расскажу своими словами. На первой ступени, он ничего не знает, тупо копирует чужой код не понимая смысла в его действии. На второй ступени, пытается использовать все методы сразу, чисто лишь потому, что он их знает. На третей ступени, перечитаны тонны литературы, пишутся сотни строк кода, чтобы соответствовать стандартам. На четвертой ступени, программист познает истину и начинает просто программировать.

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

Единственная здравая мысль во всем споре/флейме...


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

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