Tôi đang tái cấu trúc một chút mã truy cập dữ liệu C# từ nhà phát triển trước và tò mò về mẫu mà anh ấy đã sử dụng.Bất kỳ lợi thế nào đối với đối tượng.GetObject (i) trên đối tượng [i]?
Mã ban đầu được trưng bày các bộ sưu tập (mảng) của một loạt các đối tượng kinh doanh kiểu ActiveRecord - về cơ bản các đối tượng bao quanh các trường cơ sở dữ liệu. Tôi đang thay đổi mảng thành danh sách chung, nhưng khía cạnh của mã tôi tò mò là nhà phát triển trước đó đã Nhận các phương thức cho từng loại đối tượng mà anh ta gói, như vậy:
public Thing GetThing(int i) {
return things[i];
}
Có một số của những phương pháp này, và tôi không thể cho cuộc sống của tôi nghĩ về bất kỳ lợi thế có thể có của việc sử dụng cơ chế đó đơn giản chỉ đề cập đến những thứ [i] trực tiếp. Giả sử, vì lợi ích của đối số, rằng mọi thứ là tài sản công cộng, không phải là trường công khai (trong trường hợp này nó thực sự là thuộc tính được tự động triển khai, vì vậy giả định đó thực sự là đúng).
Tôi có thiếu thứ gì đó hiển nhiên không? Hoặc thậm chí một cái gì đó bí truyền?
CẬP NHẬT tôi có lẽ nên làm rõ rằng những bộ sưu tập hiện đang truy cập từ bên trong cho vòng:
for (int i = 0; i < thingsCount; i==) {
dosomthing(GetThing(i));
dosomethingelse(GetThing(i));
}
mà tôi đang refactoring để:
for (int i = 0; i < thingsCount; i==) {
Thing thing = things[i];
dosomthing(thing);
dosomethingelse(thing);
}
và thậm chí sử dụng những thứ. cho mỗi().
Suy nghĩ qua phản ứng của Elpezmuerto tôi đã đi đến kết luận chính xác này - mặc dù tôi đang phơi bày * bộ sưu tập * như các thuộc tính với {get; private set;} một khi tôi nhận được bộ sưu tập, tôi có thể sửa đổi nó bằng cách gọi mã theo những cách không có ý nghĩa gì cả. Nhà phát triển trước có những điểm tiếp xúc được bảo vệ, vì vậy điểm 1 của bạn không liên quan đến trường hợp của tôi, nhưng anh ấy gọi cho GetThing (i) nhiều lần trong mỗi vòng lặp mà tôi đồng ý không có ý nghĩa. Có vẻ như refactor tốt nhất là để lại phương thức GetThing(), nhưng chỉ gọi chúng một lần. Cảm ơn! – cori
@cori: Có, một lỗi thực sự phổ biến mà nhà phát triển thực hiện trong việc thiết kế lớp học của họ là hiển thị trực tiếp các bộ sưu tập có thể thay đổi mà không tính đến điều gì có thể xảy ra nếu/khi các bộ sưu tập đó được sửa đổi. Nếu bạn chỉ muốn bật mã gọi để liệt kê và không sửa đổi bộ sưu tập, hãy hiển thị một 'IEnumerable 'và không, ví dụ:' Danh sách '! –
@cori: Tôi sẽ thừa nhận nó khá bực bội, tuy nhiên, khi bạn muốn cho phép truy cập ngẫu nhiên theo chỉ mục nhưng không phải tất cả các tính năng khác của giao diện 'IList' hoặc thậm chí là 'T []' (cho phép bạn đặt các mục) , không chỉ nhận được chúng). Điều này thực sự là một cái gì đó tôi hỏi về [một câu hỏi cũ của riêng tôi] (http://stackoverflow.com/questions/2110440/why-is-there-no-iarrayt-interface-in-net) một trong khi trở lại. –