Cấu trúc và trường trần sẽ giảm khả năng tương tác với một số API không được quản lý. Thường thì bạn sẽ thấy rằng API cấp thấp muốn truy cập các giá trị bằng cách tham chiếu, điều này tốt cho hiệu suất (vì chúng tôi tránh một bản sao không cần thiết). Sử dụng các thuộc tính là một trở ngại cho điều đó và thường thì các thư viện trình bao bọc sẽ thực hiện các bản sao để dễ sử dụng và đôi khi để bảo mật.
Do đó, bạn sẽ thường có hiệu suất tốt hơn khi có các loại vectơ và ma trận không có thuộc tính nhưng các trường trần trụi.
Thực hành tốt nhất là không tạo ra trong vắc-xin. Mặc dù một số giáo phái hàng hóa, nói chung thực hành tốt nhất là có lý do tốt.
Trong trường hợp này, chúng tôi có một cặp vợ chồng:
Một thuộc tính cho phép bạn thay đổi việc triển khai mà không thay đổi mã máy khách (ở cấp nhị phân, có thể thay đổi trường thành thuộc tính mà không thay đổi mã máy khách ở cấp nguồn, tuy nhiên, nó sẽ biên dịch sang thứ khác sau khi thay đổi) . Điều đó có nghĩa là, bằng cách sử dụng một thuộc tính từ đầu, mã tham chiếu của bạn sẽ không phải được biên dịch lại chỉ để thay đổi nội dung của thuộc tính đó.
Nếu không phải tất cả các giá trị có thể có của các trường thuộc loại của bạn là trạng thái hợp lệ, thì bạn không muốn đưa chúng ra mã máy khách mà mã đó sửa đổi nó. Do đó, nếu một số kết hợp các giá trị không hợp lệ, bạn muốn giữ các trường riêng tư (hoặc nội bộ).
Tôi đã nói mã khách hàng. Điều đó có nghĩa là mã gọi vào của bạn. Nếu bạn không làm thư viện (hoặc thậm chí làm thư viện mà sử dụng nội bộ thay vì công khai), bạn thường có thể thoát khỏi nó và một số kỷ luật tốt. Trong tình huống đó, cách tốt nhất để sử dụng các thuộc tính là có để ngăn bạn tự bắn vào chân mình. Hơn nữa, lý do về mã sẽ dễ dàng hơn nhiều nếu bạn có thể thấy tất cả các vị trí mà một trường có thể thay đổi trong một tệp duy nhất, thay vì phải lo lắng về bất cứ điều gì hay không nó đang được sửa đổi ở một nơi khác. Trong thực tế, các thuộc tính cũng tốt để đặt các điểm dừng khi bạn đang tìm ra điều gì sai.
Vâng, có giá trị là nhìn thấy những gì đang được thực hiện công nghiệp int. Tuy nhiên, bạn có động lực để đi ngược lại các thực tiễn tốt nhất không? hoặc bạn đang đi ngược lại các thực tiễn tốt nhất - làm cho mã khó lý luận hơn - chỉ vì ai đó đã làm điều đó? À, nhân tiện, "người khác làm việc đó" là cách bạn bắt đầu một giáo phái vận chuyển hàng hóa.
Vậy ... trò chơi của bạn có chạy chậm không? Bạn nên dành thời gian để tìm ra nút thắt cổ chai và khắc phục điều đó, thay vì suy đoán nó có thể là gì. Bạn có thể yên tâm rằng trình biên dịch sẽ thực hiện nhiều tối ưu hóa, vì điều đó, rất có thể bạn đang nhìn vào vấn đề sai.
Mặt khác, nếu bạn đang quyết định bắt đầu làm gì, bạn nên lo lắng về thuật toán và cấu trúc dữ liệu nào trước, thay vì lo lắng về các chi tiết nhỏ hơn như trường so với thuộc tính.
Cuối cùng, bạn có kiếm được một cái gì đó bằng cách đi ngược lại các thực tiễn tốt nhất?
Đối với các chi tiết của trường hợp của bạn (Unity và Mono cho Android), Unity có lấy giá trị bằng cách tham chiếu không? Nếu không, nó sẽ sao chép các giá trị bằng mọi giá, không có hiệu suất đạt được ở đó.
Nếu có, nếu bạn chuyển dữ liệu này tới API có tham chiếu. Liệu nó có ý nghĩa để làm cho trường công khai hay bạn có thể làm cho loại có thể gọi API trực tiếp?
Vâng, tất nhiên, có thể có những tối ưu hóa mà bạn có thể làm bằng cách sử dụng các cấu trúc với các trường trần. Ví dụ: bạn truy cập chúng bằng con trỏ Span<T>
hoặc tương tự. Chúng cũng nhỏ gọn trên bộ nhớ, giúp chúng dễ dàng tuần tự hóa để gửi qua mạng hoặc lưu trữ vĩnh viễn (và vâng, đó là những bản sao).
Bây giờ, bạn đã chọn đúng thuật toán và cấu trúc, nếu chúng biến thành một nút cổ chai, thì bạn quyết định cách tốt nhất để khắc phục nó ... đó có thể là cấu trúc với các trường trần hay không. Bạn sẽ có thể lo lắng về điều đó nếu và khi nó xảy ra. Trong khi đó, bạn có thể lo lắng về những vấn đề quan trọng hơn như làm cho một trò chơi hay hoặc thú vị đáng chơi.