Для показа примера, что это вопросом о:
У меня в настоящее время есть дилемма в проекте PHP, я продолжаю работать. Я имею в виду метод, который будет использоваться несколькими классами (UIs в этом случае - модель MVC), но я не уверен, как представить такие методы в дизайне OO. Первая вещь, которая вошла в мой ум, состояла в том, чтобы создать класс со статическими функциями, которые я вызову каждый раз, когда мне нужны они. Однако я не уверен, является ли это правильный поступок.
Чтобы быть более точным, я хочу работать, например, со временем. Таким образом, мне будут нужны несколько методов то время обработки. Я думал о создании класса Времени, где я буду функциями, которые проверяют, является ли время в правильном формате и т.д.
Некоторые могли бы сказать, что я не должен использовать класс для этого вообще, с тех пор в PHP я могу все еще использовать процессуальный код. Но я больше интересуюсь ответом, который просветил бы меня, как приблизиться к таким ситуациям в ООП / OOD.
Таким образом, фактические вопросы: Как представить такие методы? Статический функциональный подход достаточно хорош, или я должен пересмотреть что-либо еще?
Я бы рекомендовал создать обычный класс, содержащий это поведение, а затем позволить этому классу реализовать интерфейс, извлеченный из членов класса.
Всякий раз, когда вам нужно вызвать эти методы, вы вставляете интерфейс (не конкретный класс) в потребителя. Это позволяет вам изменять их независимо друг от друга.
Это может показаться дополнительной работой, но это просто примененный шаблон проектирования Стратегия .
Это также значительно упростит модульное тестирование кода, поскольку код более слабо связан.
Вот пример на C #.
Интерфейс:
public interface ITimeMachine
{
IStopwatch CreateStopwatch();
DateTimeOffset GetNow();
}
Производственная реализация:
public class RealTimeMachine : ITimeMachine
{
#region ITimeMachine Members
public IStopwatch CreateStopwatch()
{
return new StopwatchAdapter();
}
public DateTimeOffset GetNow()
{
return DateTimeOffset.Now;
}
#endregion
}
и вот потребитель интерфейса:
public abstract class PerformanceRecordingSession : IDisposable
{
private readonly IStopwatch watch;
protected PerformanceRecordingSession(ITimeMachine timeMachine)
{
if (timeMachine == null)
{
throw new ArgumentNullException("timeMachine");
}
this.watch = timeMachine.CreateStopwatch();
this.watch.Start();
}
public abstract void Record(long elapsedTicks);
public virtual void StopRecording()
{
this.watch.Stop();
this.Record(this.watch.ElapsedTicks);
}
}
Я рекомендую взглянуть на Как я объяснил отдых своей жене
Отрывок из ссылки waybackmaschine:
Как насчет примера. Вы учитель и хотите управлять учениками:
Если системы основаны на Интернете, то, вероятно, есть URL для каждого из существительных, участвующих здесь: ученик, учитель, класс, книга, комната и т.д.
.... Если бы имелось машиночитаемое представление для каждого URL, то было бы тривиально фиксировать новые инструменты в системе, потому что вся эта информация будет расходоваться стандартным образом.... Вы можете построить общенациональную систему, которая смогла поговорить с каждой из отдельных школьных систем, чтобы собрать баллы тестирования.
Каждая из систем получает информацию друг от друга с помощью простого HTTP GET. Если одной системе нужно добавить что-либо в другую систему, она будет использовать HTTP POST. Если система хочет обновить что-либо в другой системе, она использует HTTP PUT. Осталось только выяснить, как должны выглядеть данные.
-121--673916-Я помню эту проблему несколько раз. Это может иметь отношение к Flex Profiler (раньше я случайно нажимал на него то и дело, пытаясь запустить отладчик).
Если запустить Profiler и остановить его слишком быстро, он добавит что-то в файл в вашем домашнем каталоге, чего не должно быть.
Проверьте /path/to/home/mm.cfg
в операционной системе (на mac можно открыть его в текстовой комбинации с приятелей ~/mm.cfg
). В файле mm.cfg
хранится некоторая информация об отладке в Flex
Затем убедитесь, что это единственное содержимое:
ErrorReportingEnable=1
TraceOutputFileEnable=1
Если имеется дополнительная строка (не удается запомнить/найти ее, что-то вроде
PreloadSwf=/Users/[username]/Documents/workspace/.metadata/.plugins/com.adobe.flash.profiler/ProfilerAgent.swf?host=localhost&port=9999
), удалите ее.
Дайте мне знать, если это исправит.
Ланс
-121--4196035-Использование класса в качестве пространства имен. Так что да, иметь статический класс.
class Time {
public static function getCurrentTime() {
return time() + 42;
}
}
Я не занимаюсь PHP, но с точки зрения OOO, размещение подобных утилит как статических методов вполне нормально. Если они по своей природе полностью пригодны для многократного использования, рассмотрим возможность их размещения в классе utils.
Хотя вы говорите, что вам нужна структура для произвольных, несвязанных функций, вы привели пример класса Time, который имеет много связанных функций. Итак, с точки зрения объектно-ориентированного подхода вы должны создать класс Time и иметь, например, статическую функцию getCurrentTime ()
, которая возвращает экземпляр этого класса. Или вы можете определить, что поведение конструкторов по умолчанию - возвращать текущее время, в зависимости от того, что вам больше нравится. Или оба.
class DateTime {
public static function getNow() {
return new self();
}
public function __construct() {
$this->setDateTime('now');
}
public function setDateTime($value) {
#...
}
}
Но помимо этого, в PHP уже есть встроенный класс DateTime .