代码之家  ›  专栏  ›  技术社区  ›  Ondrej Slinták

将多个类使用的方法放在何处?

oop
  •  6
  • Ondrej Slinták  · 技术社区  · 15 年前

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

    我目前在从事的PHP项目中遇到了一个难题。我想到了一个将由多个类使用的方法(在本例中是UI-MVC模型),但我不确定如何在OO设计中表示这些方法。我想到的第一件事是创建一个带有静态函数的类,我可以随时调用这些函数。但是我不确定这样做是否正确。

    更确切地说,我想工作,比如说,与时间一起工作。所以我需要几种处理时间的方法。我在考虑创建一个Time类,在这个类中,我将使用一些函数来检查时间的格式是否正确等等。

    有些人可能会说,我根本不应该使用类来实现这一点,因为在PHP中,我仍然可以使用过程代码。但我更感兴趣的是那个些能启发我如何在OOP/OOD中处理这种情况的答案。

    4 回复  |  直到 15 年前
        1
  •  5
  •   Mark Seemann    14 年前

    无论何时需要调用这些方法,都要注入 接口

    这听起来像是更多的工作,但这只是一个简单的问题 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);
        }
    }
    
        2
  •  1
  •   soulmerge    15 年前

    尽管您说希望为任意的、不相关的函数提供一个结构,但您已经给出了一个时间类的示例,它有许多相关函数。因此,从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

        3
  •  0
  •   strager    15 年前

    将类用作命名空间。是的,我们有一个静态类。

    class Time {
        public static function getCurrentTime() {
            return time() + 42;
        }
    }
    
        4
  •  0
  •   spender    15 年前