Có được coi là một thực tiễn xấu để thêm logic trong trình thiết lập thuộc tính không?


28

Tôi đã nhảy vào một dự án và tôi thấy rằng các nhà phát triển khác đang bổ sung rất nhiều logic trong các tập hợp các thuộc tính tổng hợp. Tôi hiểu cách thức hoạt động của nó, nhưng tôi nghĩ rằng nó làm cho nó khó hiểu dòng chảy của chương trình; trong khi đọc mã, bất cứ khi nào tôi nhìn thấy self.something = whatever, tôi luôn kiểm tra xem bộ cài somethingđặt có bị ghi đè không.

Ý kiến ​​của bạn xung quanh chủ đề này là gì? Bạn có nghĩ rằng đây là một dấu hiệu của kiến ​​trúc xấu hoặc một giải pháp phức tạp?

Tôi sẽ rất vui khi đọc thêm về điều này nếu bạn có các liên kết / nguồn liên quan, thật khó để có kết quả google tốt vì vậy tôi cũng quyết định hỏi ở đây.

Cảm ơn bất kỳ câu trả lời nào và xin lưu ý rằng tôi đang nói về mục tiêu C trong trường hợp bạn chưa thấy thẻ (mặc dù đây không phải là vấn đề cụ thể về ngôn ngữ tôi đoán).


5
Những loại logic? Chẳng có gì sai khi đặt logic xác nhận, chẳng hạn. Mặt khác, một setter gửi một vài sự kiện, gọi một dịch vụ web và cập nhật UI là hoàn toàn sai.
Arseni Mourzenko

@MainMa Tôi đồng ý rằng các xác nhận là tốt - có thể thêm một số nhà quan sát, phải không? Bạn có thể đưa ra một số ví dụ về những gì bạn cho là phù hợp hơn để đặt vào một setter không?
phi

Thật vậy, các nhà quan sát là đúng. Đối với những điều phù hợp cho một setter, tôi để các nhà phát triển có kinh nghiệm hơn trả lời câu hỏi này.
Arseni Mourzenko

Câu trả lời:


44

Có được coi là một thực tiễn xấu để thêm logic trong trình thiết lập thuộc tính không?

Không

Các thuộc tính được phát minh để cho phép các nhà thiết kế lớp có logic gắn liền với giao diện thuận tiện của việc truy cập và gán trường.

Bao nhiêu là quá nhiều? Nó phụ thuộc vào trách nhiệm của lớp. Dưới đây là một số điều hợp lý để đặt trong trình thiết lập thuộc tính:

  • cập nhật một số giá trị dẫn xuất
  • thông báo cho các nhà quan sát rằng trạng thái lớp đã thay đổi
  • tuyên truyền sự thay đổi cho một số đối tượng chứa
  • tuyên truyền sự thay đổi đến một cửa hàng sao lưu
  • thực hiện xác nhận

Lập trình dễ dàng hơn khi các lớp có giao diện làm cho nó rõ ràng những gì lớp có thể làm, mà không khiến người gọi nghĩ về cách nó được thực hiện. Đặt logic đằng sau setters thuộc tính cho phép các lớp ẩn việc thực hiện của chúng đằng sau một giao diện đơn giản. Đối với một số lớp, không có phương pháp nào được yêu cầu. Chỉ cần xoay núm bằng cách đặt thuộc tính và đọc đầu ra bằng cách lấy thuộc tính.


13
Thực hiện xác nhận ...
Robert Harvey

Làm thế nào tốt để tải lại một bộ sưu tập hoặc xem bảng trong một phương thức ghi đè setter?
KRGAN

15

Setters thường được sử dụng để thay đổi trạng thái của một đối tượng không có tác dụng phụ đáng kể hoặc tính toán nặng nề, sử dụng các phương pháp và chức năng cho điều đó. Lý do chính để thực hiện setter là thay đổi và duy trì trạng thái hợp lệ . Vì vậy, giới hạn phạm vi, cài đặt cờ để yêu cầu tính toán lại hoặc điều chỉnh các thuộc tính liên quan là hoàn toàn tốt.


7

Tôi không biết về mục tiêu C, nhưng như bạn nói, có vẻ như một câu hỏi đủ chung cho bất kỳ ngôn ngữ OO nào. Trước hết và thực sự liên quan đến điều đó, việc có setters và getters ở vị trí đầu tiên hay không là vấn đề thảo luận (trong một số trường hợp sự tồn tại của chúng được chứng minh bằng cách sử dụng khung hoặc thư viện).

Tôi tin rằng tên của phương thức sẽ giải thích những gì phương thức làm và tất cả các phương thức làm. Ngoài ra, tài liệu liên quan đến phương pháp đó sẽ mô tả nó theo cách rõ ràng hơn. Theo nghĩa này, một tên phương thức ở dạng "set" + {noun} không nên có bất kỳ tác dụng phụ nào ngoài việc đặt giá trị của một biến và đó phải là hành động duy nhất liên quan đến nó. Kiểm tra xem đối số có hợp lệ không, có thể chấp nhận được không nhưng nó cần được mô tả trong tài liệu của nó.


1
+1 cho "có hay không có setters và getters". Và +1 khác cho "tên phương thức sẽ giải thích những gì nó làm".
aviv
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.