举例说明这个问题是什么:
我目前正处于PHP项目的两难境地。我想到了一个将由多个类使用的方法(在本例中为UI-MVC模型),但我不确定如何在OO设计中表示这样的方法。我想到的第一件事就是创建一个具有静态函数的类,我需要它时会调用它们。但是我不确定这是否正确。
更确切地说,我想要工作,例如,随着时间的推移。所以我需要几种处理时间的方法。我正在考虑创建一个Time类,我将在其中检查时间是否正确等等。
有些人可能会说我根本不应该使用类,因为在PHP中我仍然可以使用过程代码。但我对回答更感兴趣,这将启发我如何在OOP / OOD中处理这种情况。
所以实际问题是:如何表示这样的方法?静态函数方法是否足够好还是我应该重新考虑其他事情?
答案 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类中。