Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Dukobpa3

Оценить эту запись

Поговорим о паттернах.

Запись от Dukobpa3 размещена 09.11.2013 в 04:02
Обновил(-а) Dukobpa3 15.11.2013 в 04:35

Вводная статейка. Скорее как заголовок.
Смотивировать создать ветку не удалось. Посему могу инкапсулировать идеологические холиворы в своем блоге.
Начинаю цикл статей по паттернам.

Вводная:

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

Итак.
Один из основных принципов фен-шуй в ООП - Один класс, одна задача, один уровень абстракции.
В случае с синглтоном мы на один класс возлагаем две задачи: Выполнение его собственннно предназначения функционального + контроль кол-ва экземпляров в системе (абстракция на уровень выше, задача другого уровня).
Соответственно косяк.

В случае со статик манагерами, которые я тоже уважаю, ситуация другая, хотя результат практически тот же.
У нас есть сущность которая контролирует кол-во и уникальность инстансов в своем пуле. А инстанс сам себе инстанс. Делает свое дело.

Я и раньше предпочитал какой-то внешний манагер классическому синглтону. Но как-то внятно объяснить почему так - не мог. Теперь вот всё стало на свои места.

UPD:
Нашел вот такое вот на хабре.
Писалось не оченнь крутым чуваком потому неточности есть, но в общем и целом как вводная покатит.
Всего комментариев 24

Комментарии

Старый 09.11.2013 13:38 expl вне форума
expl
Цитата:
В случае с синглтоном мы на один класс возлагаем две задачи: Выполнение его собственннно предназначения функционального + контроль кол-ва экземпляров в системе (абстракция на уровень выше, задача другого уровня).
Предоставление глобальной точки доступа настолько основная причина использования синглтона, что вы её даже не задумываясь обозвали "предназначением функциональным" - всем и так понятно

Но вообще да, если нужна глобальная точка доступа, то совсем не обязательно:
- ограничивать количество экземпляров (вдруг для какой подсистемы другой экземпляр потребуется)
- хранить её в статическом поле самого этого класса
- создавать экземпляр лениво (это может создать проблемы, когда нужен более тонкий контроль за порядком инициализации - лучше на старте проинициализировать глобальные сервисы в нужном порядке и присвоить их статическим полям, раз не хотите "протаскивать ссылки")
Старый 09.11.2013 17:02 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Цитата:
(это может создать проблемы,
это если вы не отдаете отчет тому что делаете.
Старый 09.11.2013 17:21 expl вне форума
expl
Ясен пень, что есть ситуации, в которых удобнее создавать экземпляр лениво
Но нафига так делать в ситуациях, когда это только затрудняет тебе жизнь?
Потому что это уже будет не паттерн Синглтон, а надо использовать паттерны? - Вот что удивляет.
Вы так говорите, как буд-то я тут телегу против ленивой инициализации гоню.
Старый 09.11.2013 17:53 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
@expl, я ни в коем разе не хотел вам что-то плохое сказать, чес слово.
Ленивая инициализация и синглтон не совсем одно и тоже, и смысл у этого разный.

А еще, если разговор про то что, кто-то может делать плохо(стрельбой в свои ноги, голову и т.п.) и не юзабельно... да пусть делает, признает что не прав - исправится, нет - так нет, не место ему в программировании.
Старый 09.11.2013 19:55 expl вне форума
expl
Цитата:
@expl, я ни в коем разе не хотел вам что-то плохое сказать, чес слово.
Тут скорее было "как так, мой тезис опрокинули без оснований, надо ответить", ок, буду выражаться более безличностно.
Цитата:
Ленивая инициализация и синглтон не совсем одно и тоже, и смысл у этого разный.
Разный, да, про то и речь.
Цитата:
А еще, если разговор про то что, кто-то может делать плохо(стрельбой в свои ноги, голову и т.п.) и не юзабельно... да пусть делает, признает что не прав - исправится, нет - так нет, не место ему в программировании.
Скорее про то, что если кто-то делает одну плохую вещь, то не обязательно делать вторую, только по тому что они описаны в одной главе GoF
Старый 09.11.2013 20:05 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Цитата:
Тут скорее было "как так, мой тезис опрокинули без оснований, надо ответить", ок, буду выражаться более безличностно.
Не надо придумывать тут было и есть так: я Вас не знаю лично, я не хотел оспорить или задеть Вас.
(но если это было не мне, а Дюку, то я умываю руки, и хотел бы извиниться за сообщение)

Цитата:
Скорее про то, что если кто-то делает одну плохую вещь,
ну так это проблемы этого человека, и не более... ну или я не понял развертку Вашей мысли.
Старый 09.11.2013 21:25 expl вне форума
expl
Цитата:
Не надо придумывать тут было и есть так: я Вас не знаю лично, я не хотел оспорить или задеть Вас. (но если это было не мне, а Дюку, то я умываю руки, и хотел бы извиниться за сообщение)
Предлагаю закрыть тему

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

Эту тему тоже предлагаю закрыть, или продолжить с конкретными примерами.
Старый 14.11.2013 05:58 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Простите пропустил начало беседы.

Цитата:
Сообщение от expl
Предоставление глобальной точки доступа настолько основная причина использования синглтона, что вы её даже не задумываясь обозвали "предназначением функциональным"
Основная причина использования синглтона это: ОДИН экземпляр на всю систему. Потому он собственно так и называется. Про глобальный доступ тут ни слова, синглтон вполне может быть приватом, интерналом или какой другой хренью.
Важно так же понимать, что это таки экземпляр, со своими свойствами и прочими прелестями полноценного инстанса. Иначе мы бы сделали статик класс, вынесли в него пачку статик функций и ок.

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

Собственно функционал этого экземпляра я и назвал основным предназначением. Это свое предназначение он может выполнять и в роли обычного класса, даже не синглтона.
Старый 14.11.2013 21:22 expl вне форума
expl
Цитата:
Простите пропустил начало беседы.
А там была малосодержательная беседа про то, что если кто-то использует синглтон или использует его не по назначению - проблемы ли это человека или паттерна.
Цитата:
Основная причина использования синглтона это: ОДИН экземпляр на всю систему
Цитата:
И контроль своего кол-ва - это нифига не основное в синглтоне, основное в нем как раз то, что этот экземпляр умеет делать
Из википедии:
Цитата:
Цель
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа
Т.е. по википедии функции:
- гарантия единственности экземпляра
- глобальная точка доступа
По вашему мнению:
- гарантия единственности экземпляра
- собственный функционал класса

Все равно, ни моя, ни ваша точка зрения не противоречат ни тексту из википедии, ни друг другу.

Когда уже о каком-нибудь Посетителе будет топик? А то такое чувство, что кроме этого паттерна/антипаттерна других во флеше не применяется.
Ах да, MVC еще. А всё остальное - не наше, не flasher-овское
Обновил(-а) expl 14.11.2013 в 21:32
Старый 14.11.2013 21:38 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
В скором времени будет медиатор, стратегия.
Так же будет пост об использовании статиков и инстансов там где это надо (в драфте лежит сейчас).
Заказы принимаю. О том что использовал готов писать и обсуждать. Чего не использовал не гарантирую, но ради такого дела мог бы разобраться.
Старый 14.11.2013 21:39 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Медиатор, кстати если комьюнити не против я мог бы скопипастить из одной темы недавней. Там вроде всё подробно было разжевано, я бы инкапсулировал всё в бложеке без излишнего дополнительного креатива.
Старый 14.11.2013 21:50 expl вне форума
expl
GoF-овский медиатор - незаслуженно забытый, нечасто, но используемый, простой как палка, паттерн, этакая перевернутая версия подписки на события общего объекта без подписки и событий - написать стоит.

Стратегия - тоже простой, но часто используемый паттерн, тоже смысл написать есть

Про статики и инштансы... Чую опять тут околосинглтоновые темы пойдут

Мне лично было бы интересно послушать про использование Визитора. Именно про использование на практике, просто интрересно где это действительно работает.
Но если вы его не применяли - то писать об этом нет ни какого смысла - паттерн ооочень спорный,
очень редко применяемый в as3 и имеет альтернативы, которые в 95% случаев лучше и в основном они неосознанно и применяются.

Еще имеет смысл написать про Состояние - часто встречался код, в котором им пренебрегали - это такой лес ифоф >_<. Вобщем про него стоит знать чтобы в тех случаях этот лес не городить.
Хотя он очень на стратегию похож - лучше довеском загнать в статью про стратегию.
Старый 14.11.2013 22:15 dimarik вне форума
dimarik
 
Аватар для dimarik
expl, я бы дополнил твою мысль. Никто здесь не умеет ООП.
Старый 14.11.2013 22:19 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Ну так значит надо нести разумное доброе вечное в массы.
Старый 15.11.2013 02:59 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Цитата:
Еще имеет смысл написать про Состояние - часто встречался код, в котором им пренебрегали - это такой лес ифоф >_<. Вобщем про него стоит знать чтобы в тех случаях этот лес не городить.
Хотя он очень на стратегию похож - лучше довеском загнать в статью про стратегию.
Конечный автомат со стратегией как-то не получается спутать. Разные абсолютно вещи.
Но стейт-машину планировал тоже расписать, это да.

Почитал про посетителя. Не использовал, так что не знаю что писать, но заинтересовало, загуглю, может че-то придумаю в качестве примера.
Старый 15.11.2013 03:07 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Еще почитал про визитор.
Это часом не оно? Но все примеры что нагуглил - на плюсах. Там перегрузка методов, потому калька по описанию не работает, а некий аналог есть.
Автор творения не я, если че
Старый 15.11.2013 03:38 expl вне форума
expl
Цитата:
Это часом не оно
Нет, это не оно, там идет кастование типов, а визитор придуман чтобы этого не делать.
Старый 15.11.2013 03:39 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Ну во флеше перегрузки методов нету, так что вообще никак, по техническим причинам соответственно
Старый 15.11.2013 17:30 expl вне форума
expl
Перегрузка методов здесь совершенно не мешает
http://www.youtube.com/watch?v=KSEyIXnknoY

Просто сложно найти ситуацию, в которой этот паттерн аправдан.
(там ещё всё упирается в налаживание взаимодействия между реализатором IVisitor и классом в котором он используется, в Java с этим по проще благодаря анонимным и внутренним классам - в том же Eclipse его активно используют).
А в as3 это выливается в кучу кода по передаче параметров в реализатор IVisitor(еще сам по себе паттерн не лаконичный ни разу).
Да и в Java едва ли посетитель - лучшее решение для большинства ситуаций.

Правда то что делают вместо, а именно цепочка ифов "if (value is X)... else if (value is Y) else if (...", тоже создаёт кучу проблем при правках и рефакторинге.
Но если в базовом классе наделать методов AsX, AsY, As... и сравнивать их - получается вполне поддерживаемо. А по объемам кода и запутанности это в разы лучше Визитора. Хотя и не даёт его жёсткой проверки на этапе компиляции.
Старый 15.11.2013 17:35 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Цитата:
цепочка ифов "if (value is X)... else if (value is Y) else if (..."
А я не то же самое скинул?
Старый 15.11.2013 17:38 expl вне форума
expl
Угу, это то что делают вместо визитора, но никак не визитор
В визиторе это бы выглядело так:
Код AS3:
...
object:IAcceptor = ...
var visitor:IVisitor = new ConcreteVisitor(param0, param1, param3...);
object.accept(visitor)// Это вместо if (object is X) else if (...
var a = visitor.a;
...
// А это то, что было написано внутри функции:
public class Visitor implements IVisitor
{
    public function Visitor(param0:...
    ...
    public visitX(object:X):void
    {
         // тот код, который был внутри ветки if (object is X), только здесь уже не надо приведений
    }
    ...
    public visitY(object:Y):void
    {
         // тот код, который был внутри ветки if (object is Y)
    }
}
А в каждый конкретный класс надо ещё влепить:
Код AS3:
pulbic class X implements IAcceptor
{
    public accept(IVisitor visitor):void
    {
        visitor.visitX(this);
    }
}
И всё это ради:
- статической проверки реализации обработки для каждого подтипа (т.е. компилятор ткнёт пальцем куда надо добавить обработчик для нового подтипа или убрать, если подтип удалили)
- скорости исполнения (но это либо только для С++, либо когда число if-ов перевалило за десяток - ибо в as3 вызов функции дорогой)
Обновил(-а) expl 15.11.2013 в 17:51
Старый 15.11.2013 18:16 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Ну и в чем его профит для ас3?
Для этих задач проце прикрутить либо какую-то ентити-систем, либо делегировать это поведение в какой-то внешний статик обработчик, либо реализовать какой-то манагер. Короче тут куча вариантов есть. А визитор привлекает разве что своей спорностью и неоднозначностью. Нагугленные мною примеры для плюсов бонус несомненно дают (и то, только на этапе компиляции, который в плюсах состоит из нескольких этапов, один из которых "линковка", на которой мы, собственно и экономим). По производительности спорно. Управление кодом - хз. Иметь в одном месте список дестроев с какой-то точки зрения удобно конечно, но далеко не всегда.

Так что хз. Не зря примеры на плюсах, всё-таки плюсы хоть и начало начал во многом, но далеко не во всем пример для подражания.
Старый 15.11.2013 18:23 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Coming soon:
State (состояние)
State-machine (Стейт-машина, конечный автомат) (стейт-машина в сложных вариантах реализации может пользоваться паттерном стейт. В самых простых вариантах вполне самостоятельный паттерн, реализуемый в 20 строк кода)
Старый 15.11.2013 19:13 expl вне форума
expl
Цитата:
Ну и в чем его профит для ас3?
Я ж говорю, спорный паттерн
Цитата:
А визитор привлекает разве что своей спорностью и неоднозначностью
Этим тоже
Ну ещё статической проверкой - кроме как через двойную диспетчеризацию(коею имеем в визиторе) она не реализуется,
но какой ценой...
 

 


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


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