- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
/**
* Interface for string cleaners. Defines method that takes a string to perform cleaning and returns
* cleaned string.
*
* @author Король Абстракций.
* @version 1.0 29.04.2011
*
*/
public interface StringCleaner {
//---------------------------------------------------------------------------------------------
/**
* Cleans given string. Returns cleaned string.
* @param string String to clean
* @return Cleaned string
* @throws NullPointerException <code>If string == null</code>
* @since 1.0
*/
public String clean(String string);
//---------------------------------------------------------------------------------------------
}
// Далее реализации.
public abstract class SymbolStringCleaner implements StringCleaner { ... }
public final class AllSymbolStringCleaner extends SymbolStringCleaner { ... }
public final class RepeatedSymbolStringCleaner extends SymbolStringCleaner { ... }
public class TrimStringCleaner extends SymbolStringCleaner { ... }
public final class CombinedStringCleaner implements StringCleaner { ... }
// Пример использования.
public class StringCleanerFactory {
private static final char END_OF_LINE_SYMBOL = '\n';
public static synchronized StringCleaner createCommonStringCleaner() {
char[] symbolsToExclude = new char[] {' ', END_OF_LINE_SYMBOL};
StringCleaner repeatedSymbolsCleaner = new RepeatedSymbolStringCleaner(symbolsToExclude);
StringCleaner trimCleaner = new TrimStringCleaner(symbolsToExclude, true, true);
CombinedStringCleaner resultCleaner = new CombinedStringCleaner();
resultCleaner.add(repeatedSymbolsCleaner);
resultCleaner.add(trimCleaner);
return resultCleaner;
}
}
// В реале выходит что-то вроде
return str.trim().replace(" \n", '');
Очистка строк огнем инквизиции еше никогда не была настолько абстрактной.
P.S.
Я удалял этот StringCleaner API 3 раза, и каждый раз наши адепты стринг клинеров под любым
предлогом поднимали это г***о из анналов ада (svn history). Последний раз я сдался и этот
ёжик теперь живет с нами.
guest 21.10.2011 05:53 # +11
absolut 21.10.2011 10:07 # +4
roman-kashitsyn 21.10.2011 09:21 # +1
Оверинжениринг во всей красе...
3.14159265 21.10.2011 11:46 # +2
roman-kashitsyn 21.10.2011 09:33 # 0
1. Массив symbolsToExclude всегда содержит одинаковые элементы, зачем его каждый раз пересоздавать?
2. Зачем synchronized? нет же обращения к глобальным мутабельным переменным...
Dummy00001 21.10.2011 19:53 # +2
2. а вдруг авторы захотят распаралелить чистку строк? строки чистить это вам не шнурки гладить!
Uhehesh 21.10.2011 22:00 # 0
И вообще, я за чистый код.
Каждый класс должен быть вычищен.
enikey 07.10.2021 02:01 # 0
guest 21.10.2011 10:09 # +1
guest 21.10.2011 10:10 # +3
guest 21.10.2011 11:23 # −2
Автор темы утверждает, что очистить строку от мусора можно применением пары методов класса String. Но это не всегда так.
Пример1. Дана строка " \n \n some\n string \n". На выходе мы хотим получить строку "some\nstring" (то есть убрать незначащие символы по краям и оставить по одному разделителю между словами). trim() даст нам только "\n \n some\n string \n". Далее, в String, существующем в BlackBerry, есть только один метод replace:
public String replace(char oldChar, char newChar)
Если честно, я не понимаю, как с помощью этого метода можно получить "some\nstring" из "\n \n some\n string \n" (как предлагает нам автор темы).
Пример 2. Ещё проще, дана строка "some string". Стандартным методом BlackBerry String получить из этой строки "some string" невозможно, придётся писать хоть и простой, но алгоритм. А StringCleaner сделает это легко.
Применение комбинированного StringCleaner делает концепцию гибкой и расширяемой.
Таким образом, автор темы не сумел оценить концепцию StringCleaner и объять спектр предоставляемых возможностей.
P. S.: На мой взгляд, не стоит называть г-ном всё, чего не понимаешь.
SmackMyBitchUp 21.10.2011 11:46 # 0
while(SomeString.contains(" ")) //два пробела
a = a.replaceAll(" ", " "); //заменяем два пробела на один
return a.trim();
3.14159265 21.10.2011 11:57 # +5
Nemoden 21.10.2011 13:09 # 0
> String, существующий в BlackBerry
Гуест, ты бухой чтоли? Не подскажешь, а в винде какие стринги существуют?
roman-kashitsyn 21.10.2011 13:15 # +1
The truth is that there is no spoon string.
rat4 21.10.2011 13:59 # +1
enikey 21.10.2011 13:46 # −1
P.S.
Гавно или не гавно решат зрители. +1 за гавно. ведь это гавнокод правильно?
SmackMyBitchUp 21.10.2011 13:52 # 0
ораторег в треде
enikey 21.10.2011 17:14 # 0
Ибо я боюсь что подобные "шедевры" ООП архитектуры (предоставляющие необъятный спектр предоставляемых возможностей) расплодятся и от количества гавна проект выйдет из под контроля и в один прекрасный момент рухнет как карточный домик.
P.S.
По моим догадкам САМ КОРОЛЬ АБСТРАКЦИЙ написал этот код под воздействием книги GOF Шаблоны Проектирования и применил здесь сразу: Фабрику, Стратегию, Комбинатор и благодаря этому они его восхваляют. Просто идеальное сочетание задачи и изящного архетиктурного решения.
Простите, наболело.
3.14159265 21.10.2011 17:19 # 0
Так комментарии для этого и созданы.
http://www.phppatterns.com/docs/design/hello_world_in_patterns
enikey 21.10.2011 17:25 # 0
guest 21.10.2011 11:53 # 0
guest 21.10.2011 11:56 # 0
Правда она не столь академически развесиста :)
guest 21.10.2011 12:05 # 0
guest 21.10.2011 12:06 # +1
guest 21.10.2011 12:13 # +6
Любой из этих клинеров можно заменить одним методом. Почему-то в библиотеке Java так и сделали. CombinedStringCleaner заменяется последовательным вызовом clean методов. Что получаем?
1) Не плодиться 100500 классов.
2) В коде, очищающем строку сразу понятно как именно очистилась строка. Там нет интерфейса StringCleaner, возвращенного абстрактной фабрикой, который не понятно что делает.
По аналогии со StringCleaner мне захотелось создать класс IntCalculator, который выполняет некоторую операцию на двумя int. Сделать подклассы IntAdd, IndSub, IntDiv, CombinedIntCalc и тд. Как тогда мы запишем 2 + 3 / 2 ?
3.14159265 21.10.2011 12:15 # +5
Нет. Ну Вы подумайте о
>необъятном спектре предоставляемых возможностей.
/r Тараса
enikey 21.10.2011 17:37 # −2
tir 21.10.2011 12:30 # 0
Но в целом полностью согласен.
guest 21.10.2011 12:43 # +1
Работает представленное? Да и член с ним.
Насчет IntCalculator - все можно довести до абсурда. И к слову в жабе без автобоксинга (то самое ББ кстати) сложение Integer так и рассирается потому как там "+" так просто не напишешь для Integer, Long и т.д..
dixi
enikey 23.10.2011 06:25 # 0
guest 21.10.2011 13:41 # −1
1) Десяток дополнительных классов в отдельном пакете меня не смущает: написал, отладил - и забыл про них.
2) Стараюсь придерживаться принципа минимизации мышления. На определённом уровне абстракции мне достаточно того, что строка очищается, в этот момент я не хочу задумываться о том, как именно это происходит.
enikey 21.10.2011 17:17 # −1
enikey 21.10.2011 17:15 # −1
enikey 21.10.2011 13:42 # 0
guest 21.10.2011 13:46 # −4
SmackMyBitchUp 21.10.2011 13:52 # +1
наверное
absolut 21.10.2011 13:53 # 0
tir 21.10.2011 14:08 # 0
tir 21.10.2011 14:34 # +1
Простите за форматирование, делал покороче =)
roman-kashitsyn 21.10.2011 14:44 # 0
а ещё StringTransformer можно было бы заменить на Function<String, String>, особенно, если используется Google Guava
3.14159265 21.10.2011 15:04 # 0
И не писал бы свои велосипеды.
К тому же там есть этот ваш флюент-интерфейс.
tir 21.10.2011 15:13 # 0
3.14159265 21.10.2011 15:41 # 0
A StrBuilder - это их альтернатива. Выше по треду речь шла о резаных нативных классах.
class Example - ессно велосипед, но собран он хорошо.
guest 21.10.2011 15:13 # 0
Осталось только реализовать normalizeWhitespaces. Правда normalizeWhitespaces нужен не так уж часто.
Слава велосипедам!
tir 21.10.2011 15:16 # 0
enikey 21.10.2011 17:39 # −8
SmackMyBitchUp 21.10.2011 19:00 # 0
enikey 21.10.2011 19:18 # −4
guest 21.10.2011 20:00 # +3
enikey 22.10.2011 07:46 # 0
istem 21.10.2011 20:23 # +2
Я так понимаю, просто вы не в состоянии довести мозг до такой степени аноксической асфиксии, чтобы получить ТАКИЕ строки которыми пользовались ваши Адепты
enikey 22.10.2011 07:47 # 0
bugmenot 22.10.2011 18:39 # +1
wvxvw 22.10.2011 16:47 # +2
rat4 22.10.2011 18:25 # +1
guest 22.10.2011 19:18 # +3
rat4 22.10.2011 19:33 # 0
enikey 23.10.2011 05:14 # 0
rat4 23.10.2011 08:37 # 0
Но зачем? Это работает через конвеер:
guest8 09.04.2019 11:47 # −999