Всього залишено коментарів: 10

Тарлан
Травень 7, 2011 о 14:22

Пізнавально, матиму на увазі цей підхід в майбутньому. Я, як почав читати, подумав, що одинокий клас – це вбудований функціонал AS3 і намагався пробити Singleton і getInstance() в мануалі :-)
>> return _instance; // Якщо екземпляр класу вже існує, повертаємо посилання на цей екземпляр
Ну він, типу, в цьому місці полюбому існує.. Коментар трохи збиває з пантелику.
Як на мене, то про статичні і динамічні класи можна було б зробити окрему статтю з прикладами їх використання. Особисто я не до кінця розумію, коли використовувати статичні змінні і функції. От наприклад, у Вашому класі _instance і _allowInstance статичні. Це мабуть через те, що клас TurtleSounds містить свій власний екземпляр? Тоді в статті варто зробити на цьому акцент, це досить важливий момент для початківців.

Ярослав Федорак
Травень 7, 2011 о 14:43

Тарлан, дякую за коментар та доповнення.
Статичні класи і статичні змінні – це все-таки трішки різні поняття. В сінглтоні змінні _instance _allowInstance статичні саме тому, що доступ до них повинен бути глобальним.

Сенс статичного класу полягає в тому, що він не може мати екземплярів, а його методи та змінні доступні для будь-яких інших класів у проекті. Такий підхід теж можна використати при створенні глобальної системи управління звуками, але він вважається не надто хорошим стилем, оскільки не відповідає принципам ООП і може ускладнити розуміння програми.

Дякую за ідею щодо окермої статті про статичні і динамічні класи. Взяв на озброєння. Постараюся написати про це в майбутньому.

Тарлан
Травень 7, 2011 о 16:50

А навіщо потрібна змінна _allowInstance? Можна ж просто перевірити, чи об’єкт не нуль, як тут:
http://www.how-to-code.com/as3-actionscript3/as3-design-patterns/as3-singleton-class.html

Ярослав Федорак
Травень 7, 2011 о 17:08

Змінна гарантує, що створити екземпляр можна тільки через getInstance. А спроба створити через new буде завжди видавати помилку.

Якщо перевіряти, чи об’єкт не нуль – то по ідеї перший раз змінна створюватиметься не залежно від того, чи використовується getInstance чи ключове слово new.

Хоча підходів до реалізації сінглтона може бути кілька. Так що перевірка через null також має право на життя.

Взагалі, у програмуванні майже завжди є більше, ніж один спосіб досягнути того чи іншого результату. :)

Oleg
Травень 7, 2011 о 23:45

також було б добре для полів _instance і _allowInstance зробити тип доступу private.

Ярослав Федорак
Травень 7, 2011 о 23:49

Змінна _instance передається іншим класам. Вона не може бути private

Oleg
Травень 8, 2011 о 00:00

Якщо так, то краще зробити доступ до неї через get.

Василь
Травень 21, 2011 о 22:51

Змінна _instance передається іншим класам. Вона не може бути private

Вона може бути private і передаватися одночасно іншим класам через метод getInstance(). Просто якщо вона буде private то ззовні класу ти не візьмеш доступу до неї напряму, а якщо в класі є метод getInstance(), то він якраз і видає назовні той екземпляр сінглтона.
Взагаліто в сінглтоні _instance і _allowInstance мають бути private, бо вони використовуються тільки всередині класу і не мають бути доступні напряму ззовні.

Ярослав Федорак
Травень 22, 2011 о 09:31

Переглянув ще раз структуру класу, схоже, що ти правий. Потрібно буде потестувати.

Sumbit
Травень 11, 2013 о 19:40

Ярослав, дякую за такий корисний клас! Давно шукав спосіб, як можна зробити кнопку вмикання і вимикання звуку.

Поділіться своєю думкою