আমি ভাবছি যে OOP- এ বিশেষ্যগুলির উপর ভিত্তি করে ক্রিয়াগুলি ব্যবহার করা বৈধ কিনা?
আমি এই উজ্জ্বল নিবন্ধটি জুড়ে এসেছি , যদিও আমি এখনও এটি তৈরির পয়েন্টের সাথে একমত নই।
সমস্যাটিকে আরও কিছুটা বোঝাতে, নিবন্ধে বলা হয়েছে যে উদাহরণস্বরূপ একটি FileWriter
শ্রেণি হওয়া উচিত নয় , যেহেতু লেখাই একটি ক্রিয়া তাই এটি শ্রেণীর একটি পদ্ধতি হওয়া উচিত File
। আপনি বুঝতে পারবেন যে এটি প্রায়শই ভাষা নির্ভর করে যেহেতু কোনও রুবি প্রোগ্রামার সম্ভবত কোনও FileWriter
ক্লাসের ব্যবহারের বিরুদ্ধে থাকবে (রুবি File.open
কোনও ফাইল অ্যাক্সেস করার জন্য পদ্ধতি ব্যবহার করে ), যেখানে জাভা প্রোগ্রামার তা ব্যবহার করবে না।
আমার ব্যক্তিগত (এবং হ্যাঁ, খুব নম্র) দৃষ্টিভঙ্গি হ'ল এটি করা একক দায়িত্বের নীতিটি ভঙ্গ করে। আমি যখন পিএইচপি-তে প্রোগ্রাম করেছিলাম (কারণ পিএইচপি স্পষ্টতই ওওপি-র জন্য সেরা ভাষা, তাই না?), আমি প্রায়শই এই ধরণের কাঠামো ব্যবহার করতাম:
<?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 );
}
}
?>
এটি আমার বোধগম্য যে ডেটাহ্যান্ডলার প্রত্যয়টি প্রাসঙ্গিক কিছু যুক্ত করে না ; তবে মুল বক্তব্যটি হ'ল একক দায়িত্বের নীতিটি আমাদের নির্দেশ করে যে ডেটাযুক্ত মডেল হিসাবে ব্যবহৃত কোনও বস্তুর (এটি একটি রেকর্ড বলা যেতে পারে) এসকিউএল অনুসন্ধান এবং ডেটাবেস অ্যাক্সেস করারও দায় থাকা উচিত নয়। এটি কোনওভাবে রেল অন রুবেলের উদাহরণ হিসাবে ব্যবহৃত অ্যাকশনরেখার প্যাটার্নটিকে অকার্যকর করে তোলে।
আমি এই সি # কোডটি পেরিয়ে এসেছি (ইয়ে, এই পোস্টে ব্যবহৃত চতুর্থ অবজেক্টের ভাষা) ঠিক অন্যদিনে:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
এবং আমি বলতে চাই যে এটি আমার কাছে খুব একটা বোঝায় না যে একটি Encoding
বা Charset
শ্রেণি আসলে স্ট্রিংগুলি এনকোড করে। এটি কেবল একটি এনকোডিং আসলে কী তা উপস্থাপন করা উচিত।
সুতরাং, আমি যে ভাবা হবে:
File
ফাইলগুলি খোলার, পড়া বা সংরক্ষণ করা কোনও শ্রেণির দায়িত্ব নয় ।Xml
নিজেকে ধারাবাহিক করা কোনও শ্রেণির দায়িত্ব নয়।User
ডাটাবেসকে জিজ্ঞাসা করা কোনও শ্রেণীর দায়িত্ব নয় ।- প্রভৃতি
তবে, আমরা যদি এই ধারণাগুলি বহির্মুখী করি, তবে Object
একটি toString
ক্লাস কেন হবে ? নিজেকে স্ট্রিংয়ে রূপান্তরিত করা কোনও গাড়ি বা কুকুরের দায়িত্ব নয়, এখন তা কি?
আমি বুঝতে পারি যে বাস্তববাদী দৃষ্টিকোণ থেকে, toString
কঠোর SOLID ফর্ম অনুসরণের সৌন্দর্যের জন্য পদ্ধতি থেকে মুক্তি পাওয়া , যা কোডটিকে অকেজো করে তৈরি করে আরও রক্ষণাবেক্ষণ করে তোলে, এটি গ্রহণযোগ্য বিকল্প নয়।
আমি আরও বুঝতে পারি যে এর সঠিক উত্তর নাও থাকতে পারে (যা কোনও গুরুতর উত্তরের চেয়ে প্রবন্ধ হতে পারে ), বা এটি মতামত ভিত্তিক হতে পারে। তবুও আমি এখনও জানতে চাইব যে আমার পদ্ধতির দ্বারা একক-দায়িত্বের নীতিটি আসলে কী তা অনুসরণ করে।
একটি শ্রেণীর দায়িত্ব কী?