• софт, хард & интERнет

  • Личный опыт укрощения компьютеров

7 апреля 2008

Ruby: рассуждения о наследовании

Рубрики: 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).

Вывод: используйте наследование в первую очередь как способ описания используемой модели, проектного решения. А уж потом реализуйте в классах требуемые методы.

Ответов: 4

25 марта 2008

Ruby: всякая всячина

Рубрики: Ruby, Проблемы, Разработка, Языки

Продолжаю погружаться в мир Ruby. Для систематического рассказа пока не время, но путевых заметок уже накопилось, пора записывать для памяти.

Далее »

Нет ответов

13 января 2008

Первый взгляд на Ruby

Рубрики: Ruby, Разработка, Языки

Новогодние каникулы оказались подходящим случаем для общего знакомства с Ruby. Особой склонности к языкам с динамической типизацией я не испытываю — применимость их в больших проектах весьма сомнительна. В Ruby же привлекли возможности метапрограммирования и их использование для реализации DSL (Domain Specific Languages). Кроме того, хотелось понять, что позволяет преодолеть недостатки динамической типизации при использовании Ruby в достаточно больших проектах.

Далее »

Нет ответов

23 октября 2007

Runtime.exec(): cygwin vs Linux

Рубрики: 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

treedl.png
Эпиграф: не потому, что других идей нет, а потому, что эта - любимая. (с) забыл чей

На прошлой неделе выпустил новую версию TreeDL 2.3.2. Предыдущую версию за 16 месяцев скачали ну от силы 250 раз. За два дня после выхода этой по статистике SourceForge было скачано 120 файлов, причем новую версию скачали меньше 20 раз. Проект выскочил в Top500.
При этом сообщений о выходе новой версии нигде не было. Анонс в список рассылки я отправил уже после этого ажиотажа, да и подписчиков там 4 человека всего. На вебе никаких новых ссылок на проект, вроде, не появилось. Интересно, откуда взялась такая активность? Есть предположение, что это какой-то робот ходит, но я о таких не слышал.

TreeDL - это мой проект, который появился для облегчения работы над основными проектами по разработке трансляторов.
Далее »

Нет ответов

25 июля 2007

Маленькая задачка для C программистов

Рубрики: C

Мой коллега Александр Сортов поделился маленькой задачкой для C программистов:
Попробуйте без компьютера сообразить, сколько слов “before” и “after” будет напечатано после выполнения этого кода?

#include <stdio.h>
 
int main() {
  int pid;
  printf("before");
  pid = fork();
  printf("\nafter");
  if(pid == 0) {
    _exit();
  }
  printf("\n");
}

Далее »

Ответов: 2

3 июля 2007

Про отладку

Рубрики: Java, Разработка

В коллекцию забавных происшествий при отладке программ добавилось ещё одно.

Далее »

Нет ответов

21 июня 2007

ppm не работает на x64

Рубрики: Perl, Windows, Проблемы

Теперь я знаю, что неработоспособность ppm в perl-MSWin32-x64 - это не баг, а фича:

http://community.activestate.com/forum-topic/ppm4-mswin32-x64-404-erro

Нет ответов

14 июня 2007

Картинки внутри php файлов

Рубрики: PHP, Web-сервисы, WordPress

В WordPress плагине Brian’s Threaded Comments используются не очень красивые значки ‘-’ и ‘+’ для свернутых и развернутых веток.

Далее »

Нет ответов

10 июня 2007

Время выполнения switch в Java

Рубрики: Java

Со времен господства языка C я пребывал в уверенности, что операция switch при благоприятных обстоятельствах выполняется за время, не зависящее от количества ветвей (cases). Оказалось, что бывают и неприятные исключения.

Далее »

Ответов: 2





 

28 queries. 1.970 seconds.