Куда поместить методы, используемые несколькими классами?

Для показа примера, что это вопросом о:

У меня в настоящее время есть дилемма в проекте PHP, я продолжаю работать. Я имею в виду метод, который будет использоваться несколькими классами (UIs в этом случае - модель MVC), но я не уверен, как представить такие методы в дизайне OO. Первая вещь, которая вошла в мой ум, состояла в том, чтобы создать класс со статическими функциями, которые я вызову каждый раз, когда мне нужны они. Однако я не уверен, является ли это правильный поступок.

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

Некоторые могли бы сказать, что я не должен использовать класс для этого вообще, с тех пор в PHP я могу все еще использовать процессуальный код. Но я больше интересуюсь ответом, который просветил бы меня, как приблизиться к таким ситуациям в ООП / OOD.

Таким образом, фактические вопросы: Как представить такие методы? Статический функциональный подход достаточно хорош, или я должен пересмотреть что-либо еще?

6
задан Ondrej Slinták 3 February 2010 в 10:09
поделиться

4 ответа

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

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

Это может показаться дополнительной работой, но это просто примененный шаблон проектирования Стратегия .

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


Вот пример на 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);
    }
}
5
ответ дан 17 December 2019 в 02:28
поделиться

Я рекомендую взглянуть на Как я объяснил отдых своей жене

Сторонний редактор

Отрывок из ссылки 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;
    }
}
0
ответ дан 17 December 2019 в 02:28
поделиться

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

0
ответ дан 17 December 2019 в 02:28
поделиться

Хотя вы говорите, что вам нужна структура для произвольных, несвязанных функций, вы привели пример класса Time, который имеет много связанных функций. Итак, с точки зрения объектно-ориентированного подхода вы должны создать класс Time и иметь, например, статическую функцию getCurrentTime () , которая возвращает экземпляр этого класса. Или вы можете определить, что поведение конструкторов по умолчанию - возвращать текущее время, в зависимости от того, что вам больше нравится. Или оба.

class DateTime {

    public static function getNow() {
        return new self();
    }

    public function __construct() {
        $this->setDateTime('now');
    }

    public function setDateTime($value) {
        #...
    }

}

Но помимо этого, в PHP уже есть встроенный класс DateTime .

1
ответ дан 17 December 2019 в 02:28
поделиться