За последние 24 часа нас посетили 18008 программистов и 1673 робота. Сейчас ищут 1109 программистов ...

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

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

  1. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    так а че с подходом? предлагай
     
  2. предлагаю статический обьект, который работает с разными кодировками сам :)
     
  3. Koc

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

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

    upd: добавил trim и мануал к ней
     
  4. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    мне больше нравится идея Шевчука сделать объекты, а не статические функции.
    но статические - тоже хорошо. Хотя сразу скажу одно замечание-предложение.
    Идея заменить огромное количество функций меньшим количеством но с константами - хороша. Чем дальше - тем больше она мне нравится. Но раз уже делаешь статичный класс, то делай уже все связанно, а именно:

    PHP:
    1. <?php
    2. class Str
    3. {
    4.     const AFTER = 1;
    5.     const BEFORE = 2;
    6.     const AFTER_WITH = 3;
    7.     const BEFORE_WITH = 4;
    8.  
    9.     const UP = 5;
    10.     const DOWN = 6;
    11.     const FIRST_UP 7;
    12.     const EACH_FIRST_UP = 8;
    и обращатся к константе как:
    PHP:
    1. <?php
    2. // Сообственно в классе Str
    3. public static function str($what, $where, $type = SELF::AFTER
    4. // Снаружи класса Str
    5. Str::str('s', 'asd, Str::BEFORE);
    Причин и удобств этого - огромное количество:
    1. Ты не загромождаеш глобальное пространство имен (идеологически верно)
    2. У каждого человека есть возможность !одним движением руки! полностью переименовать класс
    3. Ты не попадешь случайно в новую введенную константу PHP
    4. Твоя константа не совпадет с константой пользователя
    5. Выглядит красивее.

    И да, я подумал, может статичный класс даже лучше.
     
  5. TheShock, спасибо. Именно это я и планировал ему предложить.
    Обьекты был бы смысл, если бы стринги были обьектны по сути, т.к. они такого все равно не умеют, просто аккуратная функциональная обертка выглядит несколько логичней.
     
  6. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    флоппик, та не стоит благодарить :)
    возможно. меня, конечно, больше останавливают ограничения пыха.
     
  7. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Вот такое еще предложение, чтобы не дублировать код:
    PHP:
    1. <?
    2. public static function decode64($string, $urlSafe = false)
    3. {
    4.     if ($urlSafe or self::pos(array('-', '_', ','), $string) !== false) {
    5.         return base64_decode(strtr($string, '-_,', '+/='));
    6.     } else {
    7.         return base64_decode($string);
    8.     }
    9. }
    Хотя, если я не ошибаюсь, то тут параметр $urlSafe вообще убрать можно - если в тексте есть символы '-', '_', ',' - strtr и так сработает, если нету - то strtr сработает впустую.

    На счет функции pos - может добавить еще параметр $returnBool, который бы просто возвращал - есть один из символов, или нету. Ибо self::pos чаще всего именно для этого и используется.
     
  8. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    и просто предложение по стилю кодирования. понимаю, что это субъективно, но все-же

    PHP:
    1. <?php
    2. // Подобное
    3. if ($p === false)
    4.     continue;
    5. // Заменить на
    6. if ($p === false) {
    7.     continue;
    8. }
    9.  
    Сам раньше по сокращенному стилю писал, но потом перешел на длинный:
    1. Уменьшается вероятность случайной ошибки
    2. Четко видны границы if-else
    3. Легко добавить еще одну строку в любой из блоков.
     
  9. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    и да
    PHP:
    1.  
    2. <?php
    3. if (str::pos(array(
    4. // Такое лучше тоже заменить на
    5. if (self::pos(array(
    Опять же, чтобы легче было переименовать весь класс одним махом
     
  10. Koc

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

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

    По поводу констант: их же нельзя вроде в интерфейсе размещать? тогда нужно будет мне в каждом класе писать эти самые константы. Или делать класс-родитель

    остальное учту, было б время
     
  11. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    а зачем их в интерфейсе размещать? сколько вы собираетесь делать оберток для строковых функций?
     
  12. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Тоже отмечусь. Хотца, да.

    P.S. И пожелание, не переверать имена функций. Не менять trim(), например, на strip(). Живой пример - caseLetters(). Просто case(). И так ведь очевидно, что letters. Можно назвать changecase.

    P.P.S. TheShock, имя EACH_FIRST_UP это TITLE обычно. В английском по правилам в заголовке или названии следует писать каждое слово с большой буквы. И то и то - не что иное как "title". :)
     
  13. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    GNU General Public License v3 - плохая лицензия, всепоглощающая (как Пакман, да :)). Надо LGPL > 1 - чтобы распространялась в пределах класса, но не лезла на файлы, куда класс будет подключён.
     
  14. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    lexa, не понял обращения ко мне, извини. :)
    имя EACH_FIRST_UP - это константа, именованная по всем правилам именования констант :)
    Мое предложение забрать константы из глобальной убласти видимости и убрать префикс STR_
    С другой стороны я бы некоторые поменял. Например ужасные explode и implode на split и join соответственно (хотя Джоин есть, но он - алиас, а split - это вообще часть устаревшего ерег)
     
  15. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а мне так нравятся название implode-explode.

    case вроде низя, интерпретатор ругается что тут не может быть никакого case. Поэтому caseLetters

    LGPL это для библиотек типа? просвятите.


    Эх, столько всего хочу поизменять а мне на завтра в бурсе много чего сдавать нужно.
     
  16. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ну так case зарезервированное слово switch-case.
     
  17. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Koc
    Логично сделать
    PHP:
    1. <?php
    2. /**
    3. * Change string case
    4. *
    5. * @param int $case Defines to what case to change
    6. * @param string $what String to change
    7. * @return string Returns string changed to specified case
    8. *
    9. */
    10. static function caseTo(int $case, string $what) {}
    11.  
    Логично и удобно. И соответственно 2 константы - self::UPPER, self::LOWER
     
  18. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    кстати, при error_reporting (E_ALL | E_STRICT);
    Код (Text):
    1. Strict Standards: Redefining already defined constructor for class Str in /home/shock/Web/www.phpwr.lh/Engine/Classes/Str.php on line 17
    Строка содержит:
    Код (Text):
    1. public static function str($what, $where, $type = STR_AFTER, $caseSensitive = true, $abortIfNothing = false)
     
  19. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Apple
    да знаю я, знаю) Тем более switch использую в этом классе over 9000.

    TheShock
    оно и понятно. До 5 версии пыха конструктор - эта метод, у которого имя такое же как и у класса. Я поставил заглушку
    PHP:
    1. <?
    2. private function __construct() {}
    3.  
    , у которой якобы приоритет выше и теперь str не считается конструктором. А вот в стркт моде, о котором в пыхе я впервые сейчас узнал всплыло такое... (я сталкивался со стрикт моде в мускле, но не в пыхе).


    так вот. Тут дело в том, что Str::str - это проапгрейдженная strstr, а Str::pos - strpos. Закономерность я думаю видна. Как быть - я х3. Переименовывать класс или метод не хочется как-то.

    у меня 4 режима. И они имхо меняются реже, чем строка, регистр которой приводим. Поэтому строку на 1 место, режимы потом

    такой бок я один раз допустил в каждом классе. Исправил


    имхо сомнительно.


    тут дело в том, что как бы если указан true параметр urlsafe то ф-ция отработает быстрее, так как не будет тратить ресурсы на поиск символов. Хотя это паранойя наверно у меня.



    по поводу констант - согласен, переделал это место, сейчас буду коммитить.
     
  20. Koc

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

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

    коммит готов. Кстати, есть такая тема на google-code как code review. Прямо в коде, в конкретной ревизии можно писать комменты, что типа этот ваш кусок - гавно.

    Так в чем же все-таки преимущество интерфейсов?
    И как сделать ожин класс и для юникода и для аскии?
     
  21. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Koc
    Фигурные скобки надо ставить, иначе форматирование кода не происходит.
    К тому же когда у тебя идёт сплошной код, очень плохо видно условия и циклы. Я вот щас отучаю от этой привычки некоторых, потому что местами код превращается в макароны, пока не расставишь фигурные скобки.

    По поводу следования параметров - можно и так, но я не предусматриваю дефолтного значения для case параметра - указывать надо всегда, т.к. это не тот метод, который может что-то преобразовать по дефолту.
     
  22. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    У меня есть предложение... Чуть позже опишу...
     
  23. TheShock

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

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

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Их не из-за красоты надо ставить. Пример из одного проекта (не php)
    Код (Text):
    1.  
    2. ...
    3. is_authed = getAuth(a);
    4. if (a == BBB)
    5.     DEBUG("a == BBB");
    6. is_authed = getAuth(b);
    7. ...
    А код ушел заказчику.

    Поэтому сейчас ставлю скобки на каждый блок)
     
  25. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    выполнено, но не тестировалось.
    http://code.google.com/p/strclass/sourc ... b0837744bd

    PHP:
    1. <?
    2. var_dump(Str::pos('в', 'какая-то строка', Str::BOOL);
    3. var_dump(Str::pos('-', 'какая-то строка', Str::BOOL);

    еще провел рефакторинг констант, AFTER теперь объеденина с RIGHT, так как это по сути одно и то же. Хочу еще объеденить некоторые.

    Мануал отстает от версии что в репозитории.