หลังจากอ่านบทความชื่อ"รหัสบัญญัติ: วิธีปฏิบัติที่ดีที่สุดสำหรับการเข้ารหัส Objective-C" โดย Robert McNallyน้อยกว่าสองปีที่ผ่านมาเล็กน้อยฉันยอมรับการฝึกใช้คุณสมบัติสำหรับสมาชิกข้อมูลทุกคนในคลาส Objective-C ของฉัน ( บัญญัติที่ 3 ณ เดือนพฤษภาคม 2012) McNally แสดงเหตุผลเหล่านี้ในการทำเช่นนั้น (สิ่งที่ฉันให้ความสำคัญ):
- คุณสมบัติบังคับใช้ข้อ จำกัด การเข้าถึง (เช่นอ่านได้อย่างเดียว)
- คุณสมบัติบังคับใช้นโยบายการจัดการหน่วยความจำ (แข็งแรงอ่อนแอ)
- คุณสมบัติให้โอกาสในการใช้ setters และ getters แบบกำหนดเองอย่างโปร่งใส
- คุณสมบัติที่มี setters หรือ getters แบบกำหนดเองสามารถใช้เพื่อบังคับใช้กลยุทธ์ความปลอดภัยของเธรด
- การมีวิธีการเข้าถึงตัวแปรอินสแตนซ์เดียวช่วยเพิ่มความสามารถในการอ่านรหัส
ฉันใส่คุณสมบัติส่วนใหญ่ของฉันในหมวดหมู่ส่วนตัวดังนั้นหมายเลข 1 และ 4 มักจะไม่ใช่ปัญหาที่ฉันเรียกใช้ ข้อโต้แย้งที่ 3 และ 5 นั้นนุ่มนวลกว่าและด้วยเครื่องมือที่เหมาะสมและความสอดคล้องอื่น ๆ พวกเขาอาจกลายเป็นไม่ใช่ประเด็นปัญหา ในที่สุดสำหรับฉันข้อโต้แย้งที่มีอิทธิพลมากที่สุดคือหมายเลข 2 การจัดการหน่วยความจำ ฉันทำสิ่งนี้มานับ แต่นั้น
@property (nonatomic, strong) id object; // Properties became my friends.
สำหรับโปรเจ็กต์สุดท้ายของฉันฉันเปลี่ยนมาใช้ ARC ซึ่งทำให้ฉันสงสัยว่าการสร้างคุณสมบัติสำหรับอะไรที่สวยมากยังคงเป็นความคิดที่ดีหรืออาจจะฟุ่มเฟือยเล็กน้อย ARC ดูแลหน่วยความจำในการจัดการออบเจกต์ Objective-C ให้ฉันซึ่งสำหรับstrong
สมาชิกส่วนใหญ่จะใช้งานได้ดีถ้าคุณเพิ่งประกาศ ivars ประเภท C ที่คุณต้องจัดการด้วยตนเองก่อนและหลัง ARC และweak
คุณสมบัติส่วนใหญ่เป็นสาธารณะ
แน่นอนว่าฉันยังคงใช้คุณสมบัติสำหรับสิ่งใดก็ตามที่ต้องการการเข้าถึงจากนอกห้องเรียน แต่ส่วนใหญ่เป็นเพียงคุณสมบัติจำนวนหนึ่งในขณะที่สมาชิกข้อมูลส่วนใหญ่จะแสดงรายการเป็น ivars ภายใต้ส่วนหัวการนำไปใช้งาน
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
เป็นการทดลองที่ฉันทำนี้ค่อนข้างเข้มงวดมากขึ้นและการย้ายออกจากคุณสมบัติสำหรับทุกสิ่งมีผลข้างเคียงที่ดี
- ข้อกำหนดของรหัสข้อมูลสมาชิก (
@property
/@synthesize
) ย่อลงเหลือเพียงการประกาศ ivar - ส่วนใหญ่เป็นของการอ้างอิงการทำความสะอาดขึ้นเพียง
self.something
_something
- สามารถแยกแยะได้อย่างง่ายดายว่าสมาชิกข้อมูลใดเป็นส่วนตัว (ivars) และเป็นสาธารณะ (คุณสมบัติ)
- ท้ายที่สุดมัน 'รู้สึก' มากกว่านี้คือจุดประสงค์ที่แอปเปิลตั้งใจให้ แต่มันเป็นการคาดเดาแบบอัตนัย
ตามคำถาม : ฉันค่อยๆเลื่อนไปทางด้านมืดโดยใช้คุณสมบัติที่น้อยลงเพื่อสนับสนุนการใช้งาน - ivars คุณสามารถให้เหตุผลเล็กน้อยกับฉันได้ไหมว่าทำไมฉันถึงใช้คุณสมบัติสำหรับทุกสิ่งหรือยืนยันรถไฟแห่งความคิดปัจจุบันของฉันว่าทำไมฉันถึงควรใช้ ivars มากขึ้นและมีคุณสมบัติน้อยลงเมื่อจำเป็นเท่านั้น? คำตอบที่โน้มน้าวใจมากที่สุดสำหรับทั้งสองข้างจะได้รับเครื่องหมายของฉัน
แก้ไข: McNally ชั่งน้ำหนักใน Twitter พูดว่า : "ฉันคิดว่าเหตุผลหลักของฉันในการผสานกับคุณสมบัติคือ: วิธีหนึ่งที่จะทำทุกอย่างซึ่งทำทุกอย่าง (รวมถึง KVC / KVO)"