PHP → Визуализация связей внутри класса с помощью GraphViz
Прочитав книжку Р. Мартина «Чистый код», я исполнился решимостью и принялся за рефакторинг своего старого, большого и грязного проекта.
И захотелось мне посмотреть, как в одном из самых простых классов связаны между собой методы и поля. PhpCallGraph, быстро нагугленный, наладить не удалось (какие-то проблемы с xdebug), и к тому же, судя по примерам, он показывает связи во всём проекте, трассируя его, а мне нужно было исследовать один класс.
Я решил написать собственное решение, и вот что получилось.
И захотелось мне посмотреть, как в одном из самых простых классов связаны между собой методы и поля. PhpCallGraph, быстро нагугленный, наладить не удалось (какие-то проблемы с xdebug), и к тому же, судя по примерам, он показывает связи во всём проекте, трассируя его, а мне нужно было исследовать один класс.
Я решил написать собственное решение, и вот что получилось.
Проектирование и рефакторинг → Singleton (Одиночка) или статический класс?
Статья будет полезна в первую очередь разработчикам, которые теряются на собеседованиях когда слышат вопрос «Назовите основные отличия синглтона от статического класса, и когда следует использовать один, а когда другой?». И безусловно будет полезна для тех разработчиков, которые при слове «паттерн» впадают в уныние или просят прекратить выражаться :)
Для начала вспомним что такое статический класс и для чего он нужен. В любом CLI-совместимом языке используется следующая парадигма инкапсуляции глобальных переменных: глобальных перменных нет. Все члены, в том числе и статические, могут быть объявлены только в рамках какого-либо класса, а сами классы могут (но не должны) быть сгруппированы в каком-либо пространстве имен. И если раньше приходилось иммитировать поведение статического класса с помощью закрытого конструктора, то в .NET Framework 2.0 была добавлена поддержка статических классов на уровне платформы. Основное отличие статического класса от обычного, нестатического, в том, что невозможно создать экземпляр этого класса с помощью оператора new. Статические классы по сути являются некой разновидностью простанства имен — только в отличие от последних предназначены для размещения статических переменных и методов а не типов.
Что такое статический класс?
Для начала вспомним что такое статический класс и для чего он нужен. В любом CLI-совместимом языке используется следующая парадигма инкапсуляции глобальных переменных: глобальных перменных нет. Все члены, в том числе и статические, могут быть объявлены только в рамках какого-либо класса, а сами классы могут (но не должны) быть сгруппированы в каком-либо пространстве имен. И если раньше приходилось иммитировать поведение статического класса с помощью закрытого конструктора, то в .NET Framework 2.0 была добавлена поддержка статических классов на уровне платформы. Основное отличие статического класса от обычного, нестатического, в том, что невозможно создать экземпляр этого класса с помощью оператора new. Статические классы по сути являются некой разновидностью простанства имен — только в отличие от последних предназначены для размещения статических переменных и методов а не типов.
Персональные блоги → Библиотека генерации пользовательских картинок для сайта
Не так давно возникла у меня необходимость в подключении к проекту псевдослучайных пользовательских картинок (юзерпиков), настройки для которых привязываются к некоторой персональной пользовательской информации (логин, пароль, e-mail, whatever). Я знаю о существовании Gravatar и подобных проектов, но очень не хотелось обращаться к сторонним сервисам за такой мелочью, так что я стал искать нужный мне класс в Интернете.
Поиски продолжались минут 30, за которые я не нашёл ничего приемлемого, из разряда «подключил — заработало», а потому на скорую руку набросал на PHP небольшой класс, который делает то, что мне нужно и отвечает указанному выше принципу. Собственно, пока я искал нужное мне решение, обнаружилось, что в подобных поисках я не одинок, потому решил этот класс выложить в публичный доступ: мало ли, кому потребуется.
Класс называется Avatarco.
Для полноценной работы необходим PHP5 >= 5.3.0, но изменив одну строку можно заставить работать на PHP5 ниже, чем 5.3.0.
Описание работы класса и его исходный код доступны по адресу code.google.com/p/avatarco
Вот случайный пример его работы (или пройдите по ссылке и пообновляйте):

Надеюсь, пригодится не только мне.
С удовольствием выслушаю комментарии об ошибках и необходимых улучшениях/доработках.
Поиски продолжались минут 30, за которые я не нашёл ничего приемлемого, из разряда «подключил — заработало», а потому на скорую руку набросал на PHP небольшой класс, который делает то, что мне нужно и отвечает указанному выше принципу. Собственно, пока я искал нужное мне решение, обнаружилось, что в подобных поисках я не одинок, потому решил этот класс выложить в публичный доступ: мало ли, кому потребуется.
Класс называется Avatarco.
Для полноценной работы необходим PHP5 >= 5.3.0, но изменив одну строку можно заставить работать на PHP5 ниже, чем 5.3.0.
Описание работы класса и его исходный код доступны по адресу code.google.com/p/avatarco
Вот случайный пример его работы (или пройдите по ссылке и пообновляйте):
Надеюсь, пригодится не только мне.
С удовольствием выслушаю комментарии об ошибках и необходимых улучшениях/доработках.
Блог компании Paragon Software → Развертываем системы при производстве компьютеров, а также в компьютерных классах и интернет-кафе
Подготовка больших партий компьютеров связана с необходимостью обеспечить их стандартным набором программного обеспечения. При этом, в зависимости от индивидуальных запросов, типовой список может претерпевать некоторые изменения.
Очевидно, что ручное восстановление образа на каждом PC – не только утомительный и рутинный труд, но также неэффективное использование ресурсов. Для того, чтобы упростить и максимально автоматизировать этот процесс специалисты нашей компании подготовили Paragon Deployment Manager 10 (DM10).
Итак, с помощью Hard Disk Manager, входящего в состав DM10, создаем образы для «эталонных» компьютеров и размещаем их на Infrastructure сервере.

Очевидно, что ручное восстановление образа на каждом PC – не только утомительный и рутинный труд, но также неэффективное использование ресурсов. Для того, чтобы упростить и максимально автоматизировать этот процесс специалисты нашей компании подготовили Paragon Deployment Manager 10 (DM10).
Итак, с помощью Hard Disk Manager, входящего в состав DM10, создаем образы для «эталонных» компьютеров и размещаем их на Infrastructure сервере.

Программирование → Принцип подстановки Барбары Лисков
Привет, хабрачеловеки!
Захотелось вот поделиться сокровенным знанием по этой теме. К тому же материалов по этому, достаточно важному принципу проектирования классов и их наследования, в Рунете как-то негусто. Имеются формулировки вида:
«Пусть q(x) является свойством верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.» © Wikipedia
Но онивыносят мой мозг меня совершенно не радуют.
Если хочется услышать объяснение этойхрени умной фразы — прошу под кат.
Захотелось вот поделиться сокровенным знанием по этой теме. К тому же материалов по этому, достаточно важному принципу проектирования классов и их наследования, в Рунете как-то негусто. Имеются формулировки вида:
«Пусть q(x) является свойством верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.» © Wikipedia
Но они
Если хочется услышать объяснение этой
GTD → Троллинг и тролли (о том, как составлять классификацию и выделять группы)
Устав от обилия «аналитических» статей, посвященных такому социальному явлению, как троллинг, я, честно говоря, в очередной раз составил портрет среднестатистического обитателя сети и призадумался — а насколько вообще возможна классификация этого явления? Естественно, что в 99% виденных мной статей классификация никакой научностью даже не пыталась страдать в лучшем случае оставаясь на уровне «тролль закомплексованный — тролль незакомплексованный», а в худшем — на уровне «тролль хороший — тролль плохой». Естественно, что на основе такой классификации разобраться с этим явлением практически невозможно.
Кроме того, я считаю, что данная статья будет полезна всем, кто так или иначе пытается подходить к вопросу классификации с научной точки зрения. Опираясь на нее, можно составить представление о том, как следует заниматься классификацией, и она будет полезна вам даже в том случае, если вы в гробу видали всех этих троллей и нетроллей. Можете считать, что это статья на тему научной классификации явления на примере явления «троллинг».
Топик находится в блоге «учитесь работать» просто потому, что научитесь уже, блин, составлять классификации!
Кроме того, я считаю, что данная статья будет полезна всем, кто так или иначе пытается подходить к вопросу классификации с научной точки зрения. Опираясь на нее, можно составить представление о том, как следует заниматься классификацией, и она будет полезна вам даже в том случае, если вы в гробу видали всех этих троллей и нетроллей. Можете считать, что это статья на тему научной классификации явления на примере явления «троллинг».
Топик находится в блоге «учитесь работать» просто потому, что научитесь уже, блин, составлять классификации!
Персональные блоги → Проектирование ООП классов (php) — линч
Добрый день!
Хотелось бы двигаться дальше в изучении php, и в голове крутится много нужных мне классов для разработки.
Я создал для себя репозиторий, и большинство классов использую во всех своих проектов, однако ощущение, что
я совершаю ошибки в проектировании классов меня не покидает.
Наставников, которые бы использовали ООП и репозитории классов у меня нет, поэтому я прошу хабрасообщество отлинчевать два небольших класса, которые я повсеместно использую.
Первый класс — events {} http://www.pastebin.ru/304393 (Вывод сообщений для пользователя или сохранение в базе данных для администрации). Для использования необходим также класс mysqlLayer (для работы с базой данных)
Второй класс — images {} http://www.pastebin.ru/304394 (Изменение размера картинок). Для использования необходим класс events.
Я хотел бы узнать, какие ошибки в проектировании и в использовании ООП подхода на Ваш взгляд я совершил, и в целом какие Вы можете дать рекоммендации.
UPD: (какие выводы из дискуссии на текущий момент для себя сделал)
1 — Вместо кодов ошибок в цифровом виде использовать слова (вместо 1 — notFile)
2 — Использовать общепринятое название метода getInstance а не load в паттерне Singletone
3 — Использовать enum-классы вместо строковых значений в классе
Хотелось бы двигаться дальше в изучении php, и в голове крутится много нужных мне классов для разработки.
Я создал для себя репозиторий, и большинство классов использую во всех своих проектов, однако ощущение, что
я совершаю ошибки в проектировании классов меня не покидает.
Наставников, которые бы использовали ООП и репозитории классов у меня нет, поэтому я прошу хабрасообщество отлинчевать два небольших класса, которые я повсеместно использую.
Первый класс — events {} http://www.pastebin.ru/304393 (Вывод сообщений для пользователя или сохранение в базе данных для администрации). Для использования необходим также класс mysqlLayer (для работы с базой данных)
Второй класс — images {} http://www.pastebin.ru/304394 (Изменение размера картинок). Для использования необходим класс events.
Я хотел бы узнать, какие ошибки в проектировании и в использовании ООП подхода на Ваш взгляд я совершил, и в целом какие Вы можете дать рекоммендации.
UPD: (какие выводы из дискуссии на текущий момент для себя сделал)
1 — Вместо кодов ошибок в цифровом виде использовать слова (вместо 1 — notFile)
2 — Использовать общепринятое название метода getInstance а не load в паттерне Singletone
3 — Использовать enum-классы вместо строковых значений в классе
Персональные блоги → Очередной модуль для работы с MySQL
Не хватило кармы для помещения в специализированный блог. Но очень интересно обсудить.
Утомили рутинные операции при работе с БД. Решил хоть как-то исправить ситуацию. Потратил порядка получаса на просмотр существующих классов, не нашол ничего подходящего для себя. И решил, что проще будет, написать свой.
Собственно, что хотелось получить:
1. Сберечь свою память.
По работе приходится поддерживать и писать сайты на 4-5 серверных площадках, в разных странах. Постоянно меняются пароли и(реже но все же) сетевые адреса. Поэтому хотелось как-то централизовать настройки подключение и избавить себя от необходимости запоминать десятки адресов и паролей, а просто раскидать один файл по всем серверам и по мере надобности просто использовать нужный сервер БД.
2. Сберечь свое время.
Я ленивый. Меня быстро утомляют куски кода которые приходиться таскать с собой из скрипта в скрипт. Хотелось отдавать запрос и получать массив.
3. Хотелось свободы.
Многие модули которые попались мне на глаза за недолгое время поиска, пытались сами организовывать запросы.
Конечно кому-то это могло показаться удобнее, чем писать запросы самому, но зачастую приходится использовать сложные запросы и тратить время на анализ того как же надо это все написать, чтобы «умный» модуль превратил это все в корректный и оптимальный запрос.
Утомили рутинные операции при работе с БД. Решил хоть как-то исправить ситуацию. Потратил порядка получаса на просмотр существующих классов, не нашол ничего подходящего для себя. И решил, что проще будет, написать свой.
Собственно, что хотелось получить:
1. Сберечь свою память.
По работе приходится поддерживать и писать сайты на 4-5 серверных площадках, в разных странах. Постоянно меняются пароли и(реже но все же) сетевые адреса. Поэтому хотелось как-то централизовать настройки подключение и избавить себя от необходимости запоминать десятки адресов и паролей, а просто раскидать один файл по всем серверам и по мере надобности просто использовать нужный сервер БД.
2. Сберечь свое время.
Я ленивый. Меня быстро утомляют куски кода которые приходиться таскать с собой из скрипта в скрипт. Хотелось отдавать запрос и получать массив.
3. Хотелось свободы.
Многие модули которые попались мне на глаза за недолгое время поиска, пытались сами организовывать запросы.
Конечно кому-то это могло показаться удобнее, чем писать запросы самому, но зачастую приходится использовать сложные запросы и тратить время на анализ того как же надо это все написать, чтобы «умный» модуль превратил это все в корректный и оптимальный запрос.