พื้นหลัง
ฉันกำลังอ่าน "หนังสือรหัสสะอาด" และใน paralel ฉันกำลังทำงานกับวัตถุแบบคาลินิเทนิกกะตะเช่นบัญชีธนาคารและฉันติดอยู่กับกฎนั้น:
กฎข้อที่ 9 ของวัตถุแบบคาลิสฟีนิกคือเราไม่ใช้ทะลุหรือเซ็ตเตอร์
ดูเหมือนจะสนุกมากและฉันเห็นด้วยกับหลักการนี้ ยิ่งไปกว่านั้นที่หน้า 98-99 ของ Clean Code ผู้เขียนอธิบายว่า getters / setters ทำลายสิ่งที่เป็นนามธรรมและเราไม่ต้องถามวัตถุของเรา แต่เราต้องบอกวัตถุของเรา
มันทำให้รู้สึกที่สมบูรณ์แบบในใจของฉันและฉันเห็นด้วยกับหลักการนี้อย่างเต็มที่ ปัญหาเกิดขึ้นในทางปฏิบัติ
บริบท
ตัวอย่างเช่นฉันมีแอปพลิเคชันที่ฉันจะต้องแสดงรายชื่อผู้ใช้บางส่วนและเพื่อแสดงรายละเอียดผู้ใช้
ผู้ใช้ของฉันประกอบด้วย:
-> Name
--> Firstname --> String
--> Lastname --> String
-> PostalAddress
--> Street --> String
--> PostalCode --> String
ปัญหา
ฉันจะทำอย่างไรหรือฉันจะทำอย่างไรเพื่อหลีกเลี่ยง getters เมื่อฉันเพียงต้องการแสดงข้อมูลอย่างง่าย ๆ ( และฉันต้องยืนยันว่าฉันไม่ต้องการการดำเนินการเพิ่มเติมในฟิลด์นั้น ) เพื่อแสดงค่าชื่อในแบบง่าย ๆ ( สุ่ม) รองรับเอาต์พุตหรือไม่
เกิดอะไรขึ้นในใจฉัน
ทางออกหนึ่งคือ:
user.getName().getFirstName().getStringValue()
ซึ่งเป็นสิ่งที่น่ากลัวอย่างสิ้นเชิงทำลายกฎของวัตถุที่มีความสงบและกฎของ Demeter
อีกคนหนึ่งจะเป็นสิ่งที่ชอบ:
String firstName = user.provideFirstnameForOutput();
// That would have called in the user object =>
String firstName = name.provideFirstnameForOutput();
// That would have called in the name object =>
String firstName = firstname.provideFirstnameForOutput();
แต่ฉันรู้สึกไม่สบายใจกับวิธีแก้ปัญหานี้ซึ่งดูเหมือนจะเป็น "access order ที่สูงกว่า" เท่านั้นเช่นการข้ามทะลุมาตรฐาน / setter ด้วยวิธีการที่มีจุดประสงค์เพื่อให้ตรงกับกฎหมาย Demeter ...
ความคิดใด ๆ