29 June 2008

Не изобретайте колёса! 6 причин от Java мастера пользоваться существующими.

Lumber room
Колёса для марсианских роверов

— Ну хватит уже этих банальностей про колёса, надоело! — скажешь ты.

А вот и не хватит!

В современном научном мире и мире программирования колёса изобретают только
идиотыбунтари и студенты — в качестве домашнего задания.

Java — это такой особенный язык, разработчики которого очень продуманно подошли к проблеме разработки стандартных библиотек. Так что колес здесь своих достаточно на любой вкус и цвет.
Глотай бери — не хочу!

Вот список из 6 причин использовать существующие наработки для тех, кто еще не уверовал:

1. Свое колесо — восьмеркой.
Доказательство тривиальное. Чем больше написано кода, тем больше допущено ошибок. Значит, код вашего колеса вероятно будет содержать ошибки. С другой стороны штампованое серийно выпущенное колесо (многократно протестированные библиотеки) содержит минимум ошибок.

Возьмем классическую задачу сортировки массива. Пусть требуется отсортировать массив Person по неубыванию имени.
Сортировка выполняется по имени или фамилии в зависимости от параметра.

class Person {
  String name;
  String surname;

  String getName(int index) {
    return index == 0? name: surname;
  }
}

void nativeSort(Person[] persons, final int index) {
  Arrays.sort(persons, new Comparator<Person>() {
    public int compare(Person o1, Person o2) {
      return o1.getName(index).compareTo(o2.getName(index));
    }
  });
}

void mySort(Person[] persons, int index) {
  for (int i = 0; i < persons.length — 1; i++) {
    for (int k = 0; k < persons.length — 1; k++) {
      if (persons[k + 1].getName(index).compareTo(persons[k].getName(index)) <= 0) {
        Person buf = persons[k];
        persons[k] = persons[k + 1];
        persons[k + 1] = buf;
      }
    }
  }
}


На первый взгляд, оба решения совершенно правильные. Одно из них использует библиотечную функцию сортировки, а второе реализует алгоритм сортировки
пузырьком. Но оказывается, что своё решение обладает серьезным недостатком, который может повлечь неприятные последствия в реальном коде. Каким? Не скажу!
Это задачка для самостоятельной работы :). Ответы просьба писать в комментариях белым шрифтом.

2. Свое колесо катится медленнее.
В примере из первого пункта используется сортировка пузырьком. Как известно, она выполняется за квадратичное время. А стандартная сортировка использует
алгоритм merge sort, обладающий сложностью N*log(N), что работает значительно быстрее.

3. Свой код дороже поддерживать.
Код своих библиотек так или иначе придется поддерживать. Потребуется рефакторинг, доработка, отимизация, отладка с чашкой кофе в три ночи.
А использование готовых библиотек позволяет — только задумайтесь — перебросить разработку части функционала на сторонних (часто более надежных) разработчиков.

4. Знание стандартных библиотек поможет тебе легче понимать чужой код. Ведь стандартные библиотеки на то и стандартны, что их используют разные команды.

5. Модули, использующие стандартные библиотеки и интерфейсы, проще интегрируются.
Интеграция модулей включает обмен данными. Если данные не станадртизованы, то придется писать конвертеры.
Например, вы хотите соединить в своём проекте библиотеку для работы с http соединениями org.apache.commons.httpclient.*
и библиотеку для работы с xml javax.xml.parsers.*. Гарантирую головную боль, связанную с тем, что в этих
библиотеках используется разный класс для описания URL (java.net.URL и org.apache.commons.httpclient.HttpURL)

6. Разработчики библиотек часто лучше тебя знают, в чем ты нуждаешься. Это похоже на теорию конспирации?
— Вовсе нет. Стандарты в мире java принимаются консорциумом(en), а, значит,
принятые решения подходят большинству команд разработчиков. А раз они подходят почти всем, то наверняка, подойдут и тебе.
Здесь можно вспомнить про другие(en) технологии, которые разрабатываются полностью внутри компаний,
что может (но не обязательно) сделать их недостаточно удобными для тебя.

Полная версия статьи в блоге Java мастера.
Tags: java стандартные библиотеки
Hubs: Lumber room
+21
289 9
Comments 52
Ads