Saya terus bertanya-tanya apakah sah menggunakan kata kerja yang didasarkan pada kata benda di OOP.
Saya menemukan artikel yang brilian ini , meskipun saya masih tidak setuju dengan poin yang dibuatnya.
Untuk menjelaskan masalahnya sedikit lebih banyak, artikel itu menyatakan bahwa seharusnya tidak ada, misalnya, FileWriter
kelas, tetapi karena menulis adalah tindakan, itu harus menjadi metode kelas File
. Anda akan menyadari bahwa seringkali tergantung pada bahasa karena seorang programmer Ruby kemungkinan akan menentang penggunaan FileWriter
kelas (Ruby menggunakan metode File.open
untuk mengakses file), sedangkan seorang programmer Java tidak akan melakukannya.
Pandangan pribadi saya (dan ya, sangat rendah hati) adalah dengan melakukan hal itu akan melanggar prinsip Tanggung Jawab Tunggal. Ketika saya diprogram dalam PHP (karena PHP jelas merupakan bahasa terbaik untuk OOP, kan?), Saya sering menggunakan kerangka kerja seperti ini:
<?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 );
}
}
?>
Ini adalah pemahaman saya bahwa sufiks DataHandler tidak menambahkan sesuatu yang relevan ; tetapi intinya adalah bahwa prinsip tanggung jawab tunggal menentukan kita bahwa objek yang digunakan sebagai model yang berisi data (semoga disebut Rekaman) tidak seharusnya juga memiliki tanggung jawab untuk melakukan kueri SQL dan akses DataBase. Ini entah bagaimana membatalkan pola ActionRecord yang digunakan misalnya oleh Ruby on Rails.
Saya menemukan kode C # ini (yay, bahasa objek keempat yang digunakan dalam posting ini) beberapa hari yang lalu:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Dan saya harus mengatakan bahwa tidak masuk akal bagi saya bahwa kelas Encoding
atau Charset
benar-benar mengkodekan string. Seharusnya hanya menjadi representasi dari apa sebenarnya pengkodean itu.
Jadi, saya cenderung berpikir bahwa:
- Bukan
File
tanggung jawab kelas untuk membuka, membaca, atau menyimpan file. - Ini bukan
Xml
tanggung jawab kelas untuk membuat cerita bersambung sendiri. - Ini bukan
User
tanggung jawab kelas untuk meminta basis data. - dll.
Namun, jika kita meramalkan ide-ide ini, mengapa Object
harus ada toString
kelas? Bukan tanggung jawab Mobil atau Anjing untuk mengubah dirinya menjadi string, bukan?
Saya mengerti bahwa dari sudut pandang pragmatis, menyingkirkan toString
metode untuk keindahan mengikuti bentuk SOLID yang ketat, yang membuat kode lebih dapat dipertahankan dengan membuatnya tidak berguna, bukanlah pilihan yang dapat diterima.
Saya juga mengerti bahwa mungkin tidak ada jawaban yang pasti (yang lebih merupakan esai daripada jawaban yang serius) untuk ini, atau bahwa itu mungkin berdasarkan pendapat. Meskipun demikian saya masih ingin tahu apakah pendekatan saya benar-benar mengikuti apa sebenarnya prinsip tanggung jawab tunggal itu.
Apa tanggung jawab kelas?