Thích các thành viên lớp hoặc truyền đối số giữa các phương thức nội bộ?


39

Giả sử trong phần riêng của một lớp có một giá trị được sử dụng bởi nhiều phương thức riêng. Có phải mọi người thích có định nghĩa này là một biến thành viên cho lớp hoặc truyền nó làm đối số cho mỗi phương thức - và tại sao?

Một mặt tôi có thể thấy một đối số được đưa ra rằng việc giảm trạng thái (tức là biến thành viên) trong một lớp nói chung là một điều tốt, mặc dù nếu cùng một giá trị được sử dụng lặp đi lặp lại trong các phương thức của lớp thì có vẻ như đó là một lý tưởng ứng cử viên đại diện làm trạng thái cho lớp để làm cho mã rõ ràng hơn nếu không có gì khác.

Chỉnh sửa:

Để làm rõ một số ý kiến ​​/ câu hỏi được nêu ra, tôi không nói về hằng số và điều này không liên quan đến bất kỳ trường hợp cụ thể nào mà chỉ là giả thuyết mà tôi đang nói với một số người khác.

Bỏ qua góc OOP trong giây lát, trường hợp sử dụng cụ thể mà tôi có trong tâm trí là như sau (giả sử chuyển qua tham chiếu chỉ để làm sạch mã giả)

int x
doSomething(x)
doAnotherThing(x)
doYetAnotherThing(x)
doSomethingElse(x)

Vì vậy, điều tôi muốn nói là có một số biến chung giữa nhiều hàm - trong trường hợp tôi có ý nghĩ đó là do chuỗi các hàm nhỏ hơn. Trong một hệ thống OOP, nếu đây là tất cả các phương thức của một lớp (giả sử do tái cấu trúc thông qua các phương thức trích xuất từ ​​một phương thức lớn), biến đó có thể được truyền qua tất cả chúng hoặc nó có thể là một thành viên của lớp.


1
Giá trị này được sử dụng như thế nào? Nó là hằng số? Nó có thay đổi không? Có phải nó có thể thay đổi giữa các phần tổng hợp?
Oded

Khi mọi thứ tự động được xác định là giống nhau, sẽ dễ dàng hơn để nghĩ rằng điều đó không quan trọng. Điều gì xảy ra nếu bạn có một hàm cần một giá trị (x) được điều chỉnh như x-1?
JeffO

Câu trả lời:


15

Nếu giá trị là một thuộc tính của lớp, hãy giữ nó trong lớp, nếu không, hãy giữ nó bên ngoài. Bạn không thiết kế các phương thức lớp của mình - trước tiên, bạn thiết kế các thuộc tính của nó trước. Nếu bạn không nghĩ đến việc đưa tài sản đó vào lớp ngay từ đầu, có lẽ có một lý do cho điều đó.

Điều tồi tệ nhất bạn có thể làm, về khả năng mở rộng, là thay đổi mã của bạn để thuận tiện. Sớm hơn là sau này bạn sẽ thấy mã của mình bị đầy và trùng lặp. Tuy nhiên tôi phải thừa nhận đôi khi tôi phá vỡ quy tắc này ... Tiện lợi là rất hấp dẫn.


1
Tôi đồng ý - thiết kế / mục đích ban đầu của lớp sẽ cho bạn biết liệu nó nên là biến thành viên hay đối số. Cũng đáng suy nghĩ về góc tiêm phụ thuộc.
Martijn Verburg

14

Nếu bạn thực sự không cần phải giữ trạng thái giữa các yêu cầu (và rõ ràng là bạn không, hoặc bạn sẽ không đặt câu hỏi) thì tôi thích giá trị là một đối số, thay vì một biến thành viên, bởi vì lướt qua nhanh tại chữ ký của phương thức cho bạn biết rằng nó sử dụng đối số, trong khi khó hơn một chút để biết ngay các biến thành viên nào được sử dụng bởi phương thức. Nó cũng không phải luôn luôn nhanh chóng để xác định các biến thành viên tư nhân là gì.

Vì vậy, thông thường tôi sẽ không đồng ý rằng mã sử dụng các biến thành viên rõ ràng hơn, nhưng nếu chữ ký phương thức vượt khỏi tầm kiểm soát, tôi có thể tạo ra một ngoại lệ. Đó là một câu hỏi đáng giá, nhưng không phải là thứ mà dự án sẽ xoay quanh trong mọi trường hợp.


10

Cảm ơn bạn đã đặt câu hỏi, tôi cũng muốn hỏi điều này.

Khi tôi đã suy nghĩ về điều này, có một số lợi thế tại sao để vượt qua nó như là đối số

  • kiểm tra dễ dàng hơn -> dễ bảo trì hơn (liên quan đến điểm cuối)
  • không có tác dụng phụ
  • dễ hiểu hơn

Tôi thấy rõ quan điểm của bạn chẳng hạn - một là phân tích tài liệu Excel (ví dụ sử dụng thư viện POI) và thay vì chuyển thể hiện hàng cho mọi phương thức cần làm việc với hàng đó, tác giả có biến thành viên currentRowvà làm việc với nó.

Tôi muốn nói rằng nên có một tên cho mô hình chống này, phải không? (không được liệt kê ở đây )


Bạn có ý nghĩa chống mẫu nào?
Vahid Ghadiri

Nói tóm lại, để có biến thành viên chỉ để chia sẻ tham số giữa hai (hoặc nhiều hơn) các lệnh gọi ...
Betlista

1

Có lẽ bạn nên trích xuất một lớp mới chứa tất cả các phương thức chia sẻ giá trị đó. Tất nhiên phương thức cấp cao nhất sẽ được công khai trong lớp mới. Nó có thể hữu ích để đưa ra phương pháp đó để thử nghiệm.

Nếu bạn có hai hoặc nhiều thời gian luôn luôn được thông qua cùng nhau, thì bạn gần như chắc chắn sẽ trích xuất một lớp mới.


1

Có phải mọi người thích có định nghĩa này là một biến thành viên cho lớp hoặc truyền nó làm đối số cho mỗi phương thức - và tại sao?

Nếu tôi hiểu những gì bạn đang hỏi: Các phương thức trong một lớp theo định nghĩa là riêng tư với các chi tiết triển khai, vì vậy tôi không có ý định sử dụng bất kỳ thành viên nào trực tiếp từ bất kỳ phương thức nào.

Một mặt tôi có thể thấy một đối số được đưa ra rằng việc giảm trạng thái (tức là các biến thành viên) trong một lớp nói chung là một điều tốt ...

Không có gì sai khi khai báo a private static finalđể xác định hằng. Trình biên dịch sẽ có thể sử dụng giá trị trong việc xem xét một số tối ưu hóa và là hằng số, chúng không thực sự thêm trạng thái vào lớp.

mặc dù nếu cùng một giá trị đang được sử dụng lặp đi lặp lại trong suốt các phương thức của lớp ...

Có thể tham chiếu đến nó một cách tượng trưng (ví dụ BLRFL_DURATION:) và không phải thêm các đối số bổ sung vào các phương thức của bạn sẽ làm cho mã của bạn dễ đọc hơn và do đó dễ bảo trì hơn.


0

nếu giá trị không thay đổi, thì theo định nghĩa, nó là một hằng số và nên được gói gọn trong lớp. Trong trường hợp như vậy, nó không được coi là ảnh hưởng đến trạng thái của một đối tượng. Tôi không biết trường hợp của bạn nhưng tôi nghĩ về một cái gì đó như PI trong lượng giác. Nếu bạn cố gắng truyền một đối số có hằng số như vậy, bạn có thể phơi bày kết quả thành lỗi nếu máy khách chuyển giá trị sai hoặc giá trị không có cùng độ chính xác như (các) phương thức mong đợi.

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.