2013-05-14 26 views
20

Trong các năm lập trình của tôi, tôi thường tạo các lớp chỉ đơn giản là nhóm một vài biến với bộ định vị và getters của chúng. Tôi đã thấy các loại đối tượng này được gọi là đối tượng giá trị, đối tượng miền hoặc đối tượng mô hình tùy thuộc vào ngữ cảnh mà chúng được sử dụng. Thuật ngữ phù hợp nhất để sử dụng chung có vẻ là đối tượng chuyển dữ liệu (DTO). Điều này mô tả POJO chỉ chứa trình truy cập và trình tắt.Các trường công cộng trong một đối tượng truyền dữ liệu

Tôi vừa viết một đối tượng như vậy chứa khoảng năm mươi trường được sử dụng để đặt thông số chủ đề trên biểu đồ. Bây giờ tôi tự hỏi nếu thay vì tạo ra một trăm getters và setters tôi chỉ cần khai báo các lĩnh vực này là công cộng. Làm như vậy đi ngược lại tất cả mọi thứ bản năng lập trình của tôi cho tôi biết nhưng tôi không thể phủ nhận rằng nó sẽ làm tăng đáng kể khả năng đọc mã của tôi và giảm số lượng mã boilerplate trong lớp.

Lý do duy nhất tôi có thể thấy không để sử dụng các trường công khai sẽ là nếu tôi cần thực hiện bất kỳ loại xác thực nào trên các trường này. Nếu chúng ta giả định rằng xác nhận kiểu là đủ cho các mục đích của tôi, thì việc sử dụng các trường công khai trong kịch bản này có thể chấp nhận được từ thiết kế hướng đối tượng không? Liệu một DTO công khai sẽ hoạt động tốt hơn trong các hoạt động hàng loạt lớn?

+0

có thể trùng lặp - http://stackoverflow.com/questions/1568091/why-use-getters-and-setters – sanbhat

+0

Getters và setters được yêu cầu nếu bạn cố gắng sử dụng các khung 'DI' như' Spring' hoặc một cái gì đó như 'jsp: useBean' etc !!! – NINCOMPOOP

+0

@sanbhat: một số lý do được đưa ra trong câu trả lời được chấp nhận cho câu hỏi đó áp dụng ở đây nhưng không phải tất cả. Phạm vi và hành vi của DTO khác với một lớp chung vì vậy tôi đã tự hỏi nếu "quy tắc" khác nhau sẽ áp dụng ở đây. – Lilienthal

Trả lời

23

Hầu hết các lập trình viên sẽ mặc định là các trường riêng với getters/setters mà không cần suy nghĩ về nó. Nhưng cũng giống như bất kỳ điều gì khác, điều tốt hơn là đưa ra quyết định có ý thức.

Lý do chính để sử dụng kết hợp getter/setter thay vì trường công khai là bạn có thể thay đổi định nghĩa. Vì vậy, nếu DTO của bạn là một phần của giao diện giữa các thành phần, tốt nhất để sử dụng getters. Nếu bạn thay đổi các hoạt động bên trong, bạn có thể điều chỉnh bộ thu thập để bắt chước hành vi cũ và duy trì tính tương thích.

Lý do khác là bạn có thể tạo trường chỉ đọc. Thường đối với DTO, chỉ đọc và không thay đổi là một lựa chọn tốt.

Lý do thứ ba có thể là DTO của bạn cần phải là javabean vì bạn định sử dụng nó trong một số công cụ yêu cầu nó.

Nếu không có thuộc tính nào trong số này thuộc về bạn, không có lý do gì để không sử dụng các trường công khai.

Đừng mong đợi nhiều sự khác biệt hiệu suất mặc dù :)

+1

Chỉ là những gì tôi cần biết.Nếu tôi tóm tắt, có vẻ như quyết định về việc có nên sử dụng các lĩnh vực công cộng hay không sẽ phụ thuộc vào phạm vi của dự án, dù nó có được tái sử dụng hay giao tiếp hay không và khả năng thay đổi. Tôi cũng không nghĩ rằng các trường 'cuối cùng' không nguyên thủy sẽ không thay đổi. Nếu tôi muốn tạo ra một trường chỉ đọc như vậy, tôi phải chuyển đổi toàn bộ lớp để duy trì quyền truy cập thống nhất. – Lilienthal

+2

Cộng một cho sự bất biến. Cũng nên xem xét thay vì sử dụng setters nếu bạn có thể sử dụng mẫu Builder. Sau đó, hầu hết quyền truy cập của bạn sẽ thông qua getters, cho phép bạn trả lại các sản phẩm bất biến hoặc bản sao an toàn của các mục bạn không muốn ảnh hưởng gián tiếp thông qua các tác dụng phụ. –

3

Tôi không nghĩ rằng nó thực sự tồi tệ để có một lớp 'cài đặt' hoặc 'chủ đề' hoặc 'phong cách' với các thuộc tính công khai.

IDE hiện đại với công cụ tái cấu trúc làm cho nó tầm thường để quảng bá thuộc tính cho bộ thu thập thông tin/setter nếu bạn muốn thực hiện bất kỳ phép tính phức tạp hoặc kiểm tra giá trị nào tại thời điểm đặt.

Thường trong 'setTheme' hoặc bất kỳ chức năng nào tiêu thụ các lớp cài đặt này là một nơi sạch sẽ để thực hiện xác thực.

Khi thiết lập các cài đặt như thế này thường thích hợp để thực hiện đối tượng được sao chép sâu thay vì giữ lại tham chiếu đến một lớp có thể thay đổi.

Các vấn đề liên quan