मुझे यकीन है कि मेरी कक्षा के अंदर इस विधि एकल जिम्मेदारी सिद्धांत का उल्लंघन किया गया है या नहीं हूँ,सॉलिड - क्या एकल जिम्मेदारी सिद्धांत कक्षा में विधियों पर लागू होता है? डालने या अद्यतन -
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 -
एक वर्ग में केवल एक ही जिम्मेदारी है (यानी केवल एक सॉफ्टवेयर के विनिर्देश में संभावित परिवर्तन में सक्षम होना चाहिए करने के लिए वर्ग के विनिर्देश को प्रभावित) चाहिए
संपादित करें:
नोट्स सूचीबद्ध करने के लिए एक और तरीका (कई अलग-अलग प्रकार की लिस्टिंग सहित), खोज n OTES, आदि ...
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;
}
धन्यवाद। उपरोक्त मेरे संपादन में विधि के बारे में क्या। यह उदाहरण के लिए एक ही समय में नोट्स और खोज नोट्स सूचीबद्ध करने के लिए है। क्या ऐसा करना ठीक है या क्या मुझे उन्हें अलग करना चाहिए? क्या यह एसआरपी का उल्लंघन कर रहा है? – laukok
ठीक है, उस विधि की ज़िम्मेदारी खोज मानदंडों की एक श्रृंखला लेना और नोटों की एक सूची वापस करना है। यह हमेशा एक ही बात है। यहां तक कि यदि कार्यान्वयन अपेक्षाकृत जटिल हो सकता है और संभवतः स्वच्छता के लिए अलग-अलग तरीकों से दोबारा प्रतिक्रिया दी जा सकती है, तो एसआरपी का उल्लंघन नहीं होता है। संक्षेप में एसआरपी का मतलब है कि आपको यह वर्णन करने में सक्षम होना चाहिए कि एक विधि/वर्ग/मॉड्यूल एक छोटी सी वाक्य में क्या करता है। जैसे ही आपको इसका वर्णन करने की आवश्यकता है * यह एक्स foo, bar, baz करता है और यह कॉफी * बनाता है, यह शायद एसआरपी का उल्लंघन कर रहा है। – deceze
* "तर्क एक्स लेता है और परिणाम वाई देता है" * एक जिम्मेदारी है। * बहुत अधिक * का एक उदाहरण होगा: * "यह वर्ग डेटाबेस कनेक्शन प्रबंधित करता है, और डेटा को क्रमबद्ध करता है, और टेम्पलेट प्रस्तुत करता है, और प्रतिक्रिया को कैश करता है" *। – deceze