Где разместить методы, используемые несколькими классами? - PullRequest
6 голосов
/ 03 февраля 2010

Чтобы показать пример, о чем этот вопрос:

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

Если быть более точным, я хочу работать, например, со временем. Поэтому мне нужно несколько методов, которые обрабатывают время. Я думал о создании класса Time, в котором я буду использовать функции, которые проверяют правильность формата времени и т. Д.

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

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

Ответы [ 4 ]

5 голосов
/ 03 февраля 2010

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

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

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

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


Вот пример на 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);
    }
}
1 голос
/ 03 февраля 2010

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

class DateTime {

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

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

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

}

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

0 голосов
/ 03 февраля 2010

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

0 голосов
/ 03 февраля 2010

Использование класса в качестве пространства имен.Так что да, есть статический класс.

class Time {
    public static function getCurrentTime() {
        return time() + 42;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...