मैं सोचता रहता हूं कि क्या OOP में संज्ञा पर आधारित क्रियाओं का उपयोग करना वैध है।
मैं इस शानदार लेख के पार आया , हालांकि मैं अभी भी इस बात से असहमत हूं।
समस्या को थोड़ा और समझाने के लिए, लेख में कहा गया है कि उदाहरण के लिए, एक FileWriterवर्ग नहीं होना चाहिए , लेकिन चूंकि लेखन एक क्रिया है इसलिए इसे कक्षा का एक तरीका होना चाहिए File। आपको एहसास होगा कि यह अक्सर भाषा पर निर्भर है क्योंकि एक रूबी प्रोग्रामर संभवतः एक FileWriterवर्ग के उपयोग के खिलाफ होगा (रूबी File.openएक फ़ाइल का उपयोग करने के लिए विधि का उपयोग करता है), जबकि एक जावा प्रोग्रामर नहीं होगा।
मेरा व्यक्तिगत (और हाँ, बहुत विनम्र) दृष्टिकोण यह है कि ऐसा करने से एकल जिम्मेदारी सिद्धांत टूट जाएगा। जब मैंने PHP में प्रोग्राम किया (क्योंकि PHP जाहिर है OOP के लिए सबसे अच्छी भाषा है, ठीक है?), मैं अक्सर इस तरह की रूपरेखा का उपयोग करता हूं:
<?php
// This is just an example that I just made on the fly, may contain errors
class User extends Record {
protected $name;
public function __construct($name) {
$this->name = $name;
}
}
class UserDataHandler extends DataHandler /* knows the pdo object */ {
public function find($id) {
$query = $this->db->prepare('SELECT ' . $this->getFields . ' FROM users WHERE id = :id');
$query->bindParam(':id', $id, PDO::PARAM_INT);
$query->setFetchMode( PDO::FETCH_CLASS, 'user');
$query->execute();
return $query->fetch( PDO::FETCH_CLASS );
}
}
?>
यह मेरी समझ है कि प्रत्यय डेटाहैंडलर प्रासंगिक कुछ भी नहीं जोड़ता है ; लेकिन मुद्दा यह है कि एकल जिम्मेदारी सिद्धांत हमें निर्देशित करता है कि डेटा युक्त मॉडल के रूप में उपयोग की जाने वाली वस्तु (इसे रिकॉर्ड कहा जा सकता है) में एसक्यूएल क्वेरी और डेटाबेस एक्सेस करने की जिम्मेदारी भी नहीं होनी चाहिए। यह किसी भी तरह रूबी द्वारा रूबी द्वारा उदाहरण के लिए उपयोग किए गए ActionRecord पैटर्न को अमान्य कर देता है।
मैं इस सी # कोड (इस पोस्ट में इस्तेमाल की जाने वाली चौथी वस्तु भाषा) को दूसरे दिन ही ले आया:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
और मुझे लगता है कि यह मेरे लिए बहुत मायने नहीं रखता है कि एक Encodingया Charsetवर्ग वास्तव में तार एन्कोड करता है । यह केवल एक प्रतिनिधित्व होना चाहिए कि वास्तव में एन्कोडिंग क्या है।
इस प्रकार, मुझे लगता है कि होगा:
Fileफाइलों को खोलना, पढ़ना या सहेजना कोई वर्गीय जिम्मेदारी नहीं है ।Xmlस्वयं को क्रमबद्ध करना कोई वर्गीय जिम्मेदारी नहीं है।Userडेटाबेस को क्वेरी करना कोई क्लास की जिम्मेदारी नहीं है ।- आदि।
हालाँकि, अगर हम इन विचारों को अलग करते हैं, Objectतो एक toStringवर्ग क्यों होगा ? यह एक कार या एक कुत्ते की जिम्मेदारी नहीं है कि वह खुद को एक स्ट्रिंग में बदल दे, अब यह है?
मैं समझता हूं कि व्यावहारिक दृष्टिकोण से, toStringसख्त एसओएलआईडी फॉर्म का पालन करने की सुंदरता के लिए विधि से छुटकारा पाना , जो इसे बेकार बनाकर कोड को अधिक बनाए रखता है, स्वीकार्य विकल्प नहीं है।
मैं यह भी समझता हूं कि इसके लिए एक सटीक उत्तर (जो एक गंभीर उत्तर की तुलना में अधिक निबंध होगा ) नहीं हो सकता है, या यह राय-आधारित हो सकता है। फिर भी मैं यह जानना चाहूंगा कि क्या मेरा दृष्टिकोण वास्तव में एकल-जिम्मेदारी सिद्धांत का अनुसरण करता है।
कक्षा की जिम्मेदारी क्या है?