【问题标题】:What are the pros and cons of these 2 example object designs这两个示例对象设计的优缺点是什么
【发布时间】:2016-10-13 22:30:55
【问题描述】:

我有一个通用 (PHP) 设计问题,我一直在琢磨。在这个过于简单的示例中,有一个我想要验证的未验证对象。以我有限的知识,我必须走的路。

选项 1) 使用静态函数作为 - 比如说 - 验证器。在这里,我分离了关注点(?)。对象本身不负责处理验证。我们使用一个服务对象(?)来处理这个问题。

<?php

class Verifier {
    public static function verify(UnverifiedThing $unverifiedThing) : VerifiedThing {
        return new VerifiedThing($unverifiedThing);
    }
}

选项 2) 或者使用未验证类中的函数,该对象本身负责实际验证并返回一个新的已验证对象。

class UnverifiedThing {
    public function verify() : VerifiedThing {
        return new VerifiedThing($this);
    }
}

彼此之间的优缺点是什么?或者有没有我没有考虑过的更好的设计?

【问题讨论】:

  • 让未经验证的事物验证自己就像让狐狸跑鸡舍一样,不是吗?
  • 这似乎比 StackOverflow 更适合 CodeReview.stackexchange.com。
  • @Barmar 啊。不知道存在。谢谢。

标签: php function static


【解决方案1】:

就我个人而言,选项 2 并不直观。一个对象通过创建第二个对象来变形自己?没门。

选项 1 是常用方法,但通常不使用静态函数。尝试设计一个能够验证给定对象的验证权限对象。这会将运行时设置绑定到该对象,而不是将它们保持在全局范围内,并允许使用不同类型的此类代理。此外,此类代理更易于在自动测试用例中使用,因为您可以轻松地模拟它们。

【讨论】:

  • 谢谢.. 我现在想的话可能选错词了。它实际上不是一个验证者,而是一个“转换器”。如果对象在第一种情况下无效,则无法实例化该对象。
  • 实际上并没有太大变化。只有您不想创建第二个经过验证的对象,而只是将现有对象标记为“已验证”。这可以通过自我验证方法在内部完成,或者就像上面建议的那样:通过验证代理。
  • 您能否详细说明为什么最好不要使用静态方法?我使用它是因为..
  • 我使用静态函数原因 1) 我没有尝试构建验证器,它是一个实用程序类 2) 我没有使用任何实例变量,并且它不依赖于实例变量 3) 这个函数不会未来的变化我可能是非常错误的,只是想知道。
  • 好吧,我想我确实在答案中给出了两个明确的原因,为什么通常应该避免使用静态方法。使用静态方法时,您想如何为验证逻辑编写测试?它们是回归程序编程风格的。为什么要这样做?
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 2011-04-16
  • 2011-05-31
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
相关资源
最近更新 更多