т.е. имеющий только статические свойства и методы, и не имеющий конструктора.
оба этих класса абсолютно взаимозаменяемы, но работа со вторым по мне удобней. отсюда и вопрос, если объект у класса может быть всего один(синглтон), нужен ли он вообще, не проще ли реализовать то же самое через статические методы и свойства?
----- if(time()>1356048000) die();
OrmaJever
Отправлено: 13 Августа, 2011 - 21:19:23
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
не всё можно решить статическими методами. (Добавление)
например обьект это переменая которую можно передать параметром в функцию и с ним работать, а при статических методах так зделать не сможем.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
White
Отправлено: 13 Августа, 2011 - 21:46:05
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
OrmaJever пишет:
передать параметром в функцию и с ним работать
ну а статические методы класса вызывать непосредственно из функции. если речь идет про объекты разных классов, то имя класса также можно передать в параметре функции.
пока что не убедили, если можно конкретный пример.
----- if(time()>1356048000) die();
OrmaJever
Отправлено: 13 Августа, 2011 - 22:50:41
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
White ну если нравится такой подход то некто не против, конкретно в этом случае всё разницы нету, только в написании.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
White
Отправлено: 13 Августа, 2011 - 23:11:55
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
OrmaJever дело не в нравится - не нравится. я понимаю, что если такой паттерн как синглтон существует, то предназначен для упрощения реализации решения определенных задач. пока что для себя разницы между синглтоном и приведенным выше подходом не нашел (читаемость кода при втором подходе лучше) , что натолкнуло меня на мысль о неправильном использовании мною этого паттерна.
я понимаю, что где-то ввел себя в заблуждение, но не могу понять где.
----- if(time()>1356048000) die();
OrmaJever
Отправлено: 14 Августа, 2011 - 00:24:52
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
White пишет:
то предназначен для упрощения реализации решения определенных задач.
здесь получается разница не конкретно синглтона и второго подхода, а разница обьектного подхода и стачитеских методов. Посути статические свойства и методы это как раздельные переменые связывающиеся именем класа, а обьект это одно целое. Щас конкретных примеров придумать немогу, но они будут на практике.
White пишет:
пока что для себя разницы между синглтоном и приведенным выше подходом не нашел
вот правда же этим примеров нельзя описать полезность классов? Так же и с примером в первом посте, всё познаётся в большом проэкте.
White пишет:
читаемость кода при втором подходе лучше
а по мне -> красивее выгледит чем ::
ps. надо найти какой-нибудь класс в популярных cms и попробовать переделать под синглтон и статический подход, и уверяю не всё получится.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
White
Отправлено: 14 Августа, 2011 - 10:13:24
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
OrmaJever пишет:
всё познаётся в большом проэкте
в том то и дело, что я начал применять такой подход для написания небольшой cms (до этого в схожем проекте применял синглтоны), и пока не нашел разницы. если есть желание глянуть могу прикрепить исходники (проект еще далек от готовности, но уже функционирует).
по поводу читаемости:
поскольку речь идет о синглтоне, а одно из его достоинств, это то что объект может быть достигнут внутри функции, наиболее часто применяется такая конструкция:
здесь все-таки не соглашусь (и вероятно окажусь не прав ). класс ведь это та же единая сущность (достигаемая разве-что не с помощью $this-> а self:: внутри класса). все 3 основных парадигмы ооп вполне применимы к этой сущности так же как и к объекту.
пожалуй несколько примеров того что все таки не достигается обращением к классу а не к объекту:
1.динамическое объявление свойств.
2.отсутствие конструктора и деструктора (впрочем первый синглтону ни к чему, а вот второго без объявления объектов действительно не будет)
3.перегрузка (хотя с php5.3 шаги в этом напрвлении делаются).
OrmaJever пишет:
не конкретно синглтона и второго подхода
возможно я в чем то неправильно выразил свою мысль, но речь именно о случае когда мы имеем единую сущность, в противном случае здесь даже обсуждать нечего.
Теперь можно почитать комментарии и понять некоторую конкретную разницу.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
White
Отправлено: 15 Августа, 2011 - 10:11:08
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
EuGen вопрос не в том что такое синглтон, и как он отличается от описанного выше подхода.
вопрос в том, что в обоих подходах действия происходят с единой сущностью. если в случае с синглтоном это единственный экземпляр класса и его свойства и методы, то во втором случае это сам класс и его статические свойства и методы.
переформулируем немного вопрос. какого именно результата мы не сможем достичь с данным подходом, и сможем достичь с приведенным вами выше синглтоном? если не сложно конкретный пример.
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Ответ, по-моему, очевиден - в синглотне есть экземпляр класса, в стат. методах и свойствах - нет. Из этого вытекает большое количество различий при ООП кодинге. Как один из примеров - у нас есть 4 реализации хранилища (файлы, бд, мемкеш и куки, например). Все хранилища описываются 1 общим интерфейсом, всех должно быть не более, чем по 1 экземпляру. Приложение можно написать 2 способами(как минимум) :
1. передавая экземпляр класса, поддерживающего интерфейс хранилища в параметре функции
2. Как предложил выше ты - запрашивая стат методы до вызова функции
Нам потребовалось перевести хранение данных корзины из базы данных в куки (тем более, если есть необходимость выбирать хранилище в зависимости от логики) - в первом случае мы ввели в конструктор синглтона логику определения, экземпляр какого класса нужно отдавать и хранить (синглтон стал фабрикой) - на этом все изменения закончились, в случае же если мы пользовались стат методами и свойствами - нам нужно найти все места в коде с вызовами типа DbEngine::... и заменить на CookieEngine::... в лучшем случае (когда нужно просто заменить хранилище) и ломать голову, куда поместить эту логику выбора хранилища в случае, если нужно хранить и в бд и в куках.
Это один, самый очевидный пример. Когда что-то делаешь - нужно понимать, что и зачем ты делаешь, какие задачи в будущем можешь встретить. (Добавление)
передавая экземпляры классов как параметры функций, уменьшается взаимосвязь компонент между собой. Например есть 2 библиотеки - одна отвечает за сохранение информации в файл, вторая отвечает за просмотр кук и сохранение какой-то строки в файл, если кука равна 10, например (вполне встречаемый кейс для аналитиков). Вот вторую либу можно сделать зависимой от первой (внутри библиотеки жестко вызывать методы первой либы или создавать экземпляр - не важно), а можно сделать независимой (принимать в качестве параметра экземпляр первой либы и с помощью этого экземпляра сохранять данные). Думаю, не стоит объяснять, что второй метод облегчит тебе жизнь, в случае, если меняются алгоритмы сохранения или в случае, если первая либа стала платной и заказчик удалил ее с сервера.
Есть инверсия зависимостей, dependency injection - много умных слов, касающихся зависимостей классов и методов их связывания между собой ... читай, учись и все будет понятнее и понятнее
White
Отправлено: 15 Августа, 2011 - 13:43:53
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
Stierus пишет:
синглтон стал фабрикой
т.е. насколько я понял некий синглтон-строитель. это пожалуй имеет смысл, сам задумывался над такой реализацией, и невозможностью ее применения во втором случае.
Stierus пишет:
DbEngine::... и заменить на CookieEngine::
если игнорировать инкапсуляцию, пожалуй да, но если спроектировать класс предоставляя скажем методы read() и write() и предоставить им выбор интерфейса хранилища, пожалуй нет.
со вторым примером понятно.
Спасибо, немного прояснилась ситуация.
----- if(time()>1356048000) die();
Stierus
Отправлено: 17 Августа, 2011 - 18:25:38
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Про какую инкапсуляцию ты говоришь в статических классах?
White
Отправлено: 17 Августа, 2011 - 19:11:38
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
ясн
OrmaJever
Отправлено: 18 Августа, 2011 - 11:16:20
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Статическими методами можно зделать тоже многое, но тут всётаки разница в том что в синглтоне есть обьект. Ну вот например мы пишем плагин для некой cms, у cms есть функция X которая выводит информацию о плагине в админку и принимает в качестве параметра обьект со свойствами version, description и т.д. И этой функции както наплевать где вы возьмёте этот обьект, один ли он или их пять.
Это чисто пример который может быть, синглтон не нужен везьде и всегда, но иногда будет тот один случай когда он пригодится.
ps. если писать свой код то его можно зделать под любой стиль, а в комерческих проэктах приходится подстраиватся под других
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.