在哪里放置多个类使用的方法?

时间:2010-02-03 10:09:23

标签: oop

举例说明这个问题是什么:

我目前正处于PHP项目的两难境地。我想到了一个将由多个类使用的方法(在本例中为UI-MVC模型),但我不确定如何在OO设计中表示这样的方法。我想到的第一件事就是创建一个具有静态函数的类,我需要它时会调用它们。但是我不确定这是否正确。

更确切地说,我想要工作,例如,随着时间的推移。所以我需要几种处理时间的方法。我正在考虑创建一个Time类,我将在其中检查时间是否正确等等。

有些人可能会说我根本不应该使用类,因为在PHP中我仍然可以使用过程代码。但我对回答更感兴趣,这将启发我如何在OOP / OOD中处理这种情况。

所以实际问题是:如何表示这样的方法?静态函数方法是否足够好还是我应该重新考虑其他事情?

4 个答案:

答案 0 :(得分:5)

我建议创建一个包含此行为的普通类,然后让该类实现从类成员中提取的接口。

每当您需要调用这些方法时,都会将接口(而不是具体类)注入到使用者中。这使您可以彼此独立地改变两者。

这可能听起来更像是工作,但只是应用了Strategy设计模式。

这也使得对代码进行单元测试变得更加容易,因为代码更加松散耦合。


这是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 :(得分:1)

虽然你说你想要一个任意的,不相关的函数的结构,你已经给出了一个Time类的例子,它有许多相关的函数。因此,从OO的角度来看,您将创建一个Time类并具有静态函数getCurrentTime(),例如,它返回此类的实例。或者你可以定义构造函数的默认行为是返回当前时间,无论你喜欢多少。或两者兼而有之。

class DateTime {

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

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

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

}

但除此之外,已经有builtin DateTime class in PHP

答案 2 :(得分:0)

使用类作为命名空间。所以是的,有一个静态类。

class Time {
    public static function getCurrentTime() {
        return time() + 42;
    }
}

答案 3 :(得分:0)

我不做PHP,但从OO的角度来看,将这些实用方法作为静态方法放置很好。如果它们本质上是完全可重用的,请考虑将它们放在utils类中。