Mọi người có sử dụng const rất nhiều khi lập trình trong Objective C không?


13

Liên quan: Gửi tin nhắn 'const NSString *' đến tham số loại 'NSString *' loại bỏ cảnh báo vòng loại Cảnh báo

Đôi khi, tôi nghĩ rằng nó hữu ích mặc dù. Tôi có thể cần phải vượt qua một bảng và muốn đảm bảo rằng nội dung của bảng không thay đổi.

Tuy nhiên, trong hầu hết các mẫu chương trình Objective-C, tôi không bao giờ thấy const. Câu hỏi của tôi là tại sao?

Câu trả lời:


21

Do cách thức hoạt động của các đối tượng Objective-C, consttừ bỏ việc thực thi và bắt đầu trở thành một ký hiệu cho lập trình viên. Hãy xem xét chương trình này:

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

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

Điều đó thực sự sẽ không được biên dịch ở đây (tôi đang sử dụng clang): trình biên dịch có thể phát hiện nỗ lực sửa đổi loại C nguyên thủy và phát ra lỗi. Nhưng bây giờ so sánh nó với chương trình này:

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;
}

Mặc dù hàm được truyền một con trỏ không đổi đến một đối tượng không đổi, nhưng vẫn có thể biến đổi đối tượng.

Trong lập trình hướng đối tượng, cách tốt nhất để thực thi tính chất không đổi của đối tượng là làm cho đối tượng đó không thay đổi - tức là không cung cấp bất kỳ phương thức nào có thể thay đổi trạng thái của nó. Hãy tưởng tượng rằng hàm trên đã lấy một NSStringđối số thay vì NSMutableStringvà tôi đã chuyển qua nghĩa đen @"Hello"thay vì một bản sao có thể thay đổi. Hiện tại, nói một cách hợp lý, không có cơ hội đột biến đối tượng truyền vào [*]. Objective-C không có bất kỳ cách nào để thực thi điều đó, không giống như consthoặc finaltham chiếu đối tượng trong các ngôn ngữ OO khác.

Để so sánh, consthoạt động hoàn toàn khác nhau trong C ++. Nếu tôi nhận được một consttham chiếu đến một đối tượng C ++, tôi chỉ được phép gọi các consthàm thành viên trên đối tượng đó. Các hàm này bảo vệ tính constchất của đối tượng, bằng cách không thực hiện bất kỳ thay đổi nào hoặc chỉ sửa đổi các biến thành viên đã được đánh dấu rõ ràng mutablebởi trình thiết kế lớp. Vì vậy, hãy tưởng tượng rằng tôi đã có một số loại MutableStringtrong C ++ tương đương với NSMutableStringObjective-C. Tương đương với ví dụ của tôi ở trên sẽ trông giống như:

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

Điều này chắc chắn sẽ không được biên dịch: ngoài việc appendString()không phải là một consthoạt động, hàm sẽ loại bỏ constvòng loại khỏi tham chiếu loại yêu cầu a const_cast.

[*] Tôi hy vọng có một số cách làm trái ngược, nhưng bây giờ chúng ta vào vương quốc của một lập trình viên đang cố gắng phá hoại người khác bằng cách làm những việc "thông minh".


Cảm ơn. Vì vậy, không có cách nào để ngăn chặn sửa đổi thông qua sửa đổi const.
dùng4951

Đúng. Trình biên dịch vẫn coi việc consttrang trí là có ý nghĩa để bạn có được các mâu thuẫn như bí danh hoặc diễn viên để ngăn chặn các cảnh báo, nhưng không có thay đổi nào đối với hành vi của chương trình do những mâu thuẫn này.

5
Tôi tin rằng constvẫn có thể hữu ích trong Mục tiêu C để nói rằng con trỏ tới một đối tượng không bao giờ được gán để trỏ đến một đối tượng khác . Tức là với NSString * const xbạn biết rằng xsẽ luôn là cùng một chuỗi và không phải là một chuỗi khác nhau.
tboyce12

3

Theo như Mục tiêu C - Tôi không lập trình trong đó, vì vậy không thể trả lời câu hỏi. Câu hỏi tôi có thể trả lời là "Mọi người có nên sử dụng constnhiều khi lập trình trong Objective C không?" - đó là một "Có" nhất định.

Constness về cơ bản là một tính năng bảo mật phần mềm được sử dụng để làm cho các chương trình trở nên đáng tin cậy và dễ bảo trì hơn. Nhiều lập trình viên lớn lên mà không thực sự đánh giá cao giá trị của consts, cho đến một ngày có điều gì đó tồi tệ xảy ra và họ có một khoảnh khắc "Ah ha" - "Ồ, đó là những gì constđược sử dụng cho". Hoàn toàn có thể viết một chương trình không có hằng số, hầu như không thể làm cho chương trình đó trở nên đáng tin cậy.

Nhiều mẫu mã không thực sự là chương trình, chỉ là các đoạn được thiết kế để hiển thị một tính năng cụ thể. Họ không sử dụng constvì nó làm mất tập trung từ điểm mà mẫu đang cố gắng thực hiện. Loại mã khác mà bạn thấy là mã được viết bởi các lập trình viên thiếu kinh nghiệm, những người dựa trên những gì họ đã học được từ những ví dụ họ đã học được hoặc những người biết về hằng số và quá lười sử dụng chúng.


0

Tôi đã không sử dụng object-c trong một thời gian rất dài.

Tuy nhiên, tôi tự hỏi tại sao không có cơ thể đề cập đến khía cạnh này.

Mục tiêu-c đã có một cái gì đó khác liên quan đến hằng số. Khả năng biến đổi

Ví dụ: N Chuỗi * sẽ trỏ đến một chuỗi không đổi. Nếu bạn muốn một chuỗi bạn có thể sửa đổi, bạn sử dụng NMutableString hoặc một cái gì đó tương tự. Đó là NMutableString sẽ cung cấp các phương thức bổ sung cho phép mọi người sửa đổi chuỗi.

Bây giờ, những gì về nếu bạn muốn con trỏ là một hằng số. Tôi không bao giờ phải lo lắng về điều đó trong khi mã hóa một dự án rất lớn.

Vì vậy, tôi nghĩ đó là lý do tại sao.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.