Liệu chi phí phương thức của object-c có làm cho phương pháp thiết kế 'nhiều phương thức nhỏ' không thể thực hiện được không?


15

Tôi thường thích sử dụng các phương pháp nhỏ, theo khuyến nghị của, trong số những người khác, Bob Martin trong Clean Code . Tôi cũng đã đọc đủ về nội bộ của Objective-C để có ít nhất một số ý tưởng về cách thức gửi tin nhắn của nó hoạt động ( loạt bbums đặc biệt nhiều thông tin về điều này).

Tuy nhiên, tối ưu hóa mối quan tâm sớm, tôi muốn biết liệu tất cả những gì mà Objective-c làm với objc_msgSend, về mặt thực tế, có đủ ý nghĩa đối với phương pháp 'nhiều phương pháp nhỏ' không phù hợp với các dự án Objective-C không.

Kết quả thực nghiệm đặc biệt được hoan nghênh (đôi khi tôi sẽ tự mình thiết lập một bài kiểm tra). Kinh nghiệm từ bất cứ ai đã viết các dự án mục tiêu lớn cũng sẽ rất tuyệt.

Làm rõ

Giọng điệu chung của câu hỏi là có chủ ý. Tôi không hỏi về việc điều chỉnh hiệu suất của các ứng dụng cụ thể (đó là lý do tại sao tôi hỏi ở đây thay vì trên SO), nhưng nhiều hơn về việc liệu các đặc điểm ngôn ngữ của Objective-C có khuyến khích một phương pháp thiết kế nhất định hay không. Tôi đã quan sát thấy rằng phần lớn mã tôi đã thấy từ Apple và các bên khác (trên github, v.v.) có xu hướng hướng tới các phương thức lớn (và các lớp) và tôi tự hỏi liệu đây có phải là sự thiên vị đã xuất hiện vì ngôn ngữ chinh no. Tất nhiên tôi có thể đã đọc sai mã, hoặc nó có thể là văn hóa hơn là các yếu tố kỹ thuật đã dẫn đến xu hướng nếu nó tồn tại.

(Để biết giá trị của nó, tôi hiện đang viết Objective-C và tôi đang sử dụng các phương thức nhỏ)

Yêu cầu thêm

Tôi đồng ý với cả hai câu trả lời đã được đưa ra. Một điều nữa tôi muốn là cho ai đó chỉ cho tôi một cơ sở mã nguồn Objective-C (hoặc có thể nhìn thấy rõ) khác sử dụng các phương thức ngắn (và các lớp nhỏ). Tôi chưa thấy bất cứ điều gì trong Objective-C để so sánh với (ví dụ) nguồn fitnesse .


1
Mike Ash có một số cặp bài đăng đẹp hiển thị số cho LeopardiOS . Tôi đã không tiêu hóa hết những thứ này, nhưng dường như đối với các bộ nhớ cache được lưu trong bộ nhớ cache là không đáng kể và ngay cả trong các công văn yêu cầu tìm kiếm, nó khá nhỏ. Nếu ấn tượng nhanh này là đúng, có vẻ như các phương thức nhỏ có thể đứng hoặc rơi trên cùng một cơ sở thiết kế trong ObjC như trong bất kỳ ngôn ngữ nào khác.
Cris

1
Nếu bạn muốn tránh chi phí đó, hãy sử dụng các hàm C.
đúng

Về mặt kỹ thuật có thể, nhưng mất rất nhiều chức năng. Tôi sẽ chỉ thay thế các phương thức bằng các hàm cho các phần mã được nhắm mục tiêu, nhạy cảm với hiệu suất. Tôi đang hỏi ở đây về việc liệu chi phí có đủ vấn đề để xem xét lại phong cách thiết kế / mã hóa ưa thích hay không.
Cris

Xem Chi phí gửi tin nhắn trong Mục tiêu-C trên SO để biết một số câu trả lời hay.
Caleb

Tại sao bạn không chỉ đơn giản là hồ sơ mã của bạn trong Xcode? Tôi hiểu rằng bạn đang hỏi một cách trừu tượng chứ không phải về mã cụ thể, nhưng vì rõ ràng bạn đã có một số mã với rất nhiều phương thức nhỏ, tại sao bạn không chạy nó và tự mình xem?
Caleb

Câu trả lời:


4

Tôi thực sự không biết liệu chi phí có đáng kể hay không. Nhưng, tôi muốn thiết kế một hệ thống để dễ hiểu và dễ bảo trì trước tiên , và điều đó thường có nghĩa là các phương thức và lớp nhỏ, tập trung. Điều này thậm chí sẽ giúp điều chỉnh mã tiếp theo (chỉ vì mã dễ bảo trì hơn). Ngoài ra, điều quan trọng là lập hồ sơ mã để tìm các tắc nghẽn thực sự, thậm chí có thể không liên quan đến chi phí cuộc gọi phương thức. Nếu bạn thực hiện bất kỳ hoạt động ngoài quy trình nào (ví dụ như các cuộc gọi đến cơ sở dữ liệu, mạng, hệ thống tệp), thì chúng có xu hướng chi phối thời gian chạy của chương trình.

Nhưng, như thường lệ, số dặm của bạn có thể thay đổi ...


Tất nhiên tôi đồng ý với tất cả những điều này (xem phần giới thiệu 'Chú Bob' trong câu hỏi). Nhưng nếu một ngôn ngữ nói chung không cho vay theo cách tiếp cận thiết kế trường hợp tốt nhất, các lập trình viên có thể đưa ra các lựa chọn khác. Tôi chưa thấy nhiều mã Objective-C thực sự tuân theo các phương thức nhỏ (và các lớp, cho cách tiếp cận vấn đề đó), và đang tự hỏi tại sao. Tôi sẽ thêm một ghi chú cho câu hỏi.
Khủng hoảng

@Cris: "Tôi chưa thấy nhiều mã Objective-C thực sự tuân theo các phương thức nhỏ" -> Chỉ tò mò: từ cơ thể mã nào bạn đã rút ra kết luận như vậy? Tôi tin vào điều đó, nhưng tôi cũng tin rằng không phải vì nhận thức tối ưu hóa vi mô, mà nhiều lập trình viên không tập trung vào các nguyên lý của thiết kế tốt và khả năng bảo trì. Đặt nó theo một cách khác, Java, C #, Ruby hoặc bất kỳ mã nào của họ phải tuân theo các thực tiễn tương tự ...
Jordão

Vâng, điều đó hoàn toàn có thể. Tôi không có bất kỳ cơ sở mã hóa cụ thể nào trong tâm trí; chỉ là những gì tôi đã xem trong năm hoặc lâu hơn tôi đã làm việc với Objective-C. Bộ mã lớn nhất mà tôi đã xem là công cụ nguồn mở của nhóm Omni và IIRC có rất nhiều phương thức lớn. Mã mẫu của Apple cũng thường làm như vậy. Nhưng tất nhiên (a) mã mẫu chỉ là như vậy và (b) mẫu của tôi có thể có trọng số đối với mã UI, đặc biệt là các bộ điều khiển xem và các mã này có thể được mã hóa khác với các lớp sâu hơn.
Khủng hoảng

2

Phần lớn mã sẽ không quan trọng về hiệu năng trong bất kỳ ứng dụng nào , vì vậy ngay cả khi chi phí phương thức là đáng kể so với các ngôn ngữ khác, cách tiếp cận tối ưu vẫn sẽ có nhiều phương thức nhỏ ở hầu hết các phương thức và chỉ nội tuyến đã được chỉ ra là quan trọng về hiệu suất.

Tất nhiên, có nhiều người không biết cách tối ưu hóa đúng cách và một số người có thể biết về chi phí phương pháp và tham gia vào các hành động tối ưu hóa sớm toàn cầu, nhưng tôi không tin rằng nhóm đó đủ lớn để có tác động đáng kể trên hệ sinh thái Objective-C.

Các phương pháp và lớp học lớn có nhiều khả năng là công việc của một nhóm lớn những người không biết hoặc không quan tâm đến hồ sơ, phương pháp hay thiết kế phù hợp, và những người sẽ có xu hướng tạo ra Big Balls of Mud bằng bất kỳ ngôn ngữ nào . Và vâng, một số người làm việc trên các cơ sở mã cao cấp trong các công ty phần mềm lớn.

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.