为了显示一个例子,这个问题是关于:
我目前正处于PHP项目的两难境地.我想到了一个将由多个类使用的方法(在本例中为UI-MVC模型),但我不确定如何在OO设计中表示这样的方法.我想到的第一件事就是创建一个具有静态函数的类,我需要它时会调用它们.但是我不确定这是否正确.
更确切地说,我想要与时间一起工作.所以我需要几种处理时间的方法.我正在考虑创建一个Time类,我将在其中检查时间是否格式正确等.
有些人可能会说我根本不应该使用类,因为在PHP中我仍然可以使用过程代码.但我对答案更感兴趣,这将启发我如何在OOP/OOD中处理这种情况.
所以实际的问题是:如何表示这样的方法?静态函数方法是否足够好还是我应该重新考虑其他事情?
我建议创建一个包含此行为的普通类,然后让该类实现从类成员中提取的接口.
每当需要调用这些方法时,都会将接口(而不是具体类)注入到使用者中.这使您可以彼此独立地改变两者.
这可能听起来更像是工作,但只是应用了战略设计模式.
这也将使单元测试代码变得更加容易,因为代码更加松散耦合.
这是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)
| 归档时间: |
|
| 查看次数: |
491 次 |
| 最近记录: |