Я знаю, что многие из нас имеют собственную небольшую личную библиотеку с инструментами и утилитами, которые мы часто используем.
У меня была моя с 16 лет, так что она выросла до довольно значительных размеров. Некоторые вещи, которые я написал, были добавлены в фреймворк. Я написал свою небольшую реализацию деревьев выражений для использования с генетическими алгоритмами задолго до LINQ, что мне очень нравилось и которым я гордился в то время - конечно, сейчас это довольно бесполезно. Но недавно я прошел через это и обновил до .NET 4.0 и снова зажег интерес.
Поэтому мне любопытно, для чего вы используете свою библиотеку. Возможно, мы могли бы получить некоторые интересные идеи для полезных маленьких фрагментов и поделиться ими между собой.
Итак, мои вопросы:
- У вас есть другая полезная библиотека?
- Какой частью вы больше всего гордитесь и почему?
Приведите пример кода, если хотите :-)
Ответы:
Нет.
Я видел некоторые кошмарные эффекты, когда дюжина разработчиков добавляла свои собственные маленькие библиотеки стилей «util.h» в проекты, и это превращало их в гигантский беспорядок несогласованного именования функций и поведения. Очень похоже на PHP. По этой причине я избегаю этого.
Я избегаю необходимости делать это, используя среды программирования, которые предоставляют мне практически все инструменты и библиотеки, которые мне нужны, когда это возможно, такие как C # и python.
источник
SmartFormat
Моя любимая утилита, которую я написал, - простой построитель / форматировщик строк, который позволяет действительно легко преобразовывать данные в строки с правильной грамматикой.
Например, большинство программистов создать текст из шаблона:
"There are {0} items remaining"
но это приводит к грамматическим ошибкам:"There are 1 items remaining"
.Так, SmartFormat позволяет писать:
"There {0:is|are} {0} item{0:|s} remaining"
.Вы просто замените
String.Format(...)
наSmart.Format(...)
и все!Код SmartFormat с открытым исходным кодом: http://github.com/scottrippey/SmartFormat/wiki
источник
java.text.MessageFormat
.MessageFormat
имеетChoiceFormat
класс, который позволяет удивительно похожий синтаксис! Пример из документации:"There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}."
. Спасибо за упоминание этой ссылки."{Count:<0?negative|=5?five|>50&<100?large|other}"
. Он имеет отражение (то есть"There are {items.Length} items"
может форматировать элементы массива и временные области. Плюс, у него есть модель плагинов для поддержки еще большего количества функций.Smart.Format("There are {0.Count} files: {0:'{}'|, |, and }.", files);
приведет к"There are 3 files: 'a.txt', 'b.txt', and 'c.txt'."
. Я не могу представить себе «локализацию» без нее.K Combinator (C #, Scala)
Я использую комбинатор K в Ruby довольно часто, в основном в сгибах, когда операция складывания выполняется посредством побочного эффекта, а не возвращаемого значения, как в этом примере:
Это подсчитывает, как часто каждый элемент встречается в
some_collection
. К сожалению, на самом деле это не работает, поскольку блок должен возвращать новое значение аккумулятора на каждой итерации, но в назначениях Ruby оценивается присвоенное значение.Таким образом, вы должны явно вернуть новое значение аккумулятора следующим образом:
Но я нахожу такое явное секвенирование уродливым в этом стиле функционального стиля с использованием сгибов. K комбинатор (называется
Object#tap
в Ruby) на помощь:Я уже пропустил это пару раз в C # (в основном потому, что по какой-то причине мутаторы коллекции, такие как
List.Add
returnvoid
вместоthis
) и Scala, так что я продолжу:и в Скале:
Функция идентификации (Ruby)
Что-то, чего мне не хватает в Ruby, это хорошо названный способ доступа к функции идентификации. Haskell предоставляет функцию идентификации под именем
id
, Scala под именемidentity
. Это позволяет писать код вроде:Эквивалентом в Ruby является
Точно не скатывается с языка?
Исправление
ForEach (.NET)
Еще один крайне недостающий метод в C #:
источник
Action
подразумевает побочные эффекты, которые идут вразрез с принципами дизайна LINQ.IEnumerable
расширения для LINQ.ForEach
не является оператором LINQ. Почему должны применяться ограничения, которые применяются только к операторам LINQForEach
, которые не являются операторами LINQ? И почему побочные эффекты запрещены,IEnumerable.ForEach
но разрешеныList.ForEach
? Кроме того, почему побочные эффекты запрещены,IEnumerable.ForEach
но разрешеныforeach
?List<T>
имеет,ForEach
является разумным, учитывая, что это изменчивый тип.У меня есть конвертер типов Java. Имеет публичную подпись
и он делает все возможное, чтобы преобразовать исходное значение в тип назначения. По сути, это позволяет вам выполнять динамическую типизацию внутри статически типизированного языка :-)
Это действительно полезно с числовыми типами в штучной упаковке. Как раздражает то, что вы не можете положить
Integer
туда, гдеLong
ожидается? Нет проблем, просто конвертируйте его. Или что, если ваша функция ожидаетdouble
, но вы должныnull
поместить туда? Кабум, NPE. Но сделайте этоconvert
, и вы получитеNaN
.источник
NaN
поддержку.NaN
отлично. Жаль, что нет такой вещи для целых чисел. Я использовалInteger.MIN_VALUE
как соглашение. Обычно это «достаточно странно», чтобы заметить, в отличие от значения по умолчанию 0. Я не знаю, почему автоматический (un) бокс не обрабатывается(Double) null
какNaN
. Это очевидное правильное решение, ИМХО.Из разного кода, который я написал, большинство хороших вещей теперь в CCAN , в то время как остальные я склоняюсь к поиску лучших версий в существующих проектах с открытым исходным кодом. Сейчас я пишу все меньше и меньше универсального «разного» кода в пользу написания специфичных для приложения вариантов такого кода или для написания модулей общего назначения, которые я могу выпускать самостоятельно.
С
Вот функция и typedef, которые я использовал более одного раза. Для приложений, которым требуется синхронизация, с точки зрения простоты трудно превзойти миллисекунды:
И еще много разных функций C, которые я использую снова и снова (и снова):
Haskell
nub :: (Eq a) => [a] -> [a]
Функция Haskell - O (n²), потому что по сигнатуре типа разрешено проверять, равны ли два элемента. Существует простая альтернатива O (n log n)map head . group . sort
, но она требует форсирования всего списка ввода перед созданием вывода, в то время какnub
может начать производить вывод сразу. Ниже приводится альтернатива O (n log n),nub
которая собирает уже просмотренные элементы вData.Set
:В Haskell, я использую альтернативы
sequence
,mapM
,forM
,replicateM
, иfilterM
. Каждое из этих действий генерирует список, но список нельзя использовать, пока действие не завершится полностью (если вы используете строгую монаду, такую как IO). Альтернативы строят список в обратном порядке, а не формируют башню громад, что, как я обнаружил, путем сравнительного анализа было быстрее, по крайней мере, с GHC.Примечание:
sequence_
,mapM_
,forM_
, иreplicateM_
функция по - прежнему лучший выбор , если вы не заинтересованы в списке результатов.источник
Я заканчиваю реализацию split / join ala Perl на языках, в которых его нет.
Я также переопределил atoi и itoa в C больше раз, чем я хочу думать (мусор встроенных систем).
источник
Нет.
Я делаю большую часть своего кодирования на Java, и лучшая практика - это повторное использование "utils" из библиотек Apache Commons и подобных проектов.
Если вы объективны в этом, есть несколько случаев, когда ваша собственная коллекция утилит будет значительным улучшением того, что уже сделали другие люди. И если это не улучшение, то ваша библиотека утилит, вероятно, является пустой тратой времени на разработку и неудобством для будущих сопровождающих.
источник
У меня были некоторые манипуляции с датами, которые я выполнял с использованием Java, затем я начал использовать JodaTime, так как слышал о нем много хорошего и о том, что он должен быть включен в Java 7 (не уверен, что это все еще так, но даже если это не так хорошо стоит использовать его imho).
Класс из 50+ строк превратился в одну строку с тремя вызовами методов.
Для любопытных это включало получение даты для каждого дня из n прошедших недель: например, цифры продаж за понедельник 10 недель назад и т. Д.
И вот часть этого
источник
У меня всегда есть какой-то
utils
пакет, даже на Java, но моя коллекция утилит PHP используется чаще всего. В Java так много хороших библиотек, что у меня уже есть библиотека, включенная в проект, или мне нужно просто спроектировать несколько недостающих утилит самостоятельно. Библиотеки PHP, как правило, делают слишком много, чтобы я захотел включить их в свои проекты.Мне нравится эта функция для PHP, уточненная с помощью StackOverflow ...
Он похож на Apache BeanUtils для Java, и я использую его для аналогичной цели, предоставляя элементам формы на языке шаблонов единственный ключ, который может получить / установить вложенное значение в исходном массиве:
Конечно, будучи PHP, я хотел бы сохранить метод как можно более так что это не совсем так , как BeanUtils функциональный
;)
источник
В стандартной библиотеке Scala отсутствуют некоторые наиболее часто используемые функции более высокого порядка.
Две такие функции, которые мне нужны чаще всего:
источник
В данный момент нет. У меня был один, когда я делал C, но теперь, когда я делаю Java, он больше не имеет смысла, учитывая все доступные стандартные библиотеки плюс все вкусности, полученные в проекте Apache.
Одной из полезных вещей в моей C lib была быстрая и грязная реализация конечного автомата, которая позволила определить конечный автомат с двумя строками и массивом строк. Его можно использовать для проверки строк на соответствие правилам (например, «должно быть длиной 4,6 символа, сначала одна буква, остальные цифры»), но наличие регулярных выражений делает эту вещь совершенно бессмысленной.
источник
Я не могу писать настольные интерфейсы без динамических диалогов , основанных на дифференциальном исполнении . Это хак, на который я наткнулся примерно в 1985 году, и я переписывал его на разных языках больше раз, чем помню.
источник
Я обнаружил, что я пишу много одного и того же кода в django: делайте это как обычно, потом так, и, наконец, так часто. Обычно получают один или несколько элементов из базы данных или сохраняют результаты формы.
Если каждая из этих вещей происходит только один раз в представлении, тогда я могу использовать общие представления django. К сожалению, они не являются действительно составными, и мне нужно было сделать несколько вещей в последовательности.
Поэтому я пошел и написал еще более общую библиотеку представлений, которая работала, сначала создав список действий из соответствующих наборов запросов (или чего-либо еще), а затем обернула список в представление.
Мне все еще приходится писать некоторые виды вручную, но они, как правило, достаточно сложны, и в них мало что можно использовать повторно. Весь шаблон просто приземляется в другом месте, либо в виде универсального вида, либо в качестве декоратора вида (часто это декорированный общий вид). Обычно это составляет около 10% обработчиков, которые я пишу, поскольку некоторые универсальные обработчики могут делать все остальное.
источник
Да, но только для специфичных для предметной области структур идиом (таких как контейнеры для игровых объектов).
Поскольку это простые утилиты, а не что-то сложное, я не горжусь ничем там. Во всяком случае, я пока единственный пользователь, поэтому гордиться нечем.
источник
C ++ косвенная сортировка, основанная на STL
sort
и шаблоне функтора.Потребность в косвенной сортировке (в которой желаемым результатом были индексы перестановки, которые должны были быть результатом сортировки данных, но не самих отсортированных данных ), возникала много раз в ряде проектов. Я всегда задавался вопросом, почему STL не предоставил реализацию для этого.
Другим был циклический вектор C ++, где положительные и отрицательные индексы модулируются по размеру вектора (так что любые целочисленные значения являются действительными индексами для вектора).
источник
Я написал небольшой пакет утилит, когда занимался разработкой Java в своем Comp. Научный класс в старшей школе. Я больше всего горжусь своим генератором случайных чисел.
Реквизит для моего вдохновения.
источник