7
апреля
2008
Рубрики: Ruby, Разработка, Языки
Конечно, классы в Ruby открыты для расширения. Но порядок интерпретации влияет на результат. Пример:
class A
end
class B < A
end
class B
def m
end
end
Так работает. Но если поменять местами два последних определения, то возникает сообщение об ошибке: superclass mismatch for class B (TypeError), поскольку указать базовый класс можно только при первоначальном определении класса.
Вообще, возможность добавления методов в существующий класс заставляет переосмыслить роль механизма наследования. На первый взгляд, в Ruby с открытыми определениями классов, динамической типизацией и duck typing наследование не требуется!
Программисты, “думающие” на C++/Java часто используют наследование не по назначению. Обсуждая с коллегой вопрос “зачем нужно наследование?” я наткнулся на быстрый ответ: для переиспользования кода. В этом и есть корень зла — при отсутствии нормальных механизмов повторного использования кода в этом качестве начинают использовать наследование. Но в Ruby-то такие механизмы есть. Так зачем наследование?
Похоже, что в Ruby и подобных языках наследование вернулось к своему первоначальному назначению — выразить намерение программиста, что один тип является подтипом другого. Кстати, если вспомнить принцип подстановки Лисков (Liskov substitution principle), то становится понятно, что подтип (subtype) тесно связан с подстановкой (substitution).
Вывод: используйте наследование в первую очередь как способ описания используемой модели, проектного решения. А уж потом реализуйте в классах требуемые методы.
25
марта
2008
Рубрики: Ruby, Проблемы, Разработка, Языки
Продолжаю погружаться в мир Ruby. Для систематического рассказа пока не время, но путевых заметок уже накопилось, пора записывать для памяти.
Далее »
13
января
2008
Рубрики: Ruby, Разработка, Языки
Новогодние каникулы оказались подходящим случаем для общего знакомства с Ruby. Особой склонности к языкам с динамической типизацией я не испытываю — применимость их в больших проектах весьма сомнительна. В Ruby же привлекли возможности метапрограммирования и их использование для реализации DSL (Domain Specific Languages). Кроме того, хотелось понять, что позволяет преодолеть недостатки динамической типизации при использовании Ruby в достаточно больших проектах.
Далее »
23
октября
2007
Рубрики: Java, Linux
Убил несколько часов на разбирательство с простым на первый взгляд кодом:
String command = "bash -c 'ls > ls.txt'";
Process p = Runtime.getRuntime().exec( command, null, null );
С cygwin всё работает как надо: создается файл ls.txt с результатами работы ls.
Зато под Linux происходит странное:
>: -c: line 0: unexpected EOF while looking for matching `''
>: -c: line 1: syntax error: unexpected end of file
Полный откомпилированный пример здесь. Можете запустить командой 'java ExecRedirect' на своей системе.
Ну что, рассказать решение или сами подумаете?
Далее »
29
июля
2007
Рубрики: TreeDL

Эпиграф: не потому, что других идей нет, а потому, что эта - любимая. (с) забыл чей
На прошлой неделе выпустил новую версию TreeDL 2.3.2. Предыдущую версию за 16 месяцев скачали ну от силы 250 раз. За два дня после выхода этой по статистике SourceForge было скачано 120 файлов, причем новую версию скачали меньше 20 раз. Проект выскочил в Top500.
При этом сообщений о выходе новой версии нигде не было. Анонс в список рассылки я отправил уже после этого ажиотажа, да и подписчиков там 4 человека всего. На вебе никаких новых ссылок на проект, вроде, не появилось. Интересно, откуда взялась такая активность? Есть предположение, что это какой-то робот ходит, но я о таких не слышал.
TreeDL - это мой проект, который появился для облегчения работы над основными проектами по разработке трансляторов.
Далее »
25
июля
2007
Рубрики: C
Мой коллега Александр Сортов поделился маленькой задачкой для C программистов:
Попробуйте без компьютера сообразить, сколько слов “before” и “after” будет напечатано после выполнения этого кода?
#include <stdio.h>
int main() {
int pid;
printf("before");
pid = fork();
printf("\nafter");
if(pid == 0) {
_exit();
}
printf("\n");
}
Далее »
3
июля
2007
Рубрики: Java, Разработка
В коллекцию забавных происшествий при отладке программ добавилось ещё одно.
Далее »
21
июня
2007
Рубрики: Perl, Windows, Проблемы
Теперь я знаю, что неработоспособность ppm в perl-MSWin32-x64 - это не баг, а фича:
http://community.activestate.com/forum-topic/ppm4-mswin32-x64-404-erro
14
июня
2007
Рубрики: PHP, Web-сервисы, WordPress
В WordPress плагине Brian’s Threaded Comments используются не очень красивые значки ‘-’ и ‘+’ для свернутых и развернутых веток.
Далее »
10
июня
2007
Рубрики: Java
Со времен господства языка C я пребывал в уверенности, что операция switch при благоприятных обстоятельствах выполняется за время, не зависящее от количества ветвей (cases). Оказалось, что бывают и неприятные исключения.
Далее »