Re[5]: Проект утилитной библиотечки
От: Evgeny.Panasyuk Россия  
Дата: 17.03.16 20:55
Оценка: +2
Здравствуйте, nigh, Вы писали:

N>Да нет, там все гораздо глубже. Основная мысль в том, что Disposable и try-finally для семантики локов не подходят и создают ложное ощущение безопасности.


Это проблема exception safety guarantees, она существует и без всяких локов или даже потоков. Она даже существует без using'ов, только ещё хуже.
А вот RAII, using'и, try-with-resourcues, with — как раз подходят к семантике локов. А вот ложное ощущение безопасности — это от незнания exception safety


N>
N>WithdrawMoney(AccountB, 100)    //throw an exception here, will never unlock unless proper recovery is done - likely a deadlock, but not further data corruption by other threads
N>


Если тебе нравится "likely a deadlock, but not further data corruption by other threads" — то лучше сразу на первом же исключении пристреливать программу и тормозить всю систему, без всяких "likely", чтоб наверняка — так robust'ней
Отредактировано 17.03.2016 20:59 Evgeny.Panasyuk . Предыдущая версия . Еще …
Отредактировано 17.03.2016 20:57 Evgeny.Panasyuk . Предыдущая версия .
Отредактировано 17.03.2016 20:57 Evgeny.Panasyuk . Предыдущая версия .
Re[6]: Проект утилитной библиотечки
От: nigh  
Дата: 17.03.16 20:59
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, nigh, Вы писали:


N>>Да нет, там все гораздо глубже. Основная мысль в том, что Disposable и try-finally для семантики локов не подходят и создают ложное ощущение безопасности.


EP>Это проблема exception safety guarantees, она существует и без всяких локов или даже потоков. Она даже существует без using'ов, только ещё хуже.

EP>А вот RAII, Using'и, try-with-resourcues как раз подходят к семантике локов, а ложное ощущение безопасности — это от незнания exception safety.
В C# средствами языка exception safety не достигается. Даже checked exceptions нету (от них больше вреда чем пользы). Мы же тут C# обсуждаем?

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

N>>
N>>WithdrawMoney(AccountB, 100)    //throw an exception here, will never unlock unless proper recovery is done - likely a deadlock, but not further data corruption by other threads
N>>


EP>Если тебе нравиться "likely a deadlock, but not further data corruption by other threads" — то лучше сразу на первом же исключении пристреливать программу и тормозить всю систему

Мне оно не особо нравится, просто в ряде задач это лучше, чем data corruption. Более того, правильную обработку exceptionа во втором случае можно где-нибудь ниже по стеку сделать, в отличие от.
Пристреливать всю программу необязательно (хотя можно), есть, скажем таймауты — другие треды будут продолжать нормально работать.
Отредактировано 17.03.2016 21:08 nigh . Предыдущая версия .
Re[6]: Проект утилитной библиотечки
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.03.16 21:11
Оценка:
Здравствуйте, xy012111, Вы писали:

X>Мда, я был уверен, что EditorConfig умеет хотя бы скобки расставлять, а там из полезного лишь настройка табуляции


Так про то и речь. Сама студия крайне бедна в этом плане. Розлин немного получше стал, но до решарпера/стайлкопа еще очень далеко. Тащить в проект стайлкоп не хочется, а решарпер платный (через 3 месяца можно попросить для основных девелоперов бесплатную лицензию).
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[7]: Проект утилитной библиотечки
От: Shmj Ниоткуда  
Дата: 17.03.16 22:59
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Так про то и речь. Сама студия крайне бедна в этом плане. Розлин немного получше стал, но до решарпера/стайлкопа еще очень далеко. Тащить в проект стайлкоп не хочется, а решарпер платный (через 3 месяца можно попросить для основных девелоперов бесплатную лицензию).


Чего греха таить -- у всех так или иначе есть либо платная либо бесплатная/самогенереным серийником версия. Что, еще остались люди без решарпера?

Если у кого нету -- реально можно триал а потом выклянчить ключик.
Отредактировано 17.03.2016 23:00 Shmj . Предыдущая версия .
Re[7]: Проект утилитной библиотечки
От: xy012111  
Дата: 17.03.16 23:01
Оценка:
Здравствуйте, AndrewVK, Вы писали:

X>>Мда, я был уверен, что EditorConfig умеет хотя бы скобки расставлять, а там из полезного лишь настройка табуляции


AVK>Так про то и речь. Сама студия крайне бедна в этом плане. Розлин немного получше стал, но до решарпера/стайлкопа еще очень далеко. Тащить в проект стайлкоп не хочется, а решарпер платный (через 3 месяца можно попросить для основных девелоперов бесплатную лицензию).


Может ты просто экспортнёшь свои настройки C# и C# Editor из студии и как отдельный проект в Rsdn опубликуешь? И все кому надо будут его брать и перед работой с rsdn-проектами импортить себе. Туда же рядышком можно положить и файл настроек РеШарпера, для тех, у кого он есть и кто его хочет использовать.
Re[8]: Проект утилитной библиотечки
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.03.16 23:23
Оценка:
Здравствуйте, xy012111, Вы писали:

X>Может ты просто экспортнёшь свои настройки C# и C# Editor из студии и как отдельный проект в Rsdn опубликуешь?


У меня они дефолтные кроме табуляции, я решарпером пользуюсь.

X>Туда же рядышком можно положить и файл настроек РеШарпера, для тех, у кого он есть и кто его хочет использовать.


Файл настроек решарпера с самого начала лежит в репе рядом с sln.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[6]: Проект утилитной библиотечки
От: _Raz_  
Дата: 18.03.16 00:56
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Sinix, Вы писали:


S>>Лучше не с явы, на SO есть почти рабочее решение, очень близкое к нативной StrCmpLogical. В коде опечатка падает при сравнении строк из нулей, как поправить в комментариях есть.


AVK>Да я вроде жабное портанул уже, вполне рабочее. Так что ХЗ как лучше. Ты как считаешь?


А насколько близкое нужно к StrCmpLogicalW? Сейчас ожидаемые результаты лежащие в гите и StrCmpLogical расходятся:
idx source from git               expected from git             actual by StrCmpLogical                   
--- ----------------------------- ----------------------------- -----------------------------
0   "      b3.txt"                ""                            ""                           
1   "10"                          "        "                    "        "                   
2   "x10m.txt"                    "1"                           "                         16"
3   "20"                          "01"                          "      b3.txt"               
4   "2"                           "1.txt"                       "     b4.txt    "            
5   "444444"                      "2"                           " 15"                        
6   "b10.txt"                     "3.txt"                       "01"                         
7   "a10b1.txt"                   "10"                          "1"                          
8   "10.txt"                      "0000010.txt"                 "1.txt"                      
9   "3.txt"                       "10.txt"                      "2"                          
10  "x2m.txt"                     " 15"                         "3.txt"                      
11  "a1b1.txt"                    "                         16" "0000010.txt"                
12  "a2b2.txt"                    "20"                          "10"                         
13  "        "                    "444444"                      "10.txt"                     
14  "01"                          "a1b1.txt"                    "20"                         
15  "a2b1.txt"                    "a2b1.txt"                    "444444"                     
16  "a2b11.txt"                   "a2b2.txt"                    "a1b1.txt"                   
17  "     b4.txt    "             "a2b11.txt"                   "a2b1.txt"                   
18  "b1.txt"                      "a10b1.txt"                   "a2b2.txt"                   
19  "1.txt"                       "b1.txt"                      "a2b11.txt"                  
20  "0000010.txt"                 "b2.txt"                      "a10b1.txt"                  
21  "b2.txt"                      "      b3.txt"                "b1.txt"                     
22  "1"                           "     b4.txt    "             "b2.txt"                     
23  ""                            "b10.txt"                     "b10.txt"                    
24  " 15"                         "x2m.txt"                     "x2m.txt"                    
25  "                         16" "x10m.txt"                    "x10m.txt"

Получается что компарер со StackOverflow не будет работать с текущими expected.

Ну и плюс NaturalComparer споткнулся на такой ерунде:
idx source     expected   actual    
--- ---------- ---------- ----------
0   "a1b1.txt" "a1b .txt" "a1b0.txt"
1   "a1b0.txt" "a1b0.txt" "a1b .txt"
2   "a1b .txt" "a1b1.txt" "a1b1.txt"
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[7]: Проект утилитной библиотечки
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.03.16 01:40
Оценка:
Здравствуйте, _Raz_, Вы писали:

_R_>А насколько близкое нужно к StrCmpLogicalW?


Без понятия. Реквест не мой.

_R_> Сейчас ожидаемые результаты лежащие в гите и StrCmpLogical расходятся:

_R_>Получается что компарер со StackOverflow не будет работать с текущими expected.

Что то мне результат StrCmpLogical вообще не кажется правдоподобным. Пробелы, к примеру, обрабатываются некорректно.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[8]: Проект утилитной библиотечки
От: _Raz_  
Дата: 18.03.16 01:52
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Что то мне результат StrCmpLogical вообще не кажется правдоподобным. Пробелы, к примеру, обрабатываются некорректно.


Легко проверить
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace ConsoleApplication2
{
    class Program
    {
        public class StrCmpLogicalWComparer : IComparer<string>
        {
            [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
            private static extern int StrCmpLogicalW(string psz1, string psz2);

            public int Compare(string x, string y)
            {
                return StrCmpLogicalW(x, y);
            }
        }

        static void Main()
        {
            var data = new[]
            {
                "      b3.txt",
                "10",
                "x10m.txt",
                "20",
                "2",
                "444444",
                "b10.txt",
                "a10b1.txt",
                "10.txt",
                "3.txt",
                "x2m.txt",
                "a1b1.txt",
                "a2b2.txt",
                "        ",
                "01",
                "a2b1.txt",
                "a2b11.txt",
                "     b4.txt    ",
                "b1.txt",
                "1.txt",
                "0000010.txt",
                "b2.txt",
                "1",
                "",
                " 15",
                "                         16"
            };

            var sorted = new List<string>(data);
            sorted.Sort(new StrCmpLogicalWComparer());

            foreach (var s in sorted)
            {
                Console.WriteLine("\"{0}\"", s);
            }

            Console.ReadKey();
        }
    }
}
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[8]: Проект утилитной библиотечки
От: _Raz_  
Дата: 18.03.16 02:11
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

AVK>Что то мне результат StrCmpLogical вообще не кажется правдоподобным. Пробелы, к примеру, обрабатываются некорректно.


Сортировка в проводнике:

  img
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 78>>
Re[8]: Проект утилитной библиотечки
От: Sinix  
Дата: 18.03.16 05:55
Оценка:
Здравствуйте, xy012111, Вы писали:

X>Может ты просто экспортнёшь свои настройки C# и C# Editor из студии и как отдельный проект в Rsdn опубликуешь?

В приличных домах это делается через Rebracer + CodeMaid + StyleCop rule set + CodeAnalysis rule set. Всё настраивается per solution.
Ну и .EditorConfig можно положить чтоббыл, но его редко кто использует.

CodeMaid настраивается на автоформатирование кода при сохранении и любые соглашения по форматированию сводятся к "это правило можно применить автоматически при сохранении файла? нет — до свидания".

Ничего круче (просто открываешь студию, ставишь рекомендованные расширения и просто пишешь код) по удобству не будет.
Не, конечно можно попытать счастья с решарпером, но он во-первых есть не у всех, а во-вторых он использует свои соглашения типа
someCondition
  ? DoThis()
  : DoThat();

// вместо каноничного
someCondition ?
  DoThis() :
  DoThat();

и не все из них настраиваются.
Re[9]: Проект утилитной библиотечки
От: Sinix  
Дата: 18.03.16 06:28
Оценка: +1
Здравствуйте, IT, Вы писали:

Такой вопрос:
    //NOTTODO: IT: The name is the best ever. Don't change it.
    public static string Args([NotNull] this string format, params object[] args) => string.Format(format, args);

Чот я не уверен в best ever.

UPD: Я знатно протупил с вариантом .Format(), AndrewVK намекнул ниже Но Args мне всё равно не нравится

Аргументы против в произвольном порядке:
0. Guidelines. Имя метода не совпадает с производимым действием.

1. WTF test fail.
Возьми произвольного девелопера и спроси: "эй, у нас будет метод-расширение для форматирования строк, как он должен выглядеть?"
Сколько напишут
var sayHelloFormat = @"Hello, {0}"!
...
return sayHelloFormat.Args(wellKnownNames[0]); // WTF???

вместо
var sayHelloFormat = @"Hello, {0}"!
...
return sayHelloFormat.Format(wellKnownNames[0]);
?


2. Совместимость с другими решениями. В куче проектов используется SmartFormat с extensions вида
var x = "You have {0} new {0:message|messages}".SmartFromat(emails.Count);
var y = "You have new message(s): {0}".Args(emails.Count); // WTF???


3. Too noisy. Подобные узкоприменимые расширения должны быть opt-in. Иначе после подключения юзинга ради полезной фичи (например, NotNullNorEmpty()) intellisence засоряется куда менее полезными Точнее, абсолютно бесполезными с учётом пары SmartFromat + c# string interpolation. Только чур не спорить "это ж один метод, фигня!".
У меня из-за таких дачобудет в одном из доставшихся в подарок проектов только на object 12 extension-ов вылазят. Нафиг-нафиг.


Ну, т.е.
1. Переименовать в .Format() .StringFormat() или что-то типа того.
2. Спрятать в отдельный namespace.
Это всё не ради срача, а чтоб сделать код лучше. Если решение принципиально будет "всё равно останется как есть" — можно не спорить, просто так и скажи
Отредактировано 18.03.2016 7:16 Sinix . Предыдущая версия .
Re[10]: Проект утилитной библиотечки
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.03.16 06:34
Оценка: 40 (1)
Здравствуйте, Sinix, Вы писали:

S>1. Переименовать в .Format()


Компилятор против

S>2. Спрятать в отдельный namespace.


Спорно.

S>Это всё не ради срача, а чтоб сделать код лучше. Если решение принципиально будет "всё равно останется как есть" — можно не спорить, просто так и скажи


Добавил вообще то IT, а не я.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[9]: Проект утилитной библиотечки
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.03.16 06:34
Оценка:
Здравствуйте, _Raz_, Вы писали:

_R_>Сортировка в проводнике:


И? Разве правильно так реагировать на пробелы?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[8]: Проект утилитной библиотечки
От: Sinix  
Дата: 18.03.16 06:35
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Такой вопрос: а зачем нужны методы вида
// CollectionExtensions.cs

        /// <summary>
        /// Returns the input typed as <see cref="HashSet{T}"/>.
        /// </summary>
        public static HashSet<T> AsHashSet<T>(this HashSet<T> source)
        {
            return source;
        }
?
Re[9]: Проект утилитной библиотечки
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.03.16 06:36
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Не, конечно можно попытать счастья с решарпером, но он во-первых есть не у всех,


Так и CodeMaid со стайлкопом тоже не у всех.

S>и не все из них настраиваются.


Большая часть настраивается. И ну ее нафик, такую каноничность как в примере — читать неудобно.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[9]: Проект утилитной библиотечки
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 18.03.16 06:37
Оценка:
Здравствуйте, Sinix, Вы писали:

S>?


Не ко мне вопрос. Видимо для разрешения конфликтов в каких то случаях.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[11]: Проект утилитной библиотечки
От: Sinix  
Дата: 18.03.16 07:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

S>>1. Переименовать в .Format()

AVK>Компилятор против
Слона я не заметил
У меня эти штуки сделаны парой UserStringFormat()/ InvariantStringFormat(), забыл про конфликт с static-методом.
Ну и в пару два статик-класса UserString/InvariantString, вызывают методы из System.String, только с соответствующей культурой/comparison.

Может, их тоже добавить?


AVK>Добавил вообще то IT, а не я.

Так ему и отвечал
Re[10]: Проект утилитной библиотечки
От: Sinix  
Дата: 18.03.16 07:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

S>>Не, конечно можно попытать счастья с решарпером, но он во-первых есть не у всех,

AVK>Так и CodeMaid со стайлкопом тоже не у всех.
Зато бесплатные и вызывают гораздо меньше проблем

AVK>Большая часть настраивается. И ну ее нафик, такую каноничность как в примере — читать неудобно.

Ну тут опять-таки вкус фломастеров
Из практики, когда не у всех в команде есть решарпер, поддержать общий стиль форматирования заметно сложнее — получается "или все прогинаемся под R#, или никак".
Re[10]: Проект утилитной библиотечки
От: Sinix  
Дата: 18.03.16 07:26
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Не ко мне вопрос. Видимо для разрешения конфликтов в каких то случаях.

Ну так ты добавлял
Commit 778d3cde 
andrewvk <avk@rsdn.ru>
18.03.2016 3:35:51
Если нет реальных сценариев использования, то лучше выбросить.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.