Что самый ужасный API для относительно известной библиотеки, которую Вы видели, и почему и как он мог быть улучшен? [закрытый]

Мне нравится Stream иерархия. Идея состоит в том, что что-либо может использовать поток, обычно не заботясь, какой поток это, и отдельные подклассы обрабатывают устройство хранения данных по-другому (например, NetworkStream, MemoryStream и FileStream в.NET).

, Если Вы интересуетесь интерфейсами, затем IEnumerable<T> в.NET, большой - можно выполнить итерации по любому набору, не заботясь, какова базовая структура данных.

7
задан 5 revs, 3 users 100% 29 July 2015 в 01:16
поделиться

14 ответов

creat ()

Когда Кен Томпсон и Деннис Ричи получили премию Тьюринга в 1983 году, после В своих соответствующих приветственных речах кто-то из аудитории спросил Кена, что бы он сделал по-другому с Unix, если бы он проделал это снова и снова. Он сказал: «Я бы написал« creat »с буквой« e ».

10
ответ дан 6 December 2019 в 04:58
поделиться

Я никогда не был поклонником java.sql package ...

  1. Вы должны перехватить проверенное исключение для всего, и есть только одно исключение, поэтому оно не дает никаких указаний на то, что пошло не так, без проверки строки кода SQL.
  2. Добавьте к этому Дело в том, что вам нужно использовать java.sql.Date вместо java.util.Data, поэтому вам всегда нужно указывать полный пакет для того или другого. Не говоря уже о преобразовании, которое должно произойти между ними.
  3. И еще есть индекс параметра, который индексируется по 1 основанию вместо остальной части Java, которая индексируется по 0.

Все в общем, довольно неприятная библиотека. К счастью, библиотека Spring значительно упрощает работу с ней.

5
ответ дан 6 December 2019 в 04:58
поделиться

COM. Его самым большим улучшением стал .NET.

4
ответ дан 6 December 2019 в 04:58
поделиться

API даты / времени Java довольно ужасно работать. java.util.Date имеет несколько конструкторов для создания экземпляра на определенную дату, но все они устарели. Вместо этого следует использовать java.util.GregorianCalendar, но у него есть чрезвычайно раздражающий способ установки полей (подумайте о calendar.setField (GregorianCalendar.MONTH, 7) вместо calendar.setMonth (7), что было бы намного лучше). Последний штрих заключается в том, что большинство других классов и библиотек по-прежнему ожидают даты вместо календаря, поэтому вам придется постоянно конвертировать туда и обратно.

3
ответ дан 6 December 2019 в 04:58
поделиться

Некоторые методы java.io.File , важные для системного программирования, возвращают логическое значение в указывают на успех или неудачу. Если такой метод (например, mkdir или delete ) дает сбой, у вас вообще нет возможности выяснить, почему.

Это всегда оставляет моя челюсть отвисает.

3
ответ дан 6 December 2019 в 04:58
поделиться

Не победитель, но заслуживает достойного упоминания; Android. Использует язык программирования Java 5, но почти не использует какие-либо функции языка Java 5. Вместо перечислений вы получаете целочисленные константы с префиксом или суффиксом.

Он не может решить, должен ли он быть объектно-ориентированным или процедурным. Показывать диалоги, являющиеся ярким примером. Несколько обратных вызовов с самоопределенными целочисленными идентификаторами для отображения вызова диалогового окна, которое пахнет старым C API. А затем вы получаете класс внутреннего строителя с цепочечными методами, который пахнет чрезмерно архитектурным ООП худшего типа.

Класс MotionEvent имеет координаты X и Y как абсолютные и относительные значения из одного и того же вспомогательного метода. Но нет возможности проверить, какие координаты он хранит в настоящее время.

Android, конечно же, неоднозначен.

3
ответ дан 6 December 2019 в 04:58
поделиться

Я бы сказал MFC, ATL и WTL. Все три из этих библиотек используют чрезмерную венгерскую нотацию, переопределяют типы данных без видимой причины (CString переопределяется снова и снова) и, как известно, меняются с каждой версией Visual Studio.

Мне нравится COM. Он обеспечивает компонентно-ориентированную архитектуру задолго до того, как была разработана .NET. Однако расширение COM в DCOM, его многочисленные оболочки, такие как ATL, и общее отсутствие исчерпывающей документации делают его самым уродливым API, с которым мне приходится иметь дело на работе.

1
ответ дан 6 December 2019 в 04:58
поделиться

ну, это была хорошо известная библиотека около 20 лет назад, но я думаю, что исходный движок данных btrieve имеет худший API из когда-либо написанных. почти все проходит через один вызов, причем каждый из его многочисленных параметров содержит различное значение в зависимости от того, какой вызов вы действительно выполняете (один параметр был флагом, сообщающим системе, хотите ли вы открыть файл, закрыть файл, выполнить поиск, вставить и т. д.). Мне тогда нравился метод btrieve, но я потратил много времени на создание хорошего уровня абстракции.

его можно было легко улучшить, если бы не объединять все в один вызов. не только один вызов был ужасен, но программист отвечал за выделение, передачу и освобождение блока позиции ... некоторая память, используемая btrieve для отслеживания дескриптора открытого файла, положения и т. д. еще одно улучшение - это возможность использовать текст ascii при определении индексации. индексы должны быть указаны в виде запутанного двоичного представления.

с уважением, дон

0
ответ дан 6 December 2019 в 04:58
поделиться

Определенно не самый уродливый. Наверное, так много, но Flex занимает особое место в аду. В частности, UIComponent, который по сравнению со Sprite, похож на бензопилу, чтобы очистить яблоко. Я считаю, что Flex можно было бы значительно улучшить, используя более легкие объекты и функции в стиле миксинов, аналогичные тому, как Dojo работает на стороне Javascript.

Класс Date в ECMAScript / ActionScript практически бесполезен. Когда мне приходилось делать что-то более сложное, чем добавление временных меток в журналы, это было постоянной болью. Им нужно больше параметров синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, вспомогательные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

В частности, UIComponent, который по сравнению со Sprite, похож на бензопилу, чтобы очистить яблоко. Я считаю, что Flex можно было бы значительно улучшить, используя более легкие объекты и функции в стиле миксинов, аналогичные тому, как Dojo работает на стороне Javascript.

Класс Date в ECMAScript / ActionScript практически бесполезен. Когда мне приходилось делать что-то более сложное, чем добавление временных меток в журналы, это было постоянной болью. Им нужно больше вариантов синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, удобные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

В частности, UIComponent, который по сравнению со Sprite, похож на бензопилу, чтобы очистить яблоко. Я считаю, что Flex можно было бы значительно улучшить, используя более легкие объекты и функции в стиле миксинов, аналогичные тому, как Dojo работает на стороне Javascript.

Класс Date в ECMAScript / ActionScript практически бесполезен. Когда мне приходилось делать что-то более сложное, чем добавление временных меток в журналы, это было постоянной болью. Им нужно больше вариантов синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, удобные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

похоже на бензопилу, чтобы очистить яблоко. Я считаю, что Flex можно было бы значительно улучшить, используя более легкие объекты и функции в стиле миксинов, аналогичные тому, как Dojo работает на стороне Javascript.

Класс Date в ECMAScript / ActionScript практически бесполезен. Когда мне приходилось делать что-то более сложное, чем добавление временных меток в журналы, это было постоянной болью. Им нужно больше вариантов синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, удобные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

похоже на бензопилу, чтобы очистить яблоко. Я считаю, что Flex можно было бы значительно улучшить, используя более легкие объекты и функции в стиле миксинов, аналогичные тому, как Dojo работает на стороне Javascript.

Класс Date в ECMAScript / ActionScript практически бесполезен. Когда мне приходилось делать что-то более сложное, чем добавление временных меток в журналы, это было постоянной болью. Им нужно больше параметров синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, вспомогательные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

Я считаю, что Flex можно было бы значительно улучшить, используя более легкие объекты и функции в стиле миксинов, аналогичные тому, как Dojo работает на стороне Javascript.

Класс Date в ECMAScript / ActionScript практически бесполезен. Когда мне приходилось делать что-то более сложное, чем добавление временных меток в журналы, это было постоянной болью. Им нужно больше параметров синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, вспомогательные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

Я считаю, что Flex можно было бы значительно улучшить, используя более легкие объекты и функции в стиле миксинов, аналогичные тому, как Dojo работает на стороне Javascript.

Класс Date в ECMAScript / ActionScript практически бесполезен. Когда мне приходилось делать что-то более сложное, чем добавление временных меток в журналы, это было постоянной болью. Им нужно больше вариантов синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, удобные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

Мне нужно было сделать что-то более сложное, чем добавлять метки времени в журналы. Им нужно больше параметров синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, вспомогательные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

Мне нужно было сделать что-то более сложное, чем добавлять метки времени в журналы. Им нужно больше вариантов синтаксического анализа (например, возможность указывать формат ввода) и лучшее управление временем, например интеллектуальные приращения, удобные функции и т. Д.

Библиотеки C ++ STL (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.

1
ответ дан 6 December 2019 в 04:58
поделиться

Многие функции библиотеки CRT плохо или неопределенно названы, возможно, из-за устаревших ограничений кодирования того времени и, следовательно, требуют частого использования клавиши F1 для людей, чтобы найти нужную функцию и предоставить правильные аргументы.

Я использую функции CRT некоторое время, и я все еще обнаруживаю, что нажимаю F1 изрядно.

0
ответ дан 6 December 2019 в 04:58
поделиться

Я собираюсь перевернуть этот вопрос с ног на голову и назвать красивый API для библиотеки, чей стандартный API в основном уродлив: привязки Haskell для OpenGL.

Вот причины:

  • Вместо того, чтобы сваливать все в небольшое количество заголовков , библиотека логически организована в дискретные модули, содержимое которых соответствует структуре спецификации OpenGL. Это делает просмотр документации приятным.

  • Пары "начало / конец" функции заменяются процедурами более высокого порядка. Например, вместо

     pushMatrix ();
     doSomeStuff ();
     doSomeMoreStuff ();
    popMatrix ();
    

    вы бы сказали

     preservingMatrix $ do
     doSomeStuff
     doSomeMoreStuff
    

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

  • Получатели и сеттеры заменены идиоматическими "StateVars", что делает чтение и запись более симметричной операцией.

  • Множественные версии функций заменены полиморфизмом и дополнительными типами данных. Вместо вызова, скажем, glVertex2f с двумя значениями с плавающей запятой, вы вызываете вершину со значением типа Vertex2 GLFloat .

Ссылки:

3
ответ дан 6 December 2019 в 04:58
поделиться

Direct3D!

Несомненно, старый интерфейс, существовавший до Direct3D 5, был чертовски унылым:

// GL code
glBegin (GL_TRIANGLES);  
  glVertex (0,0,0);  
  glVertex (1,1,0);  
  glVertex (2,0,0);  
glEnd (); 

// D3D code, tonnes of crap removed
v = &buffer.vertexes[0];  
v->x = 0; v->y = 0; v->z = 0;  
v++;  
v->x = 1; v->y = 1; v->z = 0;  
v++;  
v->x = 2; v->y = 0; v->z = 0;  
c = &buffer.commands;  
c->operation = DRAW_TRIANGLE;  
c->vertexes[0] = 0;  
c->vertexes[1] = 1;  
c->vertexes[2] = 2;  
IssueExecuteBuffer (buffer); 

Это не так уж плохо, в настоящее время - требовалась только версия Microsoft 10, чтобы все получилось. ..

2
ответ дан 6 December 2019 в 04:58
поделиться

Oracle Pro C, Pro Ada, Pro * это-то-то-другое. Они были препроцессором для C, Ada и Fortran, я думаю, может быть, некоторых других, которые позволяли вставлять SQL в исходный код.

У них также была библиотека, которая работала намного лучше и была намного более гибкой.

(Это было более 10 лет назад, я понятия не имею, что они делают сейчас, хотя я не удивлюсь, если это был все тот же, просто чтобы не нарушать код людей.)

1
ответ дан 6 December 2019 в 04:58
поделиться

Livelink (OpenText) API

  • Все возвращается в виде причудливой формы зубчатого массива
  • В документации нет абсолютно никаких примеров
  • [ваша любимая поисковая система] обычно не возвращает результатов для данного метода API
  • Форумы поддержки почти заброшены
  • Единственный надежный способ понять полученные данные - запустить данные в отладчике Livelink
  • ] И наконец ... система стоит десятки (сотни) тысяч долларов

На стене рядом с моим столом есть отпечаток моей головы ...

Очень простой пример получения значения из API метод:

var workflow = new LAPI_Workflow(CurrentSession);

// every Livelink method uses an out variable
LLValue outValue;
// every method returns an integer that says if the call was
// a success or not, where 0 = success and any other integer
// is a failure... oh yeah, there is no reference to what any
// of the failure values mean, you have to create your own
// error dictionary.
int result = workflow.ListWorkTasks(workId, subWorkId, taskId, outValue);


if (result = 0)
{
  // and now let's traverse through at least 3 different arrays!
  string taskName = outValue.toValue(0).toValue("TASKS").toValue(0).toString("TaskName");
}

Ааак !!! : D

7
ответ дан 6 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: