Здравствуйте, AndrewVK, Вы писали:
AVK>Вопросы: AVK>1) Кто что по этому думает?
http://editorconfig.org/ бы прикрутить, а то у всех настройки редакторов разные, а в проекте должен бьыть один.
Мои личные настроки сильно уж отличаются от того, что в StringExtensions уже есть, посему мне сложно будет добавить.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
AVK>>Другие требования. Подобная библиотека будет содержать в разы больше функционала. EP>Видимо ты подразумеваешь жирные библиотеки типа POCO, QT и т.п.
Нет, я подразумеваю как раз библиотеки вроде буста, во многом закрывающие убогость библиотеки стандартной. Для дотнета такого просто не нужно.
EP>Точно — это в QT свои строки, в Boost их нет. EP>В Boost есть конечно универсальные алгоритмы и библиотеки для работы со строками — String Algo, Spirit, etc — но они не прибиты к конкретным типам строк
Это просто пример. Та же boost:lambda не в одном месте используется.
AVK>>Во всех. Еще раз — идея в том чтобы собрать максимально неспециализированный код, а не очередной всемогутер типа буста или жабьего спринга. EP>Раскрой мысль про "максимально неспециализированный код",
Код, который не завязан на какую нибудь сравнительно узкую специализацию.
EP> и почему Boost сюда не подходит?
Потому что там много специализированных вещей.
AVK>>Только голосованиями/сурвеями. EP>Может прикрутить что-то типа Github'овских звёздочек, но на отдельные компоненты/классы/функции?
Куда прикрутить?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, xy012111, Вы писали:
X>http://editorconfig.org/ бы прикрутить, а то у всех настройки редакторов разные, а в проекте должен бьыть один.
Ну прикрути. Я правда не очень понял что потом с этим конфигом полезного делать. Какой то питоноскрипт при серверной сборке запускать?
X>Мои личные настроки сильно уж отличаются от того, что в StringExtensions уже есть, посему мне сложно будет добавить.
Здравствуйте, AndrewVK, Вы писали:
X>>http://editorconfig.org/ бы прикрутить, а то у всех настройки редакторов разные, а в проекте должен бьыть один. AVK>Ну прикрути. Я правда не очень понял что потом с этим конфигом полезного делать. Какой то питоноскрипт при серверной сборке запускать?
Смысл в том, что при открытии солюшена расширение изменит настройки форматирования студии в соответствии с этим файлом, если он будет лежать в правильном месте в папке солюшена.
Здравствуйте, AndrewVK, Вы писали:
AVK>>>Другие требования. Подобная библиотека будет содержать в разы больше функционала. EP>>Видимо ты подразумеваешь жирные библиотеки типа POCO, QT и т.п. AVK>Нет, я подразумеваю как раз библиотеки вроде буста, во многом закрывающие убогость библиотеки стандартной. Для дотнета такого просто не нужно.
Пролистай список библиотек Boost, если отбросить то что уже в стандарте, то в .NET из этого есть от силы процентов 20% А вот есть брать что-то типа POCO — там да, очень много пересечения с .NET.
В Boost кстати есть даже многое из того что называли в этом топике:
AVK>Хелпер, обеспечивающий использование ReaderWriterLock с оператором using.
std/boost:: unique_lock, lock_guard
AVK>Есть более специфичные штуки — парсер командной строки
Boost.Program_options
S>Если кому надо — Range<T>/CompositeRange<T> для операция над диапазонами/наборами диапазонов — объединение, пересечение, дополнение — полный набор.
AVK>Это просто пример. Та же boost:lambda не в одном месте используется.
Где? Сделал grep — там только в двух библиотеках добавили расширенную поддержку boost::lambda, никак не заставляя пользователя использовать её, и всё.
AVK>>>Во всех. Еще раз — идея в том чтобы собрать максимально неспециализированный код, а не очередной всемогутер типа буста или жабьего спринга. EP>>Раскрой мысль про "максимально неспециализированный код", AVK>Код, который не завязан на какую нибудь сравнительно узкую специализацию.
Парсер командной строки предложенный тобой, парсер CSV, или например предложенное scoped tempdir — это всё довольно узкая специализация
AVK>>>Только голосованиями/сурвеями. EP>>Может прикрутить что-то типа Github'овских звёздочек, но на отдельные компоненты/классы/функции? AVK>Куда прикрутить?
Здравствуйте, AndrewVK, Вы писали:
S>>1. Куда заводить тикеты. AVK>github на английском
+1. Тем более, что они интегрированы с репозиторием.
S>>2. Где обсуждать / голосовать фичи AVK>github на английском. Если совсем уж проблемы с английским — можно в форум в надежде что кто то заветет issue на гитхабе. Примерно как сейчас с тем же решарпером — основной трекер англоязычный, а здесь русскоязычный форум.
Для обсуждений можно у нас форум в проектах завести. На английском сильно не пообсуждаешь, да и голосовалок там нет.
S>>3. Документашка. AVK>Для разработчиков самой библиотеки — пока на русском в местной вике. Для пользователей — md в проекте на английском. Проект/русская версия на русском в местной вике.
На гитхабе есть вика. Можно там.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, rameel, Вы писали:
R>7. NaturalStringComparer для натурального сравнения строк. Пару раз уже пригодилась, взято отсюда с http://rsdn.ru/forum/src/4246932.1
Лучше не с явы, на SO есть почти рабочее решение, очень близкое к нативной StrCmpLogical. В коде опечатка падает при сравнении строк из нулей, как поправить в комментариях есть.
Проверено и тестами и опытной эксплуатацией, работает.
UPD. Подключусь на следующей неделе скорее всего, работа.
Зато вспомнил, за что я не люблю NUnit — Assert.That.This.Asertion.Would.Not.Be.Read.By.Anyone(), 100 способов записать одно и тоже и вечные баги типа такого — подарок тот ещё
Фиг с ним, прорвёмся.
Здравствуйте, AndrewVK, Вы писали:
R>>7. NaturalStringComparer для натурального сравнения строк. Пару раз уже пригодилась, взято отсюда с http://rsdn.ru/forum/src/4246932.1
Здравствуйте, Sinix, Вы писали:
S>Лучше не с явы, на SO есть почти рабочее решение, очень близкое к нативной StrCmpLogical. В коде опечатка падает при сравнении строк из нулей, как поправить в комментариях есть.
Да я вроде жабное портанул уже, вполне рабочее. Так что ХЗ как лучше. Ты как считаешь?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Это же получается experimental а не main.
Не получается. Разница между experimental и main, во-первых, проявляется в релизе, а не в любом состоянии репа, а во-вторых оно больше относится к собственно публичному API, а не к реализации.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Да я вроде жабное портанул уже, вполне рабочее. Так что ХЗ как лучше. Ты как считаешь?
Проект без кода подобен проекту с кодом, но только без кода
Так что пусть будет то что есть, как будет время / необходимость — можно поменять. Главное, чтоб никто не закладывался на порядок сортировки, а то если будут баги — не исправишь без поломки совместимости.
Здравствуйте, AndrewVK, Вы писали:
AVK>В соседнем обсуждении зашла речь о том, что у многих, если не у каждого, скопилось некоторое количество кода, который применяется в большом количестве, если не во всех проектах. В связи с чем родилась идея собрать самое интересное в опенсорсный проект и выложить нугет с библиотечкой, чтобы использовать ее, а не свои велосипеды таскать. AVK>Основные критерии оптимизации — высокая универсальность (т.е. возможность использовать в широком спектре проектов), минимальный объем навязываемых решений (т.е. никаких сквозных подвязок, никаких фреймворков), высокая читаемость и качество кода. AVK>Вопросы: AVK>1) Кто что по этому думает? AVK>2) Что бы хотелось в этой библиотеке увидеть, и что не хотелось бы? AVK>3) Кому интересно в этом поучаствовать? AVK>4) Кому интересно библиотеку в своих проектах использовать?
Было бы интересно поучаствовать, сейчас посмотрю что там и как, может даже затащу в свой проект.
Ну, если судить по твоей ссылке, то "не рекомендуют" сильно сказано. Кроме того, в случае с RWLock это не борьба с исключением, а просто способ указать в коде scope, в котором лок действует. Примерно как Html.BeginForm в MVC.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
EP>>>Он может выкинуть исключение откуда угодно? Или только из обозначенных мест?
S>>Откуда угодно.
EP>Очень хрупкая концепция — получается что no-throw кода нет в принципе, что в некоторых случаях сильно затрудняет реализацию транзакционных операций.
EP>Надеюсь оно хоть не выкидывает новое исключение при повтором Thread.Abort в случае когда первое поймано или при выполнении finally/dispose?
(3) carefully implement the bodies of locks that do mutations so that in the event of an exception, the mutated resource is rolled back to a pristine state before the lock is released. (Good, but hard.)
При помощи scope(failure)/scope(success) это намного проще.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, nigh, Вы писали:
N>>Это, вроде отцы-основатели не рекомендуют делать. Они даже не рекмендуют больше lock использовать https://blogs.msdn.microsoft.com/ericlippert/2009/03/06/locks-and-exceptions-do-not-mix/
AVK>Ну, если судить по твоей ссылке, то "не рекомендуют" сильно сказано. Кроме того, в случае с RWLock это не борьба с исключением, а просто способ указать в коде scope, в котором лок действует. Примерно как Html.BeginForm в MVC.
Да нет, там все гораздо глубже. Основная мысль в том, что Disposable и try-finally для семантики локов не подходят и создают ложное ощущение безопасности.
В случае с rwlock, если в процессе выполнения операции внутри using возникнет исключение, finally-блок радостно разблокирует заблокированный ресурс и вы получите букет с race conditions, unprecitable behavior и т. д. (т.е. unlock произойдет тогда, когда вы его не ожидали, а не должен был произойти в принципе)
Причем, самое ужасное, что такой дизайн кода получается неявно (в случае явного вызова lock / unlock и отсутствия implicit try/finally в глаза сразу бросаются вопросы "а что будет если тут будет exception?")
using(GetRWLock())
{
UpdateJournal(AccountA, AccountB, 100)
AddMoney(AccountA, 100)
WithdrawMoney(AccountB, 100) //throw an exception here, all other threads now receive an account in an incorrect state
}
var lc = GetRWLock();
lc.wlock();
UpdateJournal(AccountA, AccountB, 100)
AddMoney(AccountA, 100)
WithdrawMoney(AccountB, 100) //throw an exception here, will never unlock unless proper recovery is done - likely a deadlock, but no further data corruption by other threads
rwlock.unlock();