За последние 24 часа нас посетил 22781 программист и 1291 робот. Сейчас ищут 652 программиста ...

удобная работа со строками [решение, рассуждение]

Тема в разделе "Решения, алгоритмы", создана пользователем Koc, 6 июн 2009.

  1. kostyl

    kostyl Guest

    Koc
    Ну как бы у меня задачи класса другие...
    Ну не спорю - красиво, только вот я нигде на увидел
    Код (Text):
    1.  
    2. ini_get('mbstring.func_overload')
    и/или
    Код (Text):
    1.  
    2. function_exists('mb_substr')
    А я про это говорил.
     
  2. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    немного оптимизировал главный класс

    trim теперь поддерживает массив:
    PHP:
    1. <?php
    2. $array = array('строка   ', array('  еще строка ', "\t строка с табуляцией\r\n"));
    3. var_dump(Str::trim($array));
    4.  
    добавлены алиасы с возможно более осмысленными названиями:
    Str::take -> Str::str
    Str::find -> Str::pos
    Str::reverse -> Str::rev

    возможно в будущем rev, pos, str будут удалены, а останутся вот эти осмысленные (?) названия методов.
     
  4. kostyl

    kostyl Guest

    Ну ладно уговорил, не буду больше приставать.
     
  5. mantell

    mantell Активный пользователь

    С нами с:
    7 окт 2008
    Сообщения:
    125
    Симпатии:
    1
    Тысячу лет сюда не заходил. Тему прочитал с удовольствием.

    Интересно было бы увидеть отдельный класс для работы с массивами строк - аналог дотнетовского List<string> или TStringList делфи. имхо был бы небесполезен.
     
  6. kostyl

    kostyl Guest

    чё приколист? это же елементарные операции - в массив строки записать. Да в делфи на это уходит много кода, а вот на PHP это элементарно Ватсон.
     
  7. mantell

    mantell Активный пользователь

    С нами с:
    7 окт 2008
    Сообщения:
    125
    Симпатии:
    1
    Зачем переделывать функцию strlen() или trim() - это же элементарные функции? Однако написали отдельный метод length() и правильно сделали. Нахер мне в массив строки записывать? Я хочу работать массивом строк с удобной обёрткой, с удобными и понятными методами и свойствами.
     
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    рад что понравилось.

    Ну эта, вот trim уже воспринимает массивы. Скоро будет filter, тоже с поддержкой массивов.

    Кстати, чего в этом фильтре быть должно? хочу объединить все эти add/strip-slashes-cslashes-спецсимволы (&, ", ', < ...), теги ...



    kostyl
    почему sString а не просто string? у тя ж есть PHPDoc а норм IDE его схавает и покажет.
     
  9. kostyl

    kostyl Guest

    Это безжалостная смесь привычек:
    - все переменные с большой буквы (Delphi)
    - указывать тип перед переменной (скорее всего VisualFoxPro - когдато долго сидел)
    Ну как бы мне больше понятен древний код ну и не напрягает особо такой стиль, я привык и все тут ;)
     
  10. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    С#, Java
    Регламент Java-кодинга:

    C# (/ Java):
    Код (Text):
    1. String MyStringVariable = new StringBuilder("Hello, World");
    c
    Код (Text):
    1. char *str;
    2. int function_name(floar argument) {
    3.     // ...
    4. }
    C#
    Код (Text):
    1. int Function(string Arg)
    2. {
    3.     return Arg;
    4. }
    Формат диктуют дяди с большими яйцами - Microsoft & Sun
     
  11. kostyl

    kostyl Guest

    Apple
    Мне пофиг эти дяди. Я считаю понятней назвать переменну с большой буквы, и понятнее назвать метод не getAvgCrash(), а GetAvgCrash() и передать туда $iStrength и $sMessage, тогда не надо запоминать из doc-ов при рефакторинге метода, какие какаие там переменные используются, все происходит намного быстрее...
     
  12. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Это называется "Венгерская нотация". Я считаю ее неудобной. И лично мое наблюдение, что большинство программистов тоже считают ее неудобной.

    Вопрос - а какой ты префикс ставишь переменной, если не знаешь, какого она будет типа? Например, $var = preg_match('/^def/', "abcdef"); где может вернутся, что bool, что int?
     
  13. kostyl

    kostyl Guest

    Ну это не совсем Венгерская, это ее часть. Она иногда удобна в динамически типизированных языках. Для меня удобна такая форма.
    Ответ очевиден - никакой. Перед объектами тоже ничего не ставлю. Это все дело вкуса, удобства и привычки.
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    http://code.google.com/p/strclass/source/list

    константа FIRST теперь LEFT (ф-ция find), LAST - RIGHT. Это логично имхо.
    Добавил режим COUNT для find - возвращает кол-во вхождений. Не поддерживает массивы!. Я не знаю как сделать поддержку их: возвращать общее кол-во вхождений всех элементов или массивом по каждому?
    Добавлена ф-ция фильтр - но какая-то она говеная. Советуйте
    Добавил ф-цию hash. Имхо над ней тоже следует поработать.



    Внимание вопрос: поцчему в интерфейсе есть метод
    public static function filter($string, $mode);
    а в абстрактном классе
    public static function filter($string, $mode, $params = null)

    Этот абстрактный класс потом используют Str, StrA и StrU. Это я к тому, что можно ль как-то избавиться от дефолтовых переменных везде? Оставить их только в базовом классе Str
     
  15. mantell

    mantell Активный пользователь

    С нами с:
    7 окт 2008
    Сообщения:
    125
    Симпатии:
    1
    Добавь необязательный аргумент. По умолчанию - массивом. Мне так было бы удобнее.
     
  16. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  18. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  19. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    http://ua.php.net/manual/ru/function.hash-algos.php

    Но я вообще-то думал, будет чтото типа:
    Hash::md5($str);
    с реализацией для php < 5.1.2 тех функций, которых нету на пыхе :) например, sha2. Наверняка, в инете есть где-то.
     
  20. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    да ну, я уверен, что этот мой класс может и не заработать на < 5.1.2

    посоветуй лучше че делать с фильтром
     
  21. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    А как у тебя обстоят дела с обработкой ошибок?

    Сделай эксепшины. Бывает напишут хороший класс, а про это забудут и приходится еще на каждый такой писать по эксепшинской обертке.

    Как раз только что посмотрел новый встроенный класс DateTime, который полностью будет реализован в PHP5.3. там вот такой код

    PHP:
    1. <?php
    2. $date = new DateTime("188");
    выдал вот такой эксепшен
    никаких варнингов я там не увидел
     
  22. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    alexey_baranov
    я только за. Но какие ошибки могут возникнуть?

    1) отсутствуют mbstring-функции
    2) попадают левые данные вместо констант (как это отлавливать? неужели в каждом методе делать проверки in_array('константа, которая пришла', 'массив разрешенных констант') ?
    3) ...
     
  23. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Сложно сказать. я пока только на уровне идеи про твой класс думаю. И вот на уровне идеи, мне бы хотелось, чтобы он ошибки отдавал в виде исключений, а не нулов, пустых строк и варнингов, выданых встроенными строковыми функциями.
    подумаем над этим еще
     
  24. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Это не проблема:

    PHP:
    1. <?
    2. switch ($type) {
    3.         case self::BOOL:
    4.                 return false;
    5.         case self::LEFT:
    6.                 return (empty($a)) ? false : min($a);
    7.         case self::RIGHT:
    8.                 return (empty($a)) ? false : max($a);
    9.         default:
    10.                 // Опа, левая константа!
    11. }
    12.  
    На счет фильтра. Я не вижу его в StrU, ни в StrA
     
  25. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Стоп. Нашел в StrCommon. Щас подумаемс.