Мне нравится Stream
иерархия. Идея состоит в том, что что-либо может использовать поток, обычно не заботясь, какой поток это, и отдельные подклассы обрабатывают устройство хранения данных по-другому (например, NetworkStream
, MemoryStream
и FileStream
в.NET).
, Если Вы интересуетесь интерфейсами, затем IEnumerable<T>
в.NET, большой - можно выполнить итерации по любому набору, не заботясь, какова базовая структура данных.
creat ()
Когда Кен Томпсон и Деннис Ричи получили премию Тьюринга в 1983 году, после В своих соответствующих приветственных речах кто-то из аудитории спросил Кена, что бы он сделал по-другому с Unix, если бы он проделал это снова и снова. Он сказал: «Я бы написал« creat »с буквой« e ».
Я никогда не был поклонником java.sql package ...
Все в общем, довольно неприятная библиотека. К счастью, библиотека Spring значительно упрощает работу с ней.
API даты / времени Java довольно ужасно работать. java.util.Date имеет несколько конструкторов для создания экземпляра на определенную дату, но все они устарели. Вместо этого следует использовать java.util.GregorianCalendar, но у него есть чрезвычайно раздражающий способ установки полей (подумайте о calendar.setField (GregorianCalendar.MONTH, 7) вместо calendar.setMonth (7), что было бы намного лучше). Последний штрих заключается в том, что большинство других классов и библиотек по-прежнему ожидают даты вместо календаря, поэтому вам придется постоянно конвертировать туда и обратно.
Некоторые методы java.io.File
, важные для системного программирования, возвращают логическое значение в указывают на успех или неудачу. Если такой метод (например, mkdir
или delete
) дает сбой, у вас вообще нет возможности выяснить, почему.
Это всегда оставляет моя челюсть отвисает.
Не победитель, но заслуживает достойного упоминания; Android. Использует язык программирования Java 5, но почти не использует какие-либо функции языка Java 5. Вместо перечислений вы получаете целочисленные константы с префиксом или суффиксом.
Он не может решить, должен ли он быть объектно-ориентированным или процедурным. Показывать диалоги, являющиеся ярким примером. Несколько обратных вызовов с самоопределенными целочисленными идентификаторами для отображения вызова диалогового окна, которое пахнет старым C API. А затем вы получаете класс внутреннего строителя с цепочечными методами, который пахнет чрезмерно архитектурным ООП худшего типа.
Класс MotionEvent имеет координаты X и Y как абсолютные и относительные значения из одного и того же вспомогательного метода. Но нет возможности проверить, какие координаты он хранит в настоящее время.
Android, конечно же, неоднозначен.
Я бы сказал MFC, ATL и WTL. Все три из этих библиотек используют чрезмерную венгерскую нотацию, переопределяют типы данных без видимой причины (CString переопределяется снова и снова) и, как известно, меняются с каждой версией Visual Studio.
Мне нравится COM. Он обеспечивает компонентно-ориентированную архитектуру задолго до того, как была разработана .NET. Однако расширение COM в DCOM, его многочисленные оболочки, такие как ATL, и общее отсутствие исчерпывающей документации делают его самым уродливым API, с которым мне приходится иметь дело на работе.
ну, это была хорошо известная библиотека около 20 лет назад, но я думаю, что исходный движок данных btrieve имеет худший API из когда-либо написанных. почти все проходит через один вызов, причем каждый из его многочисленных параметров содержит различное значение в зависимости от того, какой вызов вы действительно выполняете (один параметр был флагом, сообщающим системе, хотите ли вы открыть файл, закрыть файл, выполнить поиск, вставить и т. д.). Мне тогда нравился метод btrieve, но я потратил много времени на создание хорошего уровня абстракции.
его можно было легко улучшить, если бы не объединять все в один вызов. не только один вызов был ужасен, но программист отвечал за выделение, передачу и освобождение блока позиции ... некоторая память, используемая btrieve для отслеживания дескриптора открытого файла, положения и т. д. еще одно улучшение - это возможность использовать текст ascii при определении индексации. индексы должны быть указаны в виде запутанного двоичного представления.
с уважением, дон
Определенно не самый уродливый. Наверное, так много, но 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 (и шаблоны в целом), хотя они, очевидно, полезны, всегда чувствовал себя уродливым. Однако никаких предложений по улучшению. Они работают.
Многие функции библиотеки CRT плохо или неопределенно названы, возможно, из-за устаревших ограничений кодирования того времени и, следовательно, требуют частого использования клавиши F1 для людей, чтобы найти нужную функцию и предоставить правильные аргументы.
Я использую функции CRT некоторое время, и я все еще обнаруживаю, что нажимаю F1 изрядно.
Я собираюсь перевернуть этот вопрос с ног на голову и назвать красивый API для библиотеки, чей стандартный API в основном уродлив: привязки Haskell для OpenGL.
Вот причины:
Вместо того, чтобы сваливать все в небольшое количество заголовков , библиотека логически организована в дискретные модули, содержимое которых соответствует структуре спецификации OpenGL. Это делает просмотр документации приятным.
Пары "начало / конец" функции заменяются процедурами более высокого порядка. Например, вместо
pushMatrix ();
doSomeStuff ();
doSomeMoreStuff ();
popMatrix ();
вы бы сказали
preservingMatrix $ do
doSomeStuff
doSomeMoreStuff
Синтаксис привязок обеспечивает соблюдение соглашений библиотеки, вместо того, чтобы заставлять вас делать это вручную. Это также работает для примитивов рисования четырехугольников, треугольников, линий и т. Д. Все это, конечно, безопасно.
Получатели и сеттеры заменены идиоматическими "StateVars", что делает чтение и запись более симметричной операцией.
Множественные версии функций заменены полиморфизмом и дополнительными типами данных. Вместо вызова, скажем, glVertex2f
с двумя значениями с плавающей запятой, вы вызываете вершину
со значением типа Vertex2 GLFloat
.
Ссылки:
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, чтобы все получилось. ..
Oracle Pro C, Pro Ada, Pro * это-то-то-другое. Они были препроцессором для C, Ada и Fortran, я думаю, может быть, некоторых других, которые позволяли вставлять SQL в исходный код.
У них также была библиотека, которая работала намного лучше и была намного более гибкой.
(Это было более 10 лет назад, я понятия не имею, что они делают сейчас, хотя я не удивлюсь, если это был все тот же, просто чтобы не нарушать код людей.)
Livelink (OpenText) API
На стене рядом с моим столом есть отпечаток моей головы ...
Очень простой пример получения значения из 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