ฉันสงสัยอยู่ตลอดว่าจะใช้กริยาที่ถูกต้องตามคำนามใน OOP หรือไม่
ฉันเจอบทความที่ยอดเยี่ยมนี้แต่ฉันก็ยังไม่เห็นด้วยกับประเด็นที่ทำ
เพื่ออธิบายปัญหาที่เกิดขึ้นอีกเล็กน้อยรัฐบทความที่ว่ามีไม่ควรจะเป็นตัวอย่างเช่นFileWriter
ชั้น แต่เนื่องจากการเขียนคือการกระทำที่มันควรจะเป็นวิธีการFile
ของการเรียน คุณจะได้รับรู้ว่ามันมักจะขึ้นอยู่กับภาษาเนื่องจากโปรแกรมเมอร์ Ruby อาจต่อต้านการใช้FileWriter
คลาส (Ruby ใช้วิธีFile.open
การเข้าถึงไฟล์) ในขณะที่โปรแกรมเมอร์ Java ไม่ต้องการ
มุมมองส่วนบุคคลของฉัน (และใช่ต่ำต้อยมาก) คือการทำเช่นนั้นจะทำลายหลักการความรับผิดชอบเดี่ยว เมื่อฉันตั้งโปรแกรมใน 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 );
}
}
?>
มันเป็นความเข้าใจของฉันที่ DataHandler ต่อท้ายไม่ได้เพิ่มอะไรที่เกี่ยวข้อง ; แต่ประเด็นก็คือหลักการความรับผิดชอบเดี่ยวบอกเราว่าวัตถุที่ใช้เป็นแบบจำลองที่มีข้อมูล (อาจเรียกว่า Record) ไม่ควรมีความรับผิดชอบในการทำแบบสอบถาม SQL และการเข้าถึงฐานข้อมูล วิธีนี้จะทำให้รูปแบบ ActionRecord ที่ใช้สำหรับ Ruby on Rails ไม่ถูกต้อง
ฉันเจอรหัส C # นี้ (ภาษาอยุ่, ภาษาวัตถุที่สี่ที่ใช้ในโพสต์นี้) เมื่อวันก่อน:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
และฉันต้องบอกว่ามันไม่สมเหตุสมผลกับฉันมากนักว่าคลาสEncoding
หรือCharset
คลาสจะเข้ารหัสสตริง มันควรจะเป็นตัวแทนของสิ่งที่เข้ารหัสจริงๆ
ดังนั้นฉันมักจะคิดว่า:
- ไม่ใช่
File
ความรับผิดชอบของคลาสในการเปิดอ่านหรือบันทึกไฟล์ - ไม่ใช่
Xml
ความรับผิดชอบของคลาสในการทำให้เป็นอนุกรม - ไม่ใช่
User
ความรับผิดชอบของคลาสในการสืบค้นฐานข้อมูล - เป็นต้น
อย่างไรก็ตามถ้าเราประเมินความคิดเหล่านี้ทำไมจะObject
มีtoString
ชั้นเรียน มันไม่ใช่ความรับผิดชอบของ Car หรือ Dog ในการแปลงตัวมันเองให้เป็นสตริงตอนนี้ใช่ไหม?
ฉันเข้าใจว่าจากมุมมองในทางปฏิบัติการกำจัดtoString
วิธีเพื่อความสวยงามในการทำตามรูปแบบโซลิดที่เข้มงวดซึ่งทำให้โค้ดสามารถบำรุงรักษาได้มากขึ้นโดยทำให้ไร้ประโยชน์ไม่ใช่ตัวเลือกที่ยอมรับได้
ฉันเข้าใจด้วยว่าอาจไม่มีคำตอบที่แน่นอน (ซึ่งจะเป็นบทความมากกว่าคำตอบที่จริงจัง) สำหรับเรื่องนี้หรืออาจเป็นไปตามความคิดเห็น อย่างไรก็ตามฉันยังต้องการทราบว่าแนวทางของฉันเป็นไปตามหลักการความรับผิดชอบเดี่ยวหรือไม่
ความรับผิดชอบของชั้นเรียนคืออะไร?