Комментарии 41
В C# разве нет аналогов библиотек apache commons?
0
НЛО прилетело и опубликовало эту надпись здесь
Лично я буду благодарен за такую обёртку на регэксами. Удобно же.
-1
А как с читабельностью?
Вопрос риторический.
Вопрос риторический.
0
НЛО прилетело и опубликовало эту надпись здесь
Для того, чтобы совсем наверняка «порвал», можно
А в остальном, да, конкретный, утрированный пример из статьи, данное регулярное выражение решает.
Видимо, я не совсем ясно выразил цели проекта.
Цель проекта не заменить собой регулярные выражения, существующую логику работы со строкамиили устроить революцию.
Цель — создать Fluent интерфейс для работы со строками и реализовать его на практике.
Если кому-то это тоже будет интересно — добро пожаловать. Остальные могут продолжатьписать на асме использовать регулярные выражения.
А про быстродействие библиотеки, кстати, я даже нигде в статье не упоминал.
RegexOptions.Compiled
добавить.А в остальном, да, конкретный, утрированный пример из статьи, данное регулярное выражение решает.
Видимо, я не совсем ясно выразил цели проекта.
Цель проекта не заменить собой регулярные выражения, существующую логику работы со строками
Цель — создать Fluent интерфейс для работы со строками и реализовать его на практике.
Если кому-то это тоже будет интересно — добро пожаловать. Остальные могут продолжать
А про быстродействие библиотеки, кстати, я даже нигде в статье не упоминал.
0
Забавно, но не думаю, что применимо в реальных проектах. Столько дополнительных классов ради того, что можно было бы сделать регулярками?
С точки зрения эстетики кода, весьма элегантно, но слишком нетипично для C#. Если метод
С точки зрения эстетики кода, весьма элегантно, но слишком нетипично для C#. Если метод
Should()
я еще могу понять, то перечислимый тип The
…+7
С каких пор текучие вызовы нетипичны для C#?) Очень даже в духе тенденций, так скажем.
0
Вызовы по цепочке как таковые — вполне типичны, а вот то, как они читаются — нет. В традициях C# было бы как-то типа такого:
А попытки сделать программный код правильным предложением на английском свойственны скорее DSL на Ruby.
var str = "some string";
var res = str.ToFluent()
.Find("some", StringSearchDirection.FromEnd)
.ReplaceWith("any", StringComparison.IgnoreCase);
А попытки сделать программный код правильным предложением на английском свойственны скорее DSL на Ruby.
+1
Сам люблю велосипедостроение, но здесь-то чем регекспы не угодили?
+1
НЛО прилетело и опубликовало эту надпись здесь
Простите, что влезаю немного не в тему, но вот меня всегда поражало, как создатели .NET могли додуматься до названий вроде
StringComparison.CurrentCultureIgnoreCase
. Ведь это совершенно нечитабельно.-8
А как было бы читабельно?
+2
Хотите strcmpi?
+6
Ну вот зачем сразу крайности (хотя в strcmpi не так всё и плохо). Посмотреть хотя бы на библиотеку Delphi, который был по сути прародителем .NET (и то, и другое ваял в том числе Андерс Хейлсберг). Там сделано из без extreme verbosity, и читаемо.
0
Так название конкретное предложите этому компаратору, как бы вы его назвали?
0
Дело не конкретно в этом компараторе, а в общем стиле именования, который предполагает имена в духе «НазваниеНеймспейсаИзДвадцатиБуквВCamelCase.ЧтоТоСлишкомДлинное». Как по мне, в отсутствие в языке (по понятным причинам) возможности передавать произвольные «незакавыченные» строки куда-либо неплохо было бы сделать своеобразный локальный неймспейсинг, чтобы default namespace для параметров функций мог меняться на тот, где они были объявлены, например. Ну или иной механизм похожего назначения. Потому как выглядит это совершенно уродливо и нечитаемо, что, собственно, и натолкнуло автора к написанию его библиотечки, кстати.
-3
В значении StringComparison.CurrentCultureIgnoreCase нет неймспейса. Это enum и его значение через точку.
Вы предлагаете разрешить при вызове меотда принимающего enum (например StringComparison) не указывать тип enum'а?
А-ля «hello world».IndexOf(«w», CurrentCultureIgnoreCase)?
Вы предлагаете разрешить при вызове меотда принимающего enum (например StringComparison) не указывать тип enum'а?
А-ля «hello world».IndexOf(«w», CurrentCultureIgnoreCase)?
+1
Ну хотя бы. Непонятно, почему все так радикально против, что даже в карму минусуют. Такое ощущение, что у присутствующих начисто отсутствуют какие-либо эстетические чувства.
0
Ну и помимо этого, как мне кажется, CurrentCulture само по себе излишне. Не уверен насчёт того, какие есть другие значения, но вроде как логичнее было бы указывать отличия от некоего «Current», чем каждый раз писать о его наличии.
0
Дело в том что StringComparison опционален. Есть перегрузки методов без него. Кроме CurrentCulture есть ещё InvariantCulture и Ordinal (это режим где сравнение идёт по charcode, не задумываясь о схожих символах в UTF).
Я с вами соглашусь про излишнюю многословность .NET. Но это его суть. Он создавался чтобы быть однозначным и простым в изучении (главным образом для индусов :)).
Я с вами соглашусь про излишнюю многословность .NET. Но это его суть. Он создавался чтобы быть однозначным и простым в изучении (главным образом для индусов :)).
+2
Т.е. конкретных предложений по конкретному примеру у вас нет?
+1
string str = "Лев и медведь добыли мясо и стали за него драться. Медведь не хотел уступить, и лев не уступал.";
var result = str.ReplaceAll("медведь").With("...").IgnoringCase();
Желание сделать что-то новое это похвально. Реализация — нет.
Я не готов посмотреть код на github (боюсь за психическое здоровье), но если бы меня заставили процитированный код саппортить, сделал бы такие выводы:
1. Extension метод Replace() создает какой-то промежуточный класс и туда пишет изначальную строку и слово «медведь»
2. метод With() либо создает еще один промежуточный класс, либо добавляет флаг в предыдущий
3. метод IgnoringCase(), не смотря на функциональную незначительность названия, является «спусковым ключком», который выполняет операцию замены и возвращает строку
4. Если в пунктах 1-3 нет промежуточного класса и данные хранятся в статических переменных, то автору надо отрубить руки
5. Если промежуточный класс есть, но пропустив IgnoringCase (или даже с ним) мы получаем в var result какой-то внутренний класс, а не строку, то автору надо отрубить руки
6. Если утверждения 4 и 5 не верны, а реализовано оно еще мудренее, то автору надо обязательно отрубить руки
+4
Там везде возвращается внутренний класс с оператором неявной конвертации в строку. Не продолжайте, мы поняли, что нужно сделать с автором. =)
+4
Fluent-интерфейсы возвращают ссылку на промежуточный объект (скорее всего всегда новый), постепенно добавляя туда разнообразные флажки. И данный объект имеет метод, разворачивающий флажки в то, что нам нужно. В данном случае, что очевидно, это будет ToString() и\или оператор перевода в строку.
Исходя из ваших утверждений, с подобным подходом вы не знакомы.
Почему же тогда вы позволили себе быть столь категоричным, даже не заглянув за ответами в код?
Исходя из ваших утверждений, с подобным подходом вы не знакомы.
Почему же тогда вы позволили себе быть столь категоричным, даже не заглянув за ответами в код?
+3
Еще в Java и AlertDialog.Builder я понял, что изобретателю этой «красивой» конструкции надо… ну вы поняли :)
Теперь буду знать, как это называется, спасибо!
Благо, в Java нет Extension methods и никто не наращивает так функционал базовых классов.
Да и в случае AlertDialog.Builder есть явный метод-триггер — там не додумались важный функционал на implicit type conversion привязывать :)
Потому как имею консервативное и устойчивое собственное мнение на счет подобных конструкций, вне зависимости от их dirty internals.
Теперь буду знать, как это называется, спасибо!
Благо, в Java нет Extension methods и никто не наращивает так функционал базовых классов.
Да и в случае AlertDialog.Builder есть явный метод-триггер — там не додумались важный функционал на implicit type conversion привязывать :)
Почему же тогда вы позволили себе быть столь категоричным, даже не заглянув за ответами в код?
Потому как имею консервативное и устойчивое собственное мнение на счет подобных конструкций, вне зависимости от их dirty internals.
-3
My.Eyes.Are("Bleeding");
+8
А теперь удалим все, учитывая регистр:
string t = "Строка ТЕСТ будет удалена с обоих концов ТЕСТ".RemoveAll("тЕСт").IgnoringCase(); t.Should().Be("Строка будет удалена с обоих концов ");
Не пойму, ведь IgnoringCase означет «игнорить регистр», где ж тут учет того самого регистра?
+1
Каждый программист должен написать библиотеку/обёртку для работы со строками)
+6
Кстати говоря, с версии C# 4.0 он позволяет именовать аргументы при вызове. Можно сделать, например, такой метод, и будет ничуть не менее читаемо:\
var str = "hello world";
var res = str.Replace(
from: "hello",
to: "goodbye",
ignoreCase: true
);
+2
Омайгадбл!
на каждый возможный вариант действия Insert свой отдельный класс (метод Remove — еще больше)?!!!
github.com/MSayfullin/FluentStrings/tree/master/FluentStrings/Actions/Insert/Auxiliary
на каждый возможный вариант действия Insert свой отдельный класс (метод Remove — еще больше)?!!!
github.com/MSayfullin/FluentStrings/tree/master/FluentStrings/Actions/Insert/Auxiliary
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Элегантные строки