Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
В продолжение petrav-ских топиков о строках.

Я просмотрел немало своего кода и нашел следующее.

Top 5 использований. Безотносительно языка программирования. А просто. По смыслу.

1) Декларация строкового литерала и объявление переменной.

url = "http://hello.com/service/v2/add";


2) Конкатенация двух и более строковых переменных или литератов.
prop = "com.organization." + env + ".propName";


3) Проверка на равенство двух строк.
if (userName == "mayton") {...}


4) Проверка строку на пустоту или не-пустоту и не null
if (str != null) {...}

if (isBlank(str)) {...}

5) Работа с билдером. Накопление каких-то результатов в строке. По сути работа с строкой
как с мини-текстовым файлом.

for(i,....) {
   report += processDataRow(i, ...);
}


Данные топ 5 использований. Покрывают более чем 80% всего строкового.

Все остальные юзкейсы как то:
1) Поиск подстроки по номерам start-end index, поиск вхождения по точному совадению.
2) Поиск префикса (startWidth("http://")
3) Поиск суффикса (endWith(".xml")
4) Матчинг на регулярку.
5) Взятие символа по номеру.
6) Проверка на длину строки length == ? (например проверить что номер счета состоит из нужного числа цифр).
7) Проверка на равенство CASE-insensitive. Компаратор. Проверка старшинства строк. В разных collations.
8) Использование строки внутри printf, logging e.t.c. Интерполяция средствами логгера или С++подобного printf.
9) Реплейсмент 1 символа или строки в другой строке на что-то.
"".replace("&","&");
10) Различные варианты парсинга строки как текстового файла при условии что внутри лежит Xml или Json. Парсинг строки в число.



Прошу коллег тоже по возможности - посчитайте в прикладном коде как вы используете строки.

Точный подсчет не нужен. Можно приблизительно.

Сообщение было отредактировано: 31 июл 20, 20:57
31 июл 20, 16:59    [22176330]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки.  [new]
exp98
Member

Откуда:
Сообщений: 2436
Без файлов уже не сочту. Вопросики для уточнения.
-Есть ЯП и есть СУБД.
-Как я понимаю, ORDER BY это п.7 ?

Теперь что именно считать?
Так-то у меня в сишных проектах всё это было кроме регулярок.
Наверное по совокупности языков п.2+5 наибольший %.

Особенно если s= "select 5 from dual ORDER BY" и т.п. Для них же п.1) + редко в клиенте, хотя s="" примерно столько же, как п.2+5.
В это случае ORDER BY учитывать как п.7?

п.3+4)Проверки пустоты часто, но реже п.2+5.

А если непосредственно команда select 5 from dual ORDER BY ?

Как учесть случай последних сишных проектов? Куча файлов практически в каждой функции/методе логирование шаблоном (т.е. в явном виде п.2+8 или +5).

Выходит, что п.2+8 лидируют.
Два аутсайдера:
п.4 регулярки были пару раз только в select 5 from dual
п.10 парсинг Xml и Json пару раз

Сообщение было отредактировано: 31 июл 20, 19:21
31 июл 20, 19:20    [22176393]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки.  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
Думаю об архитектуре строк. Просто ты не поймешь пока не прочитаешь все что было здесь

https://www.sql.ru/forum/1327569/vychislenie-dliny-utf-8-stroki-v-compile-time
https://www.sql.ru/forum/764692/qstring-qobject-tr-unicode-etc
https://www.sql.ru/forum/1327581/printf-utf8-vyravnivanie-po-shirine
https://www.sql.ru/forum/1319689/msvc-i-gcc-sovmestimost-kodirovok-ishodnikov
31 июл 20, 19:44    [22176400]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Dima T
Member

Откуда:
Сообщений: 14878
Относительно ЯП надо смотреть, т.к. в фокспро
userName = "mayton from sql.ru"
if (userName = "mayton") // true
if (userName == "mayton") // false

в PHP
userName = "mayton from sql.ru"
if (userName == "mayton") // true
if (userName === "mayton") // false
31 июл 20, 21:06    [22176420]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Dima T
Member

Откуда:
Сообщений: 14878
В .Net есть куча вариаций правил сравнения CompareOptions
31 июл 20, 21:10    [22176421]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1353
В последних проектах конкатенацию пишу не так:
"blabla" + var + "blabla"

а через методы прослойки или интерполяцию (если позволительно) в угоду читабельности. Но это не правило, всё зависит от того, будет ли хорошо читаться код
String.Format("bla bla {0} blabla", var)


а так, топ 5 примерно такой же
31 июл 20, 21:25    [22176422]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Dima T
Member

Откуда:
Сообщений: 14878
VSVLAD
String.Format("bla bla {0} blabla", var)

В .Net уже давно можно так писать
$"bla bla {var} blabla"
31 июл 20, 21:29    [22176424]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1353
Dima T,

Я и написал "если позволительно", в двух проектах используется CodeDomProvider для динамической компиляции и там интерполяция не работает, как и много других плюшек в последних версиях языков (c#/vb)
31 июл 20, 21:58    [22176428]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1353
такое же ограничение есть в ASP.NET, если не использовать компилятор Roslyn
31 июл 20, 22:00    [22176429]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
Я позволю себе тезисно описать как я вижу универсальный string-тип
который будет экономен и рационален и будет покрывать сразу все
потребности в языках мира.

Чтоб различать - буду использовать обозначение UString (ustring). Типа
Universal String.

1) UString - представляет собой универсальный обобщенный
строковый тип языков программирования будущего.

2) UString - предоставляет интерфейс доступа к последовательности
(sequence) универсальных поли-алфавитных символов (CodePoints).
В настоящее время из таковых известно и стандартизировано порядка
1 100 000 (один миллион сто тысяч приблизительно) кодовых точек.

3) UString - поддерживает стандартные инициализации из
строковых литералов. И инициализации произвольного символа
по Unicode

Пример греческой заглавной буквы Омега.

"${Greek Capital Letter Omega}"


4) UString - определяет форму представления строк. Но не хранения.
Хранение - может иметь много алгоритмических реализаций. Может
быть платформо-зависимым. Или внешним. И иметь десятки
и сотни программных представлений. UString - не сущность а программный
интерфейс доступа к последовательности CodePoints.

5) UString - ленивый. И выполняет вычисления над строками
только по требованию. UString можно инициализировать из текстовоо
файла с произвольной кодировкой. Пример:

s1 = "This is initialized from literal";
s2 = UString(fromFile("~/textFile.txt",WIN1251), UStringHint::Lazy);


В данном примере чтение файла произойдет только во время доступа
к строке s2.

6) UString - иммутабельный.

7) UString - обеспечивает констатное время операций для
- проверки на пустоту
- конкатенацию (это обсуждается)

UString s4 = s3 + s2;

В данном случае s4 имеет имплементацию цепочки стримов (Chain of Streams).

Инициализация строки - не всегда константная - но быстрая настолько
насколько эт возможно.

8) UString - не обязательно хранит строку. Он может быть генератором
последовательности (random generator) по произвольному алгоритму.
Таким образом длина представляемой строки может быть не определена.
UString может представлять канальное устройство (Pipeline) или
устройство ввода (STDIN).

9) UString - не просто иницилизируется из текстового файла. Он
представляет текстовый файл.

10) UString - позволяет программисту создавать свои собственные
реализации хранения. Пример.

- ExternalGZippedTextFileUString
- ExternalWin32EncodedTextFileUString
- OSNativeUString
- TemporarySpaceHugeUString
- RandomGenerateUString

11) Интерфейс использования
- Базовый (представляет собой интерфейс потока кодовых точек)
interface UStingBasic {
   bool isInfinite();
   Stream<CodePoint> createStream();
}


- Расширенный - включает в себя все остальные методы. В том числе
операции индексации и взятия под-строки и матчинг на регулярки и прочее.

Базовый - обязателен к имплементации. Расширенный - имеет дефолтные
реализации опирающиеся на базовый.

12) Расширенный - может иметь оптимизации. Как-то индексирование
номеров CodePoints в строке.

Пример использования. Если кому-то нужен o(1) доступ к нужному символу.

UString s5 = UString(s4, UStringHint::indexed);


Но таковых практик применения - не очень много. (Это важно. Это - отсылка к моbему
первому сообщению в топике).

13) UString имеет готовый к использованию билдер для генерации
текстовых отчотов или просто длинных строк.
UStringBuilder в любой момент может фабрично создать UString. После
этого работа билдера завершается деструкцией.

Вот такие тезисы.

А теперь я готов заслушать ваши вопросы.
31 июл 20, 23:34    [22176437]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1491
mayton
А теперь я готов заслушать ваши вопросы.

Где ссылка на гитхаб?
1 авг 20, 06:24    [22176468]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
Это просто идея.
1 авг 20, 08:19    [22176474]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1491
mayton
Это просто идея.

Ну и хорошо. Гитхаб с проектом строки для плюсов, которая устроит всех.
1 авг 20, 09:24    [22176481]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
Почему плюсов?
1 авг 20, 10:18    [22176487]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10412
mayton
4) UString - определяет форму представления строк. Но не хранения.
1. Непонятно, чем первое отличается от второго;
2. Если этот (странный) пункт то, о чём я думаю - сразу в топку: я понимаю, каким образом можно встраивать в "прикладные" протоколы интернета UTF-8, но даже думать не хочу про тот ад, который возникает из желания угодить и нашим и вашим.
1 авг 20, 10:43    [22176489]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8757
А где тут строка?

8) UString - не обязательно хранит строку. Он может быть генератором
последовательности (random generator) по произвольному алгоритму.
Таким образом длина представляемой строки может быть не определена.
UString может представлять канальное устройство (Pipeline) или
устройство ввода (STDIN).

Instr'ы, Substr'ы пошли лесом ?

Вы что то больно умное придумали, обычные программисты Вас не поймут
1 авг 20, 11:03    [22176497]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
Давайте искать точки соприкосновения.
Лев Николаевич говорил - истина рождается в спорах.

Топик просто возник как антагонизм или переосмысление топиков петрава.

Топик-концепт. Топик-идея. Я даже не говорю что я прав. Я просто предлагаю концепт строки будущего.
1 авг 20, 11:20    [22176499]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8757
mayton
Я просто предлагаю концепт строки будущего.

Как я понимаю, у Вас не строка в классическом виде, а нечто наподобие Stream.

Строка без length, instr, substr - как-то не привычно
Так же не очень понятно, как на stream реализовывать trim, ltrim, rtrim

Сообщение было отредактировано: 1 авг 20, 11:43
1 авг 20, 11:45    [22176502]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1491
Leonid Kudryavtsev,

Она не без length. Он там есть, просто он ленивый. Пока он явно не понадобится никто дёргать стрим не будет. Как только понадобится, стрим начнёт вчитываться, а генератор работать.
1 авг 20, 12:39    [22176507]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Алексей Роза
Member

Откуда: РФ
Сообщений: 556
Dima T
в PHP
userName = "mayton from sql.ru"
if (userName == "mayton") // true
if (userName === "mayton") // false

нет там такого. false в обоих случаях.
Leonid Kudryavtsev
Так же не очень понятно, как на stream реализовывать trim, ltrim, rtrim

интересно, есть какая-то специальная причина, почему trim не попал в C++ string?
1 авг 20, 14:21    [22176533]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
exp98
Member

Откуда:
Сообщений: 2436
mayton, я не теоретик программирования.
К п.1) пока вопросов нет.
автор
9) UString - не просто иницилизируется из текстового файла. Он
представляет текстовый файл.
Как именно он представляет? типа по требованию+seek(туда-сюда) ? substr(.....)= "" что делает при этом с файлом? со строковым буфером? ну и другие операции над строкой

И конечно противно писать в проге: &(Кот-Д'Вуарские острова и Японские гренадины, &(Русская, UnicodeString(Ять))), но это уже мелочи.
1 авг 20, 14:50    [22176537]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
exp98
Как именно он представляет? типа по требованию+seek(туда-сюда) ? substr(.....)= "" что делает при этом с файлом? со строковым буфером? ну и другие операции над строкой

Туда-сюда не надо. Достаточно в одну сторону. Только туда. Примерно как мы работаем
с STDIN. Нам же его достаточно чтоб взять текстовый входящий аргумент?

Сообщение было отредактировано: 1 авг 20, 16:48
1 авг 20, 16:51    [22176547]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
Leonid Kudryavtsev
mayton
Я просто предлагаю концепт строки будущего.

Как я понимаю, у Вас не строка в классическом виде, а нечто наподобие Stream.

Строка без length, instr, substr - как-то не привычно
Так же не очень понятно, как на stream реализовывать trim, ltrim, rtrim

Я опираюсь просто на свои наблюдения о том как мы работаем со строками вообще.
Сам по себе интерфейс символьного массива нам не часто то и нужен.

Если нам нужно напечатать строку на экране - то Stream<CodePoint> достаточно.
Сравнить две строки на равенство - тоже самое. Потока достаточно.

Операции где мы делаем физически trim конечно же существуют. И я не против
их использования. Но они не так часты например как Базовый интерфейс
(введем обозначение IUStringBasic). Более того. Безотносительно хранения в виде
Stream или char[], вы так или иначе - конструируете новую строку на каждый trim.

Поэтому производительность надо рассматривать в совокупности.
1 авг 20, 16:59    [22176550]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10412
mayton
Если нам нужно напечатать строку на экране - то Stream<CodePoint> достаточно.
Недостаточно.
Лично меня уже задолбали различия терминалов в разных ситуациях: nano - так, vi(m) - сяк, screen - ещё как-нибудь.
1 авг 20, 19:44    [22176582]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
То что я предлагаю - ортогонально к терминалам. По сути

int puts(const char *str)


я предлагаю заменить на

int puts(Stream<CodePoint> str);


и я утверждаю что мы особо ничего не теряем при этом. Если мы теряли что-то раньше (уже) то
этот кейс надо рассмотреть отдельно ибо непонятно что надо фиксить.
1 авг 20, 19:53    [22176585]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10412
mayton
По сути
int puts(const char *str)
я предлагаю заменить на
int puts(Stream<CodePoint> str);
и я утверждаю что мы особо ничего не теряем при этом.
Да, не теряем.
Вопрос в другом. А что, собственно, мы приобрели?
Ну вот кроме необходимости создать новый рантайм, перекомпилировать кучу софта и вот этого всего?
1 авг 20, 20:25    [22176589]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 47946
Мы разделяем хранение и представление строк.

Мы приобретаем единый API для различных условий. Господин petrav сможет хранить байты в Win1251
если ему будет угодно. Таким образом его технический зуд будет удовлетворён в полной мере.
Я получу свои желанные генераторы и врапперы для потоковых источников данных (файлов).

И сама форма хранения - всего лишь технический хинт. Можете использовать если ищете экономию.
Или можете брать дефолтную реализацию (OSDepended) которая будет просто максимально
близка к API текущей ОС.

Операции trim, charAt, [], substr, endWith, e.t.c. представляющие собой ExtedndedAPI
будут доступны как дополнительная опция. Они полезны в менее чем 20% юзкейсов
(по Паретто) и я пока отстаиваю имено такую оценку. Никто еще не убедил в обратном.
1 авг 20, 22:53    [22176612]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничное беспокойство по юзкейсам строки  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10412
mayton
Или можете брать дефолтную реализацию (OSDepended) которая будет просто максимально близка к API текущей ОС.
Не работает. Как только возникает сетевое взаимодействие - появится и "сетевой порядок", а никакое не "OS depend".
2 авг 20, 07:48    [22176637]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Программирование Ответить