gpt4 book ai didi

php - setter/getter 中重复开关的设计模式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:45:27 25 4
gpt4 key购买 nike

我有一个 ORM 模型(PHP Active Record),比如说,用于博客系统。我有一个存储点赞数的 post 模型。 post 可以是 picturequote(比方说),它们是不同的表(因此是模型)。

架构是 post 包含分享次数、喜欢、描述等数据,以及 图片引用.

所以在为 post 模型编写 getter 时,我必须编写

public function getX() {
if ($this->isPicture()) {
return $this->picture->getX();
}
else if ($this->isQuote()) {
return $this->quote->getX()
}
else {
return self::DEFAULT_X
}
}

我目前必须为许多 getter 编写此结构。我可以做些什么来避免这种情况吗?

PS:标记为 PHP,因为这是我的代码。

编辑

  • 将注释更改为代码。
  • 这是一个模型(以及数据库中的相应表),它包含的数据不仅仅是图片引用。例如,descriptionpost 的一部分,不在 picturequote 中。
  • 图片引述的表格。
  • 使用 PHP Active Record 和三个类中的每一个来扩展 PHP Active Record 提供的通用模型类。
  • 图片 模型有自己的数据。 quote 也是如此。

最佳答案

扩展评论中提到的策略模式的想法:

class Post {
// get the correct 'strategy'
public function getModel() {
if ($this->isPicture()) {
return $this->picture;
}

if ($this->isQuote()) {
return $this->quote;
}

return null;
}

// using the strategy
public function getX() {
$model = $this->getModel();

if (null === $model) {
return self::DEFAULT_X;
}

return $model->getX();
}
}

每个策略可能会实现与 Post 类相同的接口(interface)以公开这些 getter。更好的办法是提供一个默认策略(而不是返回 null)并让它返回默认值。这样,每个 getter 中的 null 检查就变得多余了。

关于php - setter/getter 中重复开关的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com