gpt4 book ai didi

php - SOLID - 单一职责原则是否适用于类中的方法?

转载 作者:可可西里 更新时间:2023-11-01 12:48:21 25 4
gpt4 key购买 nike

我不确定我的类中的这个方法是否违反了单一职责原则,

public function save(Note $note)
{
if (!_id($note->getid())) {

$note->setid(idGenerate('note'));

$q = $this->db->insert($this->table)
->field('id', $note->getid(), 'id');

} else {
$q = $this->db->update($this->table)
->where('AND', 'id', '=', $note->getid(), 'id');
}

$q->field('title', $note->getTitle())
->field('content', $note->getContent());

$this->db->execute($q);

return $note;
}

基本上它在一个方法中做两项工作 - 插入或更新。

我是否应该将其分离为两个方法而不是遵守单一职责原则?

但 SRP 仅适用于类(class),不是吗?它适用于类中的方法吗?

建议零售价 -

a class should have only a single responsibility (i.e. only one potential change in the software's specification should be able to affect the specification of the class)

编辑:

另一种用于列出笔记(包括许多不同类型的列表)、搜索笔记等的方法...

public function getBy(array $params = array())
{
$q = $this->db->select($this->table . ' n')
->field('title')
->field('content')
->field('creator', 'creator', 'id')
->field('created_on')
->field('updated_on');

if (isset($params['id'])) {
if (!is_array($params['id'])) {
$params['id'] = array($params['id']);
}

$q->where('AND', 'id', 'IN', $params['id'], 'id');
}

if (isset($params['user_id'])) {
if (!is_array($params['user_id'])) {
$params['user_id'] = array($params['user_id']);
}

# Handling of type of list: created / received
if (isset($params['type']) && $params['type'] == 'received') {
$q
->join(
'inner',
$this->table_share_link . ' s',
's.target_id = n.id AND s.target_type = \'note\''
)
->join(
'inner',
$this->table_share_link_permission . ' p',
'p.share_id = s.share_id'
)
# Is it useful to know the permission assigned?
->field('p.permission')
# We don't want get back own created note
->where('AND', 'n.creator', 'NOT IN', $params['user_id'], 'uuid');
;

$identity_id = $params['user_id'];

# Handling of group sharing
if (isset($params['user_group_id']) /*&& count($params['user_group_id'])*/) {
if (!is_array($params['user_group_id'])) {
$params['user_group_id'] = array($params['user_group_uuid']);
}

$identity_id = array_merge($identity_id, $params['user_group_id']);
}

$q->where('AND', 'p.identity_id', 'IN', $identity_id, 'id');

} else {
$q->where('AND', 'n.creator', 'IN', $params['user_id'], 'id');
}
}

# If string search by title
if (isset($params['find']) && $params['find']) {
$q->where('AND', 'n.title', 'LIKE', '%' . $params['find'] . '%');
}

# Handling of sorting
if (isset($params['order'])) {
if ($params['order'] == 'title') {
$orderStr = 'n.title';

} else {
$orderStr = 'n.updated_on';
}

if ($params['order'] == 'title') {
$orderStr = 'n.title';

} else {
$orderStr = 'n.updated_on';
}

$q->orderBy($orderStr);

} else {
// Default sorting
$q->orderBy('n.updated_on DESC');
}

if (isset($params['limit'])) {
$q->limit($params['limit'], isset($params['offset']) ? $params['offset'] : 0);
}

$res = $this->db->execute($q);

$notes = array();

while ($row = $res->fetchRow()) {
$notes[$row->uuid] = $this->fromRow($row);
}

return $notes;
}

最佳答案

该方法将注释保存到数据库。如果那是它应该做的,那么这是一个单一的责任并且实现很好。您需要将决定是插入还是更新的逻辑放在某处,这似乎是一个不错的地方。

只有当您需要在没有隐式决策逻辑的情况下显式执行插入或更新时,才值得将这两者分离到可以单独调用的不同方法中。但目前,将它们保持在相同的方法中可以简化代码(因为后半部分是共享的),所以这可能是最好的实现方式。

示例:

public function save(Note $note) {
if (..) {
$this->insert($note);
} else {
$this->update($note);
}
}

public function insert(Note $note) {
..
}

public function update(Note $note) {
..
}

如果您有时出于某种原因需要显式调用 insertupdate ,那么上面的内容就有意义了。不过,SRP 并不是这种分离的真正原因。

关于php - SOLID - 单一职责原则是否适用于类中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30861882/

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