Pracuję z ogromnymi strunami, które wymagają dużo manipulacji.
Na przykład mogę wygenerować taki ciąg:
Część 1
ŁódźSekcja A
ProgramowanieCzęść 2
Partycjonowanie łodzi do programowania.Sekcja AA
Sekcja Wpisy SQL.
Ciąg byłby zbyt duży, aby ręcznie sprawdzić każdą jego część. Teraz muszę split
to string
podzielić na stringlist
sekcje i części. Mogę wymyślić dwie opcje:
Wyrażenie regularne:
QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));
Wygląda na to, że powinno działać, ale czasami zdarzają się wyjątki (IE: Section SQL Entries
błędnie się podzieli)
W przeciwnym razie mogłem umieścić znacznik podczas generowania ciągu początkowego:
🚤💻 Część 1
łódź🚤💻Sekcja
Programowanie🚤💻 Część 2
Partycjonowanie łodzi do programowania.🚤💻
Sekcja AA Wpisy SQL sekcji.
Co oznacza, że podział łańcucha stanie się łatwy:
QStringList sl = s.split("🚤💻"));
Coś mi jednak mówi, że żadne z nich nie jest dobrym stylem ani praktyką programowania, ale do tej pory nie dyskutowałem o tym ani nie znalazłem alternatywy.
- Gdybyś był moim kierownikiem projektu, czy zaakceptowałbyś którąś z tych metod?
- Jeśli nie, co sugerujesz, żebym zrobił jako najlepszą praktykę?
Odpowiedzi:
Kodowanie dokumentów osadzonych jako tekst w ciągu nie jest złą praktyką. Pomyśl o przecenach, HTML, XML, JSON, YAML, LaTeX itp.
Złą praktyką jest odkrywanie koła na nowo. Zamiast pisać własny procesor tekstu, zastanów się nad użyciem istniejącego standardu. Jest mnóstwo darmowego oprogramowania, które wykonuje wiele analiz dla Ciebie, a wiele z nich ma nieograniczoną licencję, która pozwala ci używać tego oprogramowania we własnym oprogramowaniu.
źródło
Użycie jakiegoś wspólnego separatora powinno działać dobrze podczas dzielenia większych dowolnych ciągów, ale odradzam używanie dowolnego symbolu. Ktoś czytający ten ciąg jako zwykły tekst mógłby zostać pomylony, nie wspominając o problemach z UTF i tym, czy symbol pojawia się wewnątrz sekcji, czy nie.
Najważniejszą częścią tego jest to, że każda sekcja pozostaje nienaruszona, a każdy „nagłówek sekcji” musi być odpowiednio zidentyfikowany.
Dlaczego nie zastosować wspólnego separatora, ale zachować jego czytelność? Coś jak:
Problemem jest decyzja, jaki powinien być separator , ponieważ musi to być coś, co gwarantuje, że nie pokaże żadnej sekcji. Możesz dodatkowo zidentyfikować go jako separator , wymagając, aby znajdował się on na początku linii i jedynym tekstem w tej linii .
Bez dalszej wiedzy o tym, jakiego tekstu oczekuje się w każdej sekcji, trudno jest zalecić, który wspólny separator byłby najlepszy w tym przypadku.
źródło
Wydaje się, że w zaakceptowanej odpowiedzi pominięto to, co napisałeś w komentarzu:
i podał to jako przykład:
Jeśli tego właśnie chcesz, IMHO jest naprawdę złym pomysłem, aby użyć „znacznika” lub separatora tekstowego dla całego łańcucha, zawsze wiąże się to z pewnym ryzykiem zakłócenia manipulacji i nie doprowadzi do powstania solidnego kodu. Zwłaszcza, gdy próbujesz zacząć używać wyrażeń regularnych na tak połączonym łańcuchu, prawdopodobnie napotkasz te same problemy, które ludzie zauważyli podczas próby przetworzenia HTLM lub XML z wyrażeniami regularnymi .
Zwłaszcza, że napisałeś, że mogą istnieć „tysiące funkcji [takich manipulacji]”, ryzyko to może stać się prawdziwym problemem. Nawet jeśli korzystasz z niektórych znaczników, takich jak XML, do wewnętrznego przechowywania listy ciągów, musisz upewnić się, że manipulacja przetworzy tylko treść, a nie przecenę, więc oznaczałoby to podzielenie łańcucha na części przed wykonaniem jakiegokolwiek przetwarzania i dołączenie potem znowu - tak, że będzie to miało wysokie ryzyko, że zapewni ci słabą wydajność.
Lepszą alternatywą projektową jest tutaj zapewnienie abstrakcyjnego typu danych (użyj klasy, jeśli chcesz), wywołanie go
MyStringList
i zapewnienie niewielkiego zestawu podstawowych operacji, które pozwalają zaimplementować „tysiące funkcji” pod względem tych operacji. Na przykład mogą istnieć operacje ogólnefind
ireplace
operacje lub ogólnemap
operacje funkcjonalne . Możesz także dodać coś takiego jakJoinToString
operację, jeśli naprawdę potrzebujesz całej listy w jednym ciągu dla niektórych purporów.Dzięki tym operacjom obawa, że kod stanie się bardziej skomplikowany, ponieważ „wszystko musiałoby być zrobione w pętli for”, staje się bezcelowa, ponieważ jedyne dostępne
for
pętle są zawarte w operacjach typu danych. I nie martwiłbym się wydajnością, dopóki nie wywrzesz rzeczywistego, mierzalnego wpływu na wydajność (co wątpię, jeśli uzyskasz, jeśli poprawnie zaimplementujesz podstawowe operacje).źródło
<
i>
, i pobierze każdą instancję tego ciągu, w której mogę łatwo usunąć instancje, których nie chcę, i czysto manipulować nim tak, jak chcę. Jest to dobre, ponieważ same wyrażenia regularne nie obsługują takich podciągów:<boat <programming>>
dobrze tam, gdzie jest wiele warstw nawiasów.Opisany format jest bardzo podobny do plików INI:
https://en.wikipedia.org/wiki/INI_file
W takim przypadku sekcja jest otoczona nawiasami kwadratowymi [], więc to, co opisujesz, ma sens, zaznaczając sekcję w jakiś sposób, aby dodać dodatkowe znaczenie do tego tekstu.
źródło
Pytanie: Z czego „generujesz” ten ciąg?
Czy to będzie łatwiej manipulować?
źródło
LaTeX
doSSML
tłumacza, a jednym z problemów jest to, że możesz generować identyczne obrazy z zupełnie innym kodem, a więc jest prawie niemożliwe, aby być spójnym, jeśli użytkownik wybierze słabe lub ezoteryczne sposoby generowania swoich formuł. Wszystko to oznacza na koniec, że ludzie, którzy nie stosują dobrych praktyk, nie będą mieli przyzwoitej interpretacji swoich skryptów.