Удалить повторяющиеся, жестко закодированные циклы и условия в PHP - PullRequest
2 голосов
/ 17 октября 2008

Я видел этот вопрос о C #, я хотел бы получить ответ для PHP. У меня есть старый код, который имеет 4 страницы циклов foreach и условий, которые просто затрудняют чтение и следование. Как бы я сделал это больше ОО? Я думал об использовании функций SPL, но пока не до конца понимаю, что с этим связано.

Ответы [ 5 ]

3 голосов
/ 17 октября 2008

Этот код, вероятно, может быть значительно очищен и расширен в направлении OO, не касаясь SPL.

SPL необходим, только если вы хотите изменить нормальное поведение объекта в языковых конструкциях, таких как foreach (), или во встроенных функциях, таких как count (), или в функциях доступа к массиву (как operator [], так и функций наподобие key (), next ( ) и т. д.)

Рекомендации по уборке:

  • Если одно и то же действие выполняется в коде несколько (более 1 или 2) раз, разбейте его на функцию. Если это действие должно быть выполнено для всех элементов в массиве, рассмотрите возможность использования array_walk . Если по какой-то причине обход массива не подходит, используйте цикл:)
  • Если у вас есть несколько экземпляров некоторых семантически связанных данных, более сложных, чем пара ключ: значение, со связанными операциями, рассмотрите возможность их переноса в класс. Но официально зарегистрированный сотрудник. массив может подойти вам так же хорошо. Зависит от вашего стиля и типа данных. Здесь важно структурировать методы, работающие с данными, и документацию. Неважно, если вы делаете это класс или нет.
  • После того, как вы выполнили вышеупомянутые шаги, разбейте недавно написанные функции и объекты на отдельные файлы включения. Я склоняюсь к тому, чтобы обернуть почти все в классе, поэтому у меня в основном один класс пр. файл. Но некоторые вспомогательные классы делят файл с основным классом и т. Д. Вы почувствуете это.
2 голосов
/ 17 октября 2008

На вашем месте я бы начал с написания тестового кода.

Если вы можете создать набор тестовых случаев, которые полностью описывают функциональность, которую вы реорганизуете, вы можете переписать свой код в безопасности, зная, что он все еще будет работать.

PHPUnit может быть хорошим началом для этого.

0 голосов
/ 17 октября 2008

Если я вас правильно понимаю, у вас есть циклы foreach (и тому подобное), вложенные в 4 страницы, и вам интересно, может ли эта ОО вещь, о которой вы слышали, может помочь.

Вы, безусловно, должны пойти дальше и реорганизовать свой код, чтобы уменьшить уровни вложенности и улучшить читаемость, но не путайте это с ориентацией на объект.

OO - это способ структурирования вашего кода, чтобы поместить определение структур данных рядом с кодом, который манипулирует этими структурами данных. Хотя одной из его основных целей является повышение читабельности за счет обеспечения инкапсуляции сложности, ОО - не единственный способ сделать это.

Если вы еще не понимаете концепции ОО, вам может быть проще реорганизовать ваш код, чтобы разделить код внутри внутренних циклов на отдельные функции, каждая из которых (будем надеяться) будет выполнять одну простую задачу.

Не поймите меня неправильно; Я сторонник ОО, особенно как методика предоставления разработчикам концепций более высокого уровня для более эффективного обсуждения дизайна. ОО стоит учиться.

Но не позволяйте недостатку знаний об OO помешать вам извлекать внутренний код из циклов и помещать их в функции специального назначения.

(Если я неправильно понял ваш уровень знаний ОО, мои извинения.)

0 голосов
/ 17 октября 2008

Несколько полезных советов от Джонатана и Гнуда. Не беспокойтесь о SPL, и узнайте больше о рефакторинге и посмотрите, какие инструменты рефакторинга доступны для PHP .

Также я не могу рекомендовать достаточно чтения Эффективно работать с устаревшим кодом :

alt text

И, конечно, каноническая Рефакторинг Книга :

альтернативный текст http://ecx.images -amazon.com / images / I / 519XT0DER6L._SL500_BO2,204,203,200_AA219_PIsitb-sticker-dp-arrow, TopRight, -24, -23_SH20_OU01_.jpg

PHP - это сложный язык для очистки от запахов кода, но с небольшой настойчивостью это можно сделать! И вы будете каждый день благодарить себя за то, что смотрите на свою кодовую базу.

0 голосов
/ 17 октября 2008

Начните медленно. рефакторинг это кусок за один раз.

Если вы просматриваете множество массивов, посмотрите на функции массива, такие как array_map, array_walk и друзья. Это скорее функциональный рефакторинг, чем рефакторинг ОО, но он унесет вас довольно далеко. Если имеет смысл пойти на большее ОО, то у вас будут некоторые функции, которые вы сможете затем вставить в соответствующие классы при необходимости.

...