Pull to refresh

Что такое полиморфизм на самом деле. В PHP он тоже существует.

PHP *
Написать этот пост побудила недавняя статья о полиморфизме. Она вызвала много споров, но знающие люди понимают, что автор написал скорее о наследовании и о переопределении методов, чем о полиморфизме. Не буду говорить ни хорошее ни плохое о той статье, а просто расскажу, что такое полиморфизм на самом деле. Дабы начинающие php-программисты не остались в заблуждении.
Читать дальше →
Total votes 136: ↑117.5 and ↓18.5 +99
Views 83K
Comments 82

Наследование шаблонов в Smarty

PHP *
Когда-то, давным-давно, мне пришлось использовать небезызвестный шаблонизатор Smarty. Сначала я, понятное дело, возмущался и кричал, какая же гадость эта заливная рыба Smarty, а потом «распробовал» и втянулся. Те удобства, которые он давал, с лихвой компенсировали мысли о том, что есть и более быстрые шаблонные движки.

Шаблоны я обычно строил с помощью инклюдов: в начале подключался header.tpl, в конце — footer.tpl, в середине ещё что-нибудь нужное. В целом разметка получалась довольно аккуратной, но не проходило ощущение, что не хватает чего-то важного. Окончательно понимание этого чего-то появилось, когда мне случилось написать простенькое приложение на Django. И это «что-то», как все поняли, оказалось наследованием шаблонов. Простая, как и всё гениальное, идея позволяла существенно упростить шаблоны и избавиться от дублирующих блоков.

А почему бы не реализовать подобный механизм в Smarty?
Total votes 65: ↑52.5 and ↓12.5 +40
Views 11K
Comments 54

Классы в Javascript: вызов методов родительского класса

JavaScript *
JavaScript — очень динамический язык, в нём заложена возможность менять язык под себя и создавать удобные инструменты для дальнейшей работы. «Реализация классического наследования» — как раз один из таких инструментов. В данный момент я не представляю себе, как я программировал бы на JS без «классов».

Для меня «Классы» — это, скорее, подход к проектированию и реализации поставленной задачи. В нашем новом проекте такой подход используется по полной программе (и, я думаю, что он оправдывает себя на все 100%).
Читать дальше →
Total votes 23: ↑20 and ↓3 +17
Views 16K
Comments 94

JsOOP

Website development *
В статье речь пойдет об имитации классического ООП и строгой типизации в JavaScript (< 2.0).

Я расскажу про JsOOP – мини-фреймворк для написания JavaScript-кода в объектно-ориентированном стиле.

Читать дальше →
Total votes 40: ↑31 and ↓9 +22
Views 677
Comments 145

Работа с объектами в JavaScript: теория и практика

JavaScript *
В этой статье я хочу по возможности полно и последовательно рассказать о том, что такое объект в JavaScript, каковы его возможности, какие взаимоотношения могут строиться между объектами и какие способы «родного» наследования из этого вытекают, как это все влияет на производительность и что вообще со всем этим делать :)

В статье НЕ будет ни слова про: эмуляцию традиционной класс-объектной парадигмы, синтаксический сахар, обертки и фреймворки.

Сложность материала будет нарастать от начала к концу статьи, так что для профи первые части могут показаться скучными и банальными, но дальше будет намного интереснее :)

если не боимся многабуков, то читаем дальше
Total votes 104: ↑103 and ↓1 +102
Views 202K
Comments 216

Применение наследования в шаблонах Mason

Perl *
Mason — достаточно известный и распространенный фреймворк для разработки Perl-приложений. Несмотря на простой синтаксис, он обладает достаточно широкими возможностями и высокой производительностью; имеет встроенные средства для интеграции с mod_perl и memcached. Освоить работу с mason очень просто — система хорошо документирована. В то же время, есть ряд интересных тонкостей, до которых документацию дочитывают не все. Возможно, именно поэтому код, который мне доводилось видеть, до боли напоминал неудачную поделку на PHP, в которой для упрощения жизни разработчик не использовал ничего сложнее разбивки на инклюдники. Можно ли на масоне писать лучше? По-моему, да.
Попробуем?
Total votes 17: ↑14 and ↓3 +11
Views 2K
Comments 9

Наследование конфигов в Zend_Config

Zend Framework *
Для тех, кому лень читать длинное предисловие: перемотайте до последней части «Простая идея, которая пришла мне в голову».
Я хотел поставить якорь, но хабрапарсер не разрешает :(

Zend_Config и секции


Официальная документация Zend Framework советует разделить конфигурационный файл на несколько секций, каждая из которых будет отвечать за разную среду, в которой должен работать проект.
При этом, одна секция конфига может наследовать другую, переопределяя только те параметры, которые должны быть изменены.

На первый взгляд, такая идея кажется разумной, но я столкнулся с некоторыми ограничениями этого подхода…
Читать дальше →
Total votes 28: ↑23 and ↓5 +18
Views 1.6K
Comments 21

Абсолютная загадка наследования в Java

Java *
Translation
Почему эта загадка абсолютная? По двум причинам:
• Она касается основ языка Java, а не какого-то малоизвестного нюанса API.
• Она расплавила мой мозг, когда я на нее наткнулся.
Если вы хотите проверить себя перед дальнейшим чтением, пройдите этот тест.
Читать дальше →
Total votes 56: ↑47 and ↓9 +38
Views 28K
Comments 46

Memento mori, %username%!

Lumber room
В старой песенке поётся:
После нас на этом свете
Пара факсов остаётся
И страничка в интернете…
(Виталий Калашников, bards.ru)

Сегодня мы поговорим о такой невесёлой стороне человеческого бытия, как уход человека из жизни. Само по себе трагичное, это событие порождает массу правовых последствий: от прекращения действия разного рода обязательств до передачи прав собственности на имущество, которым покойный обладал при жизни, его законным наследникам.

Казалось бы, вопросы наследования настолько тривиальны, и всё, с ними связанное, настолько скрупулёзно регламентировано действующим законодательством, что необходимость дискуссии на тему посмертной передачи прав может показаться весьма сомнительной. Но это лишь на первый взгляд.
Читать дальше →
Total votes 8: ↑6 and ↓2 +4
Views 349
Comments 14

Попытка классификации и анализа существующих подходов к наследованию в Javascript

JavaScript *

Некоторое время назад у меня дошли руки до темы, которая давно уже меня нервирует интересует. Эта тема — наследование в JavaScript.

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

Хочу сразу сказать, что я не претендую на глубокое понимание ООП в JavaScript, и даже не претендую на глубокое понимание ООП вообще. Я буду рад, если моя попытка анализа окажется кому-нибудь полезной, но основная цель публикации, в некотором смысле, противоположная — мне бы хотелось самому воспользоваться замечаниями людей, которые лучше меня ориентируются в теме, чтобы прояснить ее для себя.
Читать дальше →
Total votes 55: ↑48 and ↓7 +41
Views 2.8K
Comments 44

Интересная работа сборщика мусора

Java *
Проблема
Явой занялся я недавно, и столкнулся с интересной проблемой связанной с динамическим переопределением методов во время исполнения. После выхода из переопределенного метода терялась ссылка на объект. Решение проблемы затянулось в связи с тем, что на одном компьютере она была, а на другом нет.
Листинг и мои мысли об источнике проблемы
Total votes 15: ↑9 and ↓6 +3
Views 2.1K
Comments 25

Иной — PHPTAL

PHP *
Для описания этого очень мощного и одновременно лаконичного шаблонизатора просто скопирую текст из мана
«PHPTAL is an implementation of the excellent Zope Page Template (ZPT) system for PHP. PHPTAL supports TAL, METAL, I18N namespaces» и «PHPTALES is the equivalent of TALES, the Template Attribute Language Expression Syntax. It defines how XML attribute values are handled»

Предлагается по LGPL лицензии тут http://phptal.org/.

Я делаю шаблоны на PHPTAL уже около года и считаю его «феерическим» :). В коде есть пара моих патчей, поэтому я знаю тему изнутри.

Далее я сделаю обзорную статью из которой вы точно поймете что я не писатель и почему всячески противился просьбам хабражителей «раскрыть тему» ну и надеюсь хоть чуть-чуть популяризирую данный шедевр.

Читать дальше →
Total votes 15: ↑10 and ↓5 +5
Views 1.6K
Comments 39

«Наследование» не от классов

Python *
image
В Питоне совсем не важно, что вы поместите в определение класса. Это могут быть строки, числа, объекты, переменные. В третьем Питоне можно даже передавать именованные аргументы.
Реализация
Total votes 49: ↑45 and ↓4 +41
Views 3.8K
Comments 33

Принцип подстановки Барбары Лисков

Programming *
Привет, хабрачеловеки!

Захотелось вот поделиться сокровенным знанием по этой теме. К тому же материалов по этому, достаточно важному принципу проектирования классов и их наследования, в Рунете как-то негусто. Имеются формулировки вида:

«Пусть q(x) является свойством верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.» © Wikipedia

Но они выносят мой мозг меня совершенно не радуют.

Если хочется услышать объяснение этой хрени умной фразы — прошу под кат.
Читать дальше →
Total votes 85: ↑75 and ↓10 +65
Views 107K
Comments 55

Новые функции в репозитории фреймворка: ORM/ActiveRecord

LiveStreet
image
Я хотел бы начать серию статей о развитии движка LiveStreet, а именно его фреймворковой части. LiveStreet получил довольно широкую популярность как блогосоциальный хабраклон, но за 2 года перерос уже в нечто значительно большее. Особенно с выходом версии 0.4.*, когда появились широкие возможности для написания плагинов с функционалом наследования и делегирования.
Достаточно большое количество крупных социальных сетей уже построено на LiveStreet с использованием этих технологий.

В связи с этим у разработчиков появляется необходимость в разработке функционала, модулей и хаков для своих проектов. Внедрение плагинов упростило этот процесс в разы. Мы продолжаем работать в этом направлении: сейчас я расскажу об альфа-версии реализации ORM-подхода на основе паттерна ActiveRecord, который мы разработали (и продолжаем разрабатывать) в LiveStreet.

Читать дальше →
Total votes 52: ↑39 and ↓13 +26
Views 2.4K
Comments 51

Что не так с наследованием? Разработка флэш-игр с использованием фреймворка PushButton Engine

Adobe Flash
Sandbox
image
Существует не так много специализированных фреймворков, ускоряющих разработку флеш игр. Из тех что на слуху, можно отметить следующие:

Flixel
FlashPunk
Citrus Engine
PushButton Engine

Этим постом я хочу обратить внимание коллег-флешеров на перспективный опенсорсный движок под названием PushButton Engine. PBE уже успели представить на Adobe Max 2010 и разработать на нем #2 Top Facebook game 2010 по версии insidefacebook.com. Его используют для разработки игр такие компании как Zynga, Playdom, Hive7.

Разработчиками движка являются достаточно известные в геймдевелоперских кругах люди, создавшие такие игры как The Incredible Machines, Tribes, Torque и другие.

Предлагается любопытный компонентный подход к разработке, который, по заверениям авторов, гораздо удобнее и продуктивнее при разработке игр чем традиционный объектно-ориентированный.
Читать дальше →
Total votes 28: ↑25 and ↓3 +22
Views 2K
Comments 30

Плагинизация классов

PHP *
Как-то медитируя на свой новый велосипед подумал, – А почему бы не заложить в него возможность «плагинизации» контроллеров?

Чтобы вот был, например, у нас некий базовый класс Generic.php:
<?php
class Generic
{
  public function Hello() {
    echo 'Hello!';
  }
}
?>


А мы такие взяли и повешали бы на него пару плагинов, которые дополнят/изменят какие-либо его методы не мешая друг-другу (по принципу «кто первый встал – того и тапки»).

Вот они красавцы:
PluginFoo.php:
<?php
class PluginFoo extends Generic_PluginFoo
{
  public function Hello() {
    echo 'Dudes?<br />';
    parent::Hello();
  }
}
?>

и PluginBar.php:
<?php
class PluginBar extends Generic_PluginBar
{
  public function Hello() {
    parent::Hello();
    echo '<br />O.o';
  }
}
?>


А потом мы создали бы объект родительского класса (не обращаясь к последнему потомку), вызвали метод Hello() и тот сказал бы нам:
Dudes?
Hello!
O.o


Ниже лаконичный вариант того как описанного поведения добился ort в своём LiveStreet, а затем уже и я в своём собственном велосипеде.
Читать дальше →
Total votes 107: ↑75 and ↓32 +43
Views 1.6K
Comments 28

Модульный подход в JavaScript

JavaScript *
Translation
Модульный подход довольно распространённая техника программирования в JavaScript. Обычно его понимают довольно хорошо, но продвинутые техники описаны недостаточно. В этой статье я рассмотрю основы и затрону некоторые сложные приёмы, включая один, по моему мнению, оригинальный.

Основы



Мы начнём с несложного обзора модульного подхода, хорошо известного с тех пор, как Эрик Миралья (Eric Miraglia) из YUI впервые об этом написал. Если вам уже знаком модульный подход, переходите сразу к «Продвинутым техникам».

Анонимные замыкания


Читать дальше →
Total votes 133: ↑121 and ↓12 +109
Views 47K
Comments 32

Паттерн Наблюдатель: списки и матрёшки из слушателей

Programming *
В этой хабрастатье на примере паттернов Наблюдатель и Компоновщик рассмотрено, как применять принципы объектно-ориентированного программирования, когда стоит использовать композицию, а когда наследование. А так же рассмотрено, какие существуют способы повторного использования кода, кроме copy-paste.

Статья достаточно простая, в ней рассматриваются очевидные вещи, но надеюсь, что она будет интересна начинающим программистам, которые пока встречались со словами из первого абзаца только на лекциях по программированию. (На самом деле эта статья и есть кусочек практического занятия по программированию.)
Читать дальше →
Total votes 21: ↑19 and ↓2 +17
Views 22K
Comments 16

Как выполнять методы предков в реализации прототипного наследования

JavaScript *
При работе с наследованием иногда возникает желание иметь функцию доступа к методу предка (методу родительского класса) — в конструкторе (аналоге класса для Javascript) или в методе-потомке, потому что, бывает, что новый класс переопределяет его. Не просто какую-нибудь функцию (метод), а с совершенно понятной записью, чтобы название говорило само за себя, и имеющую доступ к указанному поколению предков (не «пра-пра-пра-», а «пра- 3 раза»).

Возьмём за основу метод прототипного наследования, который максимально эффективен тем, что производит минимум действий при описании цепочек наследуемых классов и при этом максимально поддерживает базовые операции и свойства наследования: instanceof, constructor. Для доступа к предку он создаёт свойство .superclass.
Читать дальше →
Total votes 38: ↑27 and ↓11 +16
Views 12K
Comments 37