суббота, декабря 31, 2005

С Новым Годом!

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

Итак, с Новым Годом! Который непременно принесет новые успехи, достижения, кучу денег и мешок счастья.

И напоследок бодрящий анекдот. Он не новогодний, а просто прикольный:
Two strings walk into a bar. The first one says, “Bartender! Bartender! I want a drink!”
The second one says, “Bartender! Bartender! I want a drink too! blaaaaaaaaah Eeeeeeeek yaaaaaaak oooooooh.”
The first one says, “Please excuse my friend. He isn't null terminated.”

среда, декабря 28, 2005

Ожил блог My own little DirectX FAQ

Блог My own little DirectX FAQ посвящен, как следует из названия, DirectX. Он не обновлялся с 2003 года, но в этом месяце его автор, Tom Forsyth, написал несколько новых постов, и, надеюсь, его энтузиазм на этом не иссякнет. Том работает в RAD Game Tools и занимается разработкой утилит для разработчиков игр. Также советую заглянуть на домашнюю страничку Тома, там есть его публикации и слайды с различных выступлений.

суббота, декабря 24, 2005

C++0x

Update 27.12.2005: По поводу названия, почему C++0x. x будет заменен на номер года выхода стандарта. Это будет C++07, C++08, что-нибудь в этом роде. Разработка нового стандарта началась не недавно, о том, что принимаются предложения, было объявлено несколько лет назад. Процесс идет неспешно, сначала предложения копились, теперь рассматриваются...

"Упрочить доказанные достоинства C++ и двигаться вперед" - под таким девизом Бьерн Страуструп написал статью про разработку нового стандарта C++, C++0x.
C++0x планируется сделать почти на 100% совместимым с текущим стандартом, C++98. "Почти" потому что совсем на 100% сделать не получится. Страуструп в качестве примера приводит добавление нового ключевого слова. Код, который раньше использовал такое слово, уже не будет соответствовать новому стандарту.
Страуструп настивает на том, что C++ останется языком общего назначения. Более-менее специализированные вещи будут внесены в Стандартную Библиотеку.
Будет уделено внимание поддержке новичков. Сейчас, по мнению Страуструпа, язык больше ориентирован на экспертов и начинать на нем программировить довольно тяжело. Язык должен помогать новичку, защищать от внесения ошибок. Предназначенные для этого конструкции не должны стоять особняком, нужно чтобы они органично вписались в язык.
Сейчас можно отключить потенциально дорогие фичи, например RTTI, что положительно сказывается на производительности. Страуструпу очень нравится эта возможность и он пишет, что в C++0x в этом отношении ничего не изменится.
Я просмотрела по диагонали неполный список предложений по языку и список предложений по Стандартной библиотеке. Это именно предложения, не факт, что они буду включены в язык. Вот некоторые из них.
Неполный список предложений по языку:

  • Возможность переопределения новых приведений типов static_cast, dynamic_cast, это может оказаться удобным при использовании умных указателей (smart pointers).
  • Свойства (properties) в стиле Delphi/C#.
  • Опциональная сборка мусора.
  • Использование строк в switch.

    bool f(string s)
    {
    switch(s) {
    case "yes": return true;
    case "no": return false;
    default: throw Unexpected_string();
    }

  • Ключевое слово final, которое в сочетании с виртуальной функцией, запретит дальнейшее перекрытие этой функции.

Список пожеланий для Стандартной библиотеки:
  • Простой способ выводить на зкран содержимое контейнеров в красиво отформатированном виде. То есть cout << x должно "просто работать" для контейнеров.
  • XML парсер
  • Хорошая библиотека линейной алгебры (матрицы, векторы). Отдельно есть предложение по библиотеке для кватернионов специально для тех, кто разрабатывает 3Д игры.
  • Библиотека для работы с графами.
  • Паттерны проектирования. Особенно просят Singleton.


Ссылки по теме:
The C++ Standards Committee
Boost C++ Libraries

среда, декабря 21, 2005

has-a отношение и IIITO

В ООП есть два родственных термина, которые разные люди понимают по-разному. Термины эти has-a отношение (иногда пишут HASA) и IIITO (Is Implemented In Terms Of). Вроде как оба они означают владение. И оба можно выразить через приватное наследование или через делегирование.


//Приватное наследование
class CB : private CA
{
//...
}

//Делегирование
class CB
{
private:
CA* pA;
//...
}

В различных источниках я читала разное мнение по их поводу. Что IIITO - это и приватное наследование, и делегирование, а has-a - это только приватное наследование. Или что has-a - это и приватное наследование, и делегирование, а IIITO - это только делегирование. В итоге о чем именно идет речь приходится понимать из контекста.

Ссылки по теме:
GotW#60: Exception-Safe Class Design, Part 2: Inheritance
comp.object IS A and HAS A relationships
is-a отношение

вторник, декабря 13, 2005

3D шутер на языке Haskell

Haskell - это язык функционального программирования. О функциональном программировании я имею весьма смутное представление, но я всегда думала, что оно предназначено для решения математических задач. Ан нет, умельцы могут на нем и игры писать. 3D шутер под названием Frag - это наиболее впечатляющий пример.


Он в исходниках и, честно говоря, мне было лень что-либо ставить, чтобы их скомпилять, так что в движении я его так и не посмотрела. Написан он с помощью Yampa - по документации "Yampa - это язык, встроенный в Haskell, предназначенный для описания реагирующих систем". В документации по Yampa рассказывается как с его помощью написать Space Invaders.

Вот еще игры на Haskell'е
. Сайт, увы, на японском.
Это, судя по всему, аркада.

А это похоже на паззл.


Думаю, что эти игры вызывают скорее академический, нежели практический интерес. Но все равно, забавно.

По ссылкам с блога GrammerJack: "Arcade Games in Haskell"

среда, декабря 07, 2005

is-a отношение

is-a отношение - это термин из теории объектно-ориентированного программирования. Кто-то считает, что этот термин не совсем корректный, да и вообще устаревший (В comp.object Роберт Мартин как-то бухтел по этому поводу). Но я натыкалась на него несколько раз, также как и на has-a. Про второе чуть позже, сегодня про is-a (иногда пишется ISA).
Если есть два объекта: A и B, то можно сказать, что B is-a A, если в программе везде, где используется A, можно использовать B. Несмотря на мудреное определение, все просто. Если у меня есть базовый класс CPrinter и я от него наследую CEpson, CHP и т.п., то логично будет чтобы функция, которая принимает в качестве параметра CPrinter, могла работать с любым отнаследованным принтером, поскольку по логике вещей CEpson is-a CPrinter.

Есть такое хорошее правило, если в программе есть публичное наследование, то оно должно являть собой is-a отношение. И это та вещь, которую компилятор не сделает автомагически, ответственность за то, чтобы публичное наследование было is-a отношением лежит на программисте. Например:

Если я где-то определила публичное наследование вида:
class CBase
{
public:
virtual void VirtFunc();
// ...
};

class CDerived : public CBase
{
public:
virtual void VirtFunc();
// ...
};

void SomeFunc( const CBase& );


То я фактически говорю, что CDerived is-a CBase, а значит, что в функцию SomeFunc можно передавать как экземпляры CDerived, так и CBase, и они должны обрабатываться корректно. А если я реализовала функцию VirtFunc таким образом, что передавать в SomeFunc экземпляр CDerived по каким-либо причинам нельзя, то это как минимум странно.


Ссылки по теме:
comp.object IS A and HAS A relationships
GotW #40: Controlled Polymorphism