【问题标题】:How to implement this in accordance with the programming best practice in PHP [closed]如何根据 PHP 中的编程最佳实践来实现这一点 [关闭]
【发布时间】:2013-11-02 08:18:44
【问题描述】:

为了描述我的问题,我将使用某种类比,这种类比更易于分析,并且在我看来很好地反映了我的问题。

假设有一个 Library 类,它包含两个列表:书籍列表和书架列表。在 PHP 中,这两个列表最容易实现为数组,我这样做了 - 我在类库中创建了两个公共字段:书籍和书架,并在构造函数中用数组初始化它们。

class Library
{
    public $books;
    public $bookshelves;

    public function __construct () {
        $this->books = array();
        $this->bookshelves = array();
    }
}

一切都会好的,因为在数组中实现的方法就足够了。但是从编程最佳实践的角度来看,这段代码对我来说似乎不正确。我认为这门课不是那么封闭,是吗?有必要记住该字段的用途以及如何对待他。例如,如果我想将这本书添加到图书馆,我会在 Library 类中搜索方法 addBook。我从来没有想过我必须在图书馆类的外业手册上执行方法添加。

因此我应该将字段书籍和书架作为私有,并在图书馆类中实现函数 addBook/addBookshelf、removeBook/removeBookshelf、getBook/getBookshelf 等。

class Library
{
    private $books;
    private $bookshelves;

    public function __construct () {
        $this->books = array();
        $this->bookshelves = array();
    }

    public function addBook (Book $book) {
        $this->books[] = $book;
    }

    public function removeBook ($id) {
        $this->books[$id] = [];
    }

    public function getBook ($id) {
        return $this->books[$id];
    }

    public function addBookhelf (Book $book) {
        $this->bookshelf[] = $book;
    }

    public function removeBookhelf ($id) {
        $this->bookshelf[$id] = [];
    }

    public function getBookhelf ($id) {
        return $this->bookshelf[$id];
    }
}

但这也是不正确的。为什么有人会花时间第二次编写已经在数组中实现的相同内容?一类,一项责任的原则是什么?

第三种方法是创建两个类:BooksList 和 BookshelvesList,它们扩展了 ArrayObject 类。它们没有任何额外的方法或字段。

class BooksList extends ArrayObject
{
}

class BookshelvesList extends ArrayObject
{
}

接下来,我应该用这个类初始化公共领域的书籍和书架。

class Library
{
    private $books;
    private $bookshelves;

    public function __construct ()
    {
        $this->books = new BooksList();
        $this->bookshelves = new BookshelvesList();
    }
}

那么图书馆类不负责对书籍和书架的操作。并且没有第二次编写数组操作。但是正在创建两个没有添加新内容的奇怪对象。

所以我发明了三种实现我的问题的可能性,但每一种都有一些缺陷。这不是一些复杂的关系,它会是一种简单而优雅的实现方式。我寻找了一些适合这个问题的设计模式,但我没有找到。所以我在这里问,如何正确实现?

【问题讨论】:

  • 什么是正确?什么是最佳实践
  • @Dagon 你真的在问什么是“最佳实践”吗?老兄,你是怎么在这个网站上获得 9000 声望的???
  • @Panique 他试图暗示这些术语是主观的,因此偏离主题
  • 没错,论文不是绝对的。

标签: php arrays oop design-patterns


【解决方案1】:

只回答你的一个问题:

为什么有人会花时间第二次编写已经在数组中实现的相同内容?

如果您只是进行原型设计或其他事情,您可能不会。但在其他大多数情况下,最好能够控制对对象中关键数据的访问。它可以保护您以后不会滥用代码(例如,有人将Tree 对象直接添加到您的$books 数组中-您可以在addBook 函数中添加验证以轻松防止这种情况发生)。其次,它为您提供了更多的灵活性。如果客户突然决定每次将一本书添加到图书收藏中时都希望向图书管理员发送一封电子邮件怎么办?如果您允许您的代码从任何地方直接添加一个公共变量,那么您可能需要完成相当多的维护工作!

【讨论】:

  • 我同意你的看法。那么您认为第二种或第三种解决方案最好吗?
  • 在这种情况下,我个人可能会选择选项 2。但我认为这只是个人喜好,而不是有充分的理由选择其中一个。
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
相关资源
最近更新 更多