среда, 12 апреля 2006 г.

Опять про Java (ну и более другие ЯП)

Вчера вечером размышлял на тему, что мне нравится и не нравится в Java.
Нравится:
  1. удобная пакетная система (впрочем, такой же может и Python похвастаться);
  2. удобная система создания/подключения библиотек на Java же;
  3. JNI --- очень приличный интерфейс (хотя, может, и не меру сложноват; например, у Lua или у Python попроще будет);
  4. хорошая программа на Java "хорошо выглядит";
  5. можно на одном хосте держать сколько угодно рантаймов для разных целей.
Не нравится:
  1. нельзя контролировать процесс распределения/освобождения памяти;
  2. JIT может сожрать кучу памяти на большом приложении для оптимизации и с этим ничего не поделать;
  3. неудобный механизм Reflections (к слову сказать, Python в этом смысле даст Java 100 очков вперед);
  4. не используя интерфейсы нельзя разделить контракт класса/модуля и реализацию;
  5. если Cloneable не в счет, то нет deep copy (в Python есть разные схемы копирования);
  6. нельзя переопределять операторы;
  7. нет понятия константного метода класса.
Это основное. Если поковырять, то можно еще что-нибудь надумать. Пока таки предпочитаю C/C++ (последнее время больше даже C, поскольку пришел к мысли, что на C можно написать без потери читаемости и сопровождаемости очень даже много) и Python.

2 комментария:

  1. > не используя интерфейсы
    > нельзя разделить контракт
    > класса/модуля и реализацию

    Это как? Непонял...
    Интерфейсы для того и даны, чтобы API описывать не вдаваясь в реализацию...

    > нельзя переопределять операторы

    Не нужно переопределять операторы.
    По крайней мере так, как это делается в C++.

    > нет понятия константного метода класса

    А что это такое?

    ОтветитьУдалить
  2. Я же сказал "не используя интерфейсы.
    В случае интерфейсов может получиться громоздко по нескольким причинам:
    1) если методы логически не связаны, но о них надо кому-то сказать, то и интерфейсов должно быть много (и в каждом по одному методу); тогда и появляются классы, имплементирующие толпу интерфейсов;
    2) в Java все методы принадлежат классам, поэтому не сказать что-то типа "существует где-то в рантайме метод x с параметрами y и z, который делает то-то и то-то", надо обязательно указать где именно этот метод сидит (скажем, сказать имя класса); а если я обязательно хочу скрыть реализацию этого метода (при таком описании --- явно статического), то не обойтись без костылей, типа, фабрик или провайдеров, которые возвращают интерфейс;
    3) интерфейсы могут повлечь за собой толпу приведений типов.

    Переопределение операторов может быть очень полезно. Практика программирования на Python (который, в принципе, очень похож на Java) меня в этом убедила. Главное, не переопределять бездумно.

    Константный метод класса --- это такой метод, которые не может изменить значения полей класса и также не может вызывать не константные методы. Очень полезное свойство C++, позволяет контролировать логику при программировании. (К слову сказать, в Python такого тоже нет, к сожалению.)

    Собственно, все, что я тут излагал --- мое личное мнение и то, что мешает лично мне. Для кого-то другого это может быть совсем не так или вообще наоборот.

    ОтветитьУдалить

Спутник взлетает. Первая ступень отработала.

 И, кажется, неплохо: Посмотрим, что будет когда отработает вторая.