2012-04-08 37 views
7

Tôi nên sử dụng phương pháp tĩnh thường xuyên như thế nào? Nếu tôi có như:Sử dụng phương pháp tĩnh so với phương pháp đối tượng

Class1 _class34 = new Class1(parameter); 

Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4). 

hoặc

_class34.DoSomething(parameter1, parameter2, parameter3, parameter). 

Tôi đang gặp một xu hướng gọi phương thức tĩnh của một lớp và đi qua một đối tượng của lớp như trong ví dụ đầu tiên?

Phương pháp hay nhất liên quan đến hai ví dụ này là gì? Có bất kỳ thực hành, thiết kế và thực hành chung nào mà tôi nên chú ý không? Tôi nên sử dụng cái nào nói chung và cái nào bạn sẽ chọn như trong các kịch bản mã hóa hàng ngày. Ví dụ đầu tiên có vẻ đơn giản hơn để đọc (bạn vượt qua tất cả các tham số và làm một cái gì đó), trong lần thứ hai bạn phải đọc hai lần rằng bạn đang làm việc trên một đối tượng?

Nó không thực sự là một vấn đề lớn, chỉ cần tự hỏi.

Trả lời

11

Nói chung, các phương pháp tĩnh chỉ nên được sử dụng khi bạn muốn làm bất kỳ điều gì độc lập với bất kỳ cá thể nào của lớp. Nếu bạn cần truy cập trực tiếp hoặc ảnh hưởng đến trạng thái của một cá thể cụ thể, một phương pháp không tĩnh thường là cách để đi.

+1

Đồng ý. Tất nhiên luôn có những ngoại lệ, nhưng nói chung, nếu bạn thấy mình truyền một thể hiện của lớp A đến một phương thức tĩnh của lớp A, có thể bạn đang làm sai. –

+0

Còn trong trường hợp bạn đang chuyển hai trường hợp của Loại A sang một phương thức mà không có cá thể nào 'sở hữu' hoặc được ưu tiên trong hoạt động? –

+1

Bạn có nghĩa là hoạt động nhị phân giao hoán? Tôi đã nhìn thấy nó cả hai cách, nhưng có lẽ vẫn sẽ sử dụng một phương pháp không tĩnh. – Taymon

0

nếu bạn cần đối tượng, tôi nghĩ bạn nên thực hiện cuộc gọi như "_class34.DoSomething (parameter1, parameter2, parameter3, parameter)."

khi bạn đọc nó giống như: Trên đối tượng _Class34, hãy làm gì đó, với thông số này.

2

Không có câu trả lời "thường xuyên hơn".
Tất cả phụ thuộc vào loại sử dụng.

Điểm mấu chốt là: Nếu một đối tượng của lớp được chỉ định được thực thi/sử dụng, bạn nên luôn sử dụng các phương thức không tĩnh. Tuy nhiên, nếu không có cá thể duy nhất của lớp được thực hiện/sử dụng, bạn nên luôn sử dụng các phương thức tĩnh.

Trong ví dụ của bạn, bạn đang thực hiện Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4) không phải là cách tiếp cận tốt, vì nó loại bỏ tất cả các khả năng Lập trình hướng đối tượng cung cấp cho bạn (chẳng hạn như đa hình, v.v.).

Một ví dụ điển hình cho một kịch bản trong đó cần có hàm tĩnh là String.Parse - bắt đầu mà không có bất kỳ thể hiện cụ thể nào của Chuỗi, nhưng được kết nối với lớp chuỗi.

+0

Một ví dụ phổ biến khác là tải một đối tượng từ một tệp - thường được gọi là tĩnh trả về đối tượng được tải từ tệp. – Ricibob

2

Đây là những gì thời gian chạy đã làm, mọi phương pháp dụ có một đối số 1 ẩn đi qua này. Tiếp xúc trong cú pháp của một phương pháp mở rộng.

Làm rõ công việc của thời gian chạy không đặc biệt hữu ích, cú pháp chỉ trở nên tiết kiệm hơn. Và đau đớn cho loại tên bạn phải đưa ra. Hãy xem xét _this thay vì _class34 :)

0

Toàn bộ ý tưởng đằng sau lập trình hướng đối tượng là bạn không phải viết somefunction(somestruct) như bạn phải làm trong quá khứ, nhưng thay vào đó bạn có thể viết somestruct.somefunction(). rằng somefunctionthuộc về đến somestruct.

Tất nhiên bạn có thể thực hiện theo bất kỳ cách nào bạn muốn, nhưng hãy nhớ rằng ví dụ thứ hai của bạn là cách, lý do khiến chức năng thành viên được phát minh.

0

Thành viên tĩnh có thể làm phức tạp kiểm tra đơn vị để bạn phải cẩn thận về cách bạn sử dụng chúng.

Đối với hầu hết các trường hợp, tôi sẽ kết thúc thêm trình bao bọc không tĩnh cho các lớp có chứa các thành viên tĩnh vì nếu không tôi sẽ không thể giả mạo chúng.

Static Methods are Death to Testability có thể cung cấp cho bạn ý tưởng tốt hơn về điều này.

0

Nhưng theo mặc định, tôi sử dụng các phương pháp thể hiện. Tôi có xu hướng sử dụng chỉ số liệu thống kê khi nó có ý nghĩa hơn các phương pháp thể hiện hoặc khi không có cách nào khác. Sử dụng statics có thể làm phức tạp kiểm tra đơn vị. Các phương thức tĩnh cũng sử dụng các trường tĩnh là một nguồn rò rỉ bộ nhớ tiềm ẩn (có, ngay cả trong .NET).

Vì vậy, ví dụ tôi sử dụng tĩnh khi tôi muốn có một phương pháp sáng tạo đặc biệt để làm cho rõ ràng hơn những gì xảy ra trong quá trình tạo, giống như khi tôi có thể tạo đối tượng bằng cách deserializing nó từ một tập tin:

MyClass myObject = MyClass.ReadFromFile("serialized.xml"); 

Mà là nhiều hơn có thể đọc được:

MyClass myObject = new MyClass("serialized.xml"); 

Ngoài ra tôi sử dụng phương pháp thống kê (và thành viên) khi tôi muốn chia sẻ thông tin trạng thái toàn lớp giữa tất cả các trường hợp.

Tất nhiên thành viên tĩnh là phải khi toàn bộ lớp của bạn là tĩnh.

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