ผู้คนใช้จำนวนมากเมื่อเขียนโปรแกรมใน Objective C หรือไม่


13

สิ่งที่เกี่ยวข้อง: คำเตือน“ ส่ง 'const NSString *' ไปยังพารามิเตอร์ประเภท 'NSString *' ยกเลิกคำจำกัดความของคำบ่น

บางครั้งฉันคิดว่ามันมีประโยชน์ ฉันอาจต้องผ่านตารางและต้องการตรวจสอบให้แน่ใจว่าเนื้อหาของตารางไม่เปลี่ยนแปลง

อย่างไรก็ตามในที่สุดตัวอย่างโปรแกรม Objective-C, constผมไม่เคยเห็น คำถามของฉันคือทำไม

คำตอบ:


21

เนื่องจากวิธีการทำงานของ Objective-C constทำให้การบังคับใช้และเริ่มต้นเป็นสัญกรณ์สำหรับโปรแกรมเมอร์ พิจารณาโปรแกรมนี้:

int f(const int x) {
    return ++x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        int x = 3;
        NSLog(@"%d", f(x));
    }
    return 0;
}

ที่จริงแล้วจะไม่รวบรวมที่นี่ (ฉันใช้เสียงดังกราว): คอมไพเลอร์สามารถตรวจพบความพยายามในการแก้ไขประเภท C ดั้งเดิมและปล่อยข้อผิดพลาด แต่ตอนนี้เปรียบเทียบกับโปรแกรมนี้:

NSMutableString *f2(const NSMutableString * const x) {
    [x appendString: @" world!"];
    return x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSMutableString *x = [@"Hello" mutableCopy];
        NSLog(@"%@", f2(x));
    }
    return 0;
}

แม้ว่าฟังก์ชั่นจะถูกส่งผ่านตัวชี้ค่าคงที่ไปยังวัตถุคงที่ แต่ก็ยังสามารถกลายพันธุ์วัตถุได้

ในการเขียนโปรแกรมเชิงวัตถุวิธีที่ดีที่สุดในการบังคับใช้ลักษณะคงที่ของวัตถุคือทำให้วัตถุนั้นไม่เปลี่ยนรูปนั่นคือไม่มีวิธีการใดที่สามารถเปลี่ยนสถานะของวัตถุนั้นได้ ลองนึกภาพว่าฟังก์ชั่นด้านบนรับการNSStringโต้เถียงแทนNSMutableStringและฉันจะผ่านตัวอักษร@"Hello"แทนที่จะเป็นสำเนาที่ไม่แน่นอน ขณะนี้มีเหตุผลพูดไม่มีโอกาสที่จะกลายพันธุ์วัตถุที่ส่งผ่าน [*] Objective-C ไม่มีวิธีการบังคับใช้ที่แตกต่างconstหรือfinalอ้างอิงวัตถุในภาษา OO อื่น ๆ

สำหรับการเปรียบเทียบconstทำงานแตกต่างกันอย่างสิ้นเชิงใน C ++ ถ้าฉันได้รับการconstอ้างอิงถึงวัตถุ C ++ ฉันได้รับอนุญาตให้เรียกconstฟังก์ชันสมาชิกบนวัตถุนั้นเท่านั้น ฟังก์ชั่นเหล่านี้รักษาความconst-ness ของวัตถุโดยไม่ทำการเปลี่ยนแปลงใด ๆ หรือโดยการปรับเปลี่ยนตัวแปรสมาชิกที่ได้รับการทำเครื่องหมายmutableโดยนักออกแบบชั้นอย่างชัดเจน ลองจินตนาการว่าฉันมีบางประเภทMutableStringใน C ++ ที่เทียบเท่ากับNSMutableStringใน Objective-C ตัวอย่างที่ได้กล่าวมาข้างต้นมีลักษณะคล้าย:

MutableString& f3(const MutableString& x) {
  x.appendString(" world!");
  return x;
}

นี้แน่นอนจะไม่รวบรวม: นอกเหนือจากการappendString()ไม่เป็นconstการดำเนินงานฟังก์ชั่นเอาคัดเลือกจากการอ้างอิงชนิดที่ต้องใช้constconst_cast

[*] ฉันคาดหวังว่าจะมีวิธีการทำบางอย่างที่ขัดแย้งกัน แต่ตอนนี้เราเข้าสู่อาณาจักรของโปรแกรมเมอร์คนหนึ่งที่พยายามก่อวินาศกรรมอีกครั้งโดยการทำสิ่งที่ "ฉลาด"


ขอบคุณ ดังนั้นจึงไม่มีวิธีที่จะป้องกันการดัดแปลงผ่านตัวปรับแต่ง const
user4951

ขวา. คอมไพเลอร์ยังคงถือว่าการconstตกแต่งเป็นสิ่งที่มีความหมายดังนั้นคุณจะได้รับสิ่งต่าง ๆ เช่นนามแฝงหรือปลดเปลื้องเพื่อยับยั้งการเตือน แต่ไม่มีการเปลี่ยนแปลงพฤติกรรมของโปรแกรมอันเป็นผลมาจากความขัดแย้งเหล่านี้

5
ฉันเชื่อว่าconstยังคงมีประโยชน์ใน Objective C เพื่อระบุว่าตัวชี้ไปยังวัตถุนั้นไม่เคยถูกกำหนดให้ชี้ไปยังวัตถุอื่น คือNSString * const xคุณรู้ว่ามันxจะเป็นสายเดียวกันเสมอและไม่ใช่สายอื่น
tboyce12

3

เท่าที่ Objective C ดำเนินไป - ฉันไม่ได้เขียนโปรแกรมดังนั้นไม่สามารถตอบคำถามได้ คำถามที่ฉันสามารถตอบได้คือ "ผู้คนควรใช้constมากเมื่อเขียนโปรแกรมใน Objective C หรือไม่" - อันนั้นแน่นอนว่า "ใช่"

Constness นั้นเป็นคุณสมบัติด้านความปลอดภัยของซอฟต์แวร์ที่ใช้ในการทำให้โปรแกรมมีความน่าเชื่อถือและการบำรุงรักษามากขึ้น โปรแกรมเมอร์จำนวนมากเติบโตขึ้นมาโดยไม่ได้จริงๆเห็นคุณค่าค่าของconsts จนกระทั่งวันหนึ่งสิ่งที่ไม่ดีเกิดขึ้นและพวกเขามี "อาฮ่า" ช่วงเวลา - "โอ้ว่าเป็นสิ่งที่constถูกนำมาใช้สำหรับ" เป็นไปได้ทั้งหมดที่จะเขียนโปรแกรมโดยไม่มีค่าคงที่เป็นไปไม่ได้ที่จะทำให้โปรแกรมนั้นเชื่อถือได้

ตัวอย่างโค้ดจำนวนมากไม่ใช่โปรแกรมจริงๆเป็นเพียงตัวอย่างข้อมูลที่ออกแบบมาเพื่อแสดงคุณสมบัติเฉพาะ พวกเขาไม่ได้ใช้constเนื่องจากมันเบี่ยงเบนความสนใจจากจุดที่กลุ่มตัวอย่างพยายามทำ อีกประเภทของรหัสที่คุณเห็นคือโค้ดที่เขียนโดยโปรแกรมเมอร์ที่ไม่มีประสบการณ์ซึ่งเป็นพื้นฐานของสิ่งที่พวกเขาทำในตัวอย่างที่เรียนรู้หรือที่รู้เกี่ยวกับค่าคงที่และขี้เกียจเกินกว่าจะใช้งานได้


0

ฉันไม่ได้ใช้วัตถุประสงคเป็นเวลานาน

อย่างไรก็ตามฉันสงสัยว่าทำไมไม่มีร่างกายพูดถึงแง่มุมนี้

วัตถุประสงค์ -c มีสิ่งอื่นที่เกี่ยวข้องกับค่าคงที่แล้ว ความไม่แน่นอน

ตัวอย่างเช่น Nstring * จะชี้ไปที่สตริงคงที่ หากคุณต้องการสตริงที่คุณสามารถปรับเปลี่ยนได้คุณใช้ NMutableString หรืออะไรทำนองนั้น NMutableString นั้นจะจัดเตรียมวิธีการเพิ่มเติมที่อนุญาตให้ผู้ใช้แก้ไขสตริง

ทีนี้ถ้าคุณต้องการให้ตัวชี้เป็นค่าคงที่ล่ะ ฉันไม่ต้องกังวลเกี่ยวกับสิ่งนั้นในขณะที่เขียนโครงการขนาดใหญ่มาก

ดังนั้นฉันคิดว่านั่นเป็นเหตุผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.