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

Ond*_*ták 6 oop

为了显示一个例子,这个问题是关于:

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

更确切地说,我想要与时间一起工作.所以我需要几种处理时间的方法.我正在考虑创建一个Time类,我将在其中检查时间是否格式正确等.

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

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

Mar*_*ann 5

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

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

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

这也将使单元测试代码变得更加容易,因为代码更加松散耦合.


这是C#中的一个例子.

接口:

public interface ITimeMachine
{
    IStopwatch CreateStopwatch();

    DateTimeOffset GetNow();
}
Run Code Online (Sandbox Code Playgroud)

生产实施:

public class RealTimeMachine : ITimeMachine
{
    #region ITimeMachine Members

    public IStopwatch CreateStopwatch()
    {
        return new StopwatchAdapter();
    }

    public DateTimeOffset GetNow()
    {
        return DateTimeOffset.Now;
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

这是界面的消费者:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)