Шаблоны проектирования для ориентирования старого PHP-кода на объект - PullRequest
2 голосов
/ 05 сентября 2011

Впервые на php. Я работаю над старым кодом, в который мне нужно добавить много новых функций. Код не использует никаких объектно-ориентированных возможностей php5 прямо сейчас, но я буду использовать их и постараюсь рефакторировать важные и сложные старые вещи в свободное время.

У меня есть пара вопросов:
1. Будучи человеком, пришедшим из Java-среды, возможность доступа к внешним функциям внутри класса кажется настолько неправильной, что я должен сделать, чтобы повторно использовать старые функции. Правильно ли это делать? ... мне так неестественно, есть ли лучший способ повторно использовать старые функции?

2. Может ли кто-нибудь предложить несколько хороших шаблонов проектирования, которые можно использовать со старым php-кодом, чтобы сделать его мало ориентированным на объект и элегантно работать с новыми функциями.

Ответы [ 5 ]

1 голос
/ 05 сентября 2011
  1. Будучи кем-то из Java, способность получать доступ к внешним функциям из класса кажется настолько неправильной, что я должен сделать, чтобы повторно использовать старые функции

    Это всегда раздражало меня по поводу Java.

    Нет ничего плохого в со свободными функциями.Мантра «все должно быть в объекте в ООП» - полная чушь;так должны быть только вещи, которые логически вписываются в типы объектов.

    Так что не беспокойтесь об этом вообще.

  2. Может кто-нибудь предложить несколько хороших шаблонов проектированияэто можно использовать со старым php-кодом, чтобы сделать его мало ориентированным на объект и сделать его элегантно работающим с новыми функциями.

    Никакой шаблон проектирования не сделает ваш рефакторинг за вас.

    Шаблоны проектирования не являются волшебными пулями;эта фраза ужасно часто используется и является просто способом описания часто используемых соглашений о дизайне.Просмотрите список шаблонов в Википедии, если вы действительно хотите, но вместо этого я просто напишу ваш код наиболее логичным способом, и если впоследствии вы заметите, что он соответствует чьей-то идее «шаблона проектирования»... хорошо, хорошо для вас, я думаю!

1 голос
/ 05 сентября 2011

Вот мои мысли:

  1. Если у вас нет большого количества тестов, которые могут гарантировать, что вы не сломаете все, пока вы реорганизуете свой код для использования объектно-ориентированного дизайна, я бы не рекомендовал менять способ работы существующего кода. Вы можете сделать это, обернув старые функции в логические группировки посредством создания классов Facade , которые либо передают функциональность к существующему коду, либо вызывают несколько функций из вашего существующего кода, если это более сложная операция. нужно. Ваш новый код будет состоять из объектов, которые взаимодействуют с унаследованным фасадом по мере необходимости, и реализуют новые функциональные возможности, используя надлежащий дизайн ОО.
  2. Одна вещь, которую я считаю необходимой, если вы планируете рефакторинг старого кода, - это провести надлежащее тестирование на месте. Я бы посмотрел на SimpleTest , если у вас еще нет надлежащего тестирования. Что касается шаблонов проектирования, это будет сильно зависеть от целей, которые ваш существующий код пытается достичь.
0 голосов
/ 15 февраля 2013

Я идея больше всего на свете.

Если в Java вы когда-либо создавали статический метод, такой как MyClass :: someStaticMethod (параметр), то это похоже на использование «бесплатной» функции.

Вот что такое статические методы. Они доступны по всему миру, и на самом деле это действительно длинное имя, но в остальном это бесплатный метод.

Вы могли бы поместить их в «класс», но на самом деле это способ создания глобальных функций в ограниченном смысле в Java. Если вы думаете об этом таким образом, бесплатные php-функции не кажутся такими уж плохими, поскольку их имена короче.

0 голосов
/ 05 сентября 2011

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

Я сделал это довольно успешно с устаревшим кодом, который был написан довольно плохо (мой, мне стыдно сказать!), Но переписывание было не вариант.

Я закончил с красивым чистым интерфейсом, который можно было легко изменить и легко прочитать. Это стоило дополнительных усилий и позволило мне реорганизовать старый код на досуге, как и когда позволяет время (все еще работая над этим).

0 голосов
/ 05 сентября 2011
  1. Вы можете просто инкапсулировать вызов этой функции в объектах, реализующих определенные интерфейсы.
  2. См. 1. Это общее правило; просто определите некоторые логические «модули», которые в настоящее время реализуются через различные функции, и инкапсулируйте и скрывайте эти функции за объектами и интерфейсами.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...