【问题标题】:OOP practice "empty" objectOOP 实践“空”对象
【发布时间】:2011-02-04 08:04:22
【问题描述】:

使用空实例是好还是坏?

有“产品”类,以id启动:

class product
{
    __construct($id = 0)
    {
        // populate class, there is no product with id = 0
    }

    function new($name, $data)
            ...
}


$product = new Product(123); // normal using

但我还需要创建新产品,所以没有初始对象,我创建一个空的:

$product = new Product();
$product->new($name, $data);

是好是坏?
可能我应该在产品类之外创建通常的函数 new_product(),因为它不使用它的实例,只是创建空的。
解决这个问题的最佳做法是什么?

【问题讨论】:

  • 等等,那么,你是在使用实例来创建实例,什么?
  • 如何在不创建实例的情况下获得new()?使用静态函数?应该是这样吗?

标签: php oop


【解决方案1】:

如果我对您的理解正确并且我正确地遵循了您的方法,那么您很可能想要这样的东西。这样您就无需创建 Product 类的实例来创建新产品。

class Product {
    public function __construct($id = 0) {
        // Load the data for existing product with Id > 0
    }

    public static function create($name, $data) {
        // Create a new product from scratch
        $obj = new self();
        $obj->Name = $name;
        // Do something with data
        return $obj;
    }
}

// Load a product
$product = new Product(123);

// Creating a product
$product = Product::Create('My new product', /* Data? Possible an array */);

【讨论】:

    【解决方案2】:

    两者都可能是好的做法。也许您对第二个的实现不是那么好。

    其实第二种是工厂模式的简单实现。检查此链接,您会更好地理解:

    也许事情是工厂方法应该在像 ProductFactory 这样的类中,所以ProductFactory->new(...) 将是拥有伟大工厂的最佳方式!

    【讨论】:

      【解决方案3】:

      理想情况下,对象的状态应始终为valid。这通常更多是内部状态而不是外部可见状态的问题,但您可以在此处应用这个概念。如果名称或数据为空,或者 ID 为 0 无效(如果 ID 为 0 是“持久存储中不存在”的标记,那么它是有效的),那么这不是最佳实践。坚持代码保持对象有效而不是程序员的原因是这样做依赖于程序员阅读类的文档。当有人在他们的电子商务网站上使用您的课程时,通过电子邮件向您投诉他们收到的订单有空白商品,您就会看到这种方法的智慧。

      要在 PHP 中实现始终保持有效状态的最佳实践,您可以使用工厂模式,正如 Matías 提到的那样,或者只是在 product 上使用静态方法来创建产品(这比工厂模式简单一点; 这些方法在技术上只是构造函数)。或者,您可以使用func_get_args 手动实现构造函数重载(检查参数并根据它们的内容采取不同的操作)。这将在运行时而不是编译时捕获调用错误,因此不如其他方法。

      当然,在脚本执行期间产品缺少某些属性可能是完全有效的,但对于存储的对象缺少属性则无效。如果是这种情况,存储/检索products 的代码将强制执行非空属性。

      【讨论】:

        【解决方案4】:

        格式不好。本质上,您给出了一个名称混乱的 setter 方法。

        您还将构造函数初始化与 setter 初始化混合在一起。选择其中之一,但不能同时选择两者。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-03
          • 1970-01-01
          • 2010-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多