2011-02-07 97 views
19

Sau khi dành một chút thời gian để tìm hiểu về lập trình hàm, ngày càng trở nên tự nhiên hơn khi tôi muốn làm việc với các phương thức tĩnh không thực hiện bất kỳ đột biến nào.Tôi có nên sử dụng các phương pháp tĩnh trong C#

Có lý do nào để tôi hạn chế bản năng này không?

+0

Tôi đã thấy mình nghiêng theo cách này do số lượng lập trình đồng thời/song song mà tôi đã thực hiện. Sẽ được quan tâm để nghe ý kiến ​​của người khác. 1, câu hỏi thú vị. – spender

+1

Tôi cũng cảm thấy điều này và đã nhận được vẻ ngoài kỳ lạ từ các đồng nghiệp khi gợi ý rằng các phương pháp được tái cấu trúc thành các cuộc gọi hàm tĩnh chỉ để lại một kịch bản đơn giản của logic ngắt trạng thái trong các phương thức thành viên. Tôi nói chạy với nó. –

+1

Bạn có thể xác định 'không thực hiện bất kỳ đột biến' nào không? – CRice

Trả lời

19

Câu hỏi tôi thấy hơi lạ, bởi vì phương pháp tĩnh và phương pháp thực hiện không có đột biến là hai phân loại trực giao của phương pháp. Bạn có thể có các phương thức tĩnh thay đổi và các phương thức thể hiện nonmutating.

Đối với tôi, ngày càng trở nên tự nhiên hơn khi kết hợp lập trình hàm và oo; Tôi thích các phương thức dụ không thực hiện đột biến. Lập trình chức năng dễ hiểu hơn vì nó không khuyến khích các đột biến phức tạp; Lập trình OO dễ hiểu hơn vì mã và dữ liệu mà nó vận hành gần nhau. Tại sao chọn? Embrace sức mạnh của "và"; làm tất cả!

12

Bạn có thể viết chương trình làm việc theo cách này, nhưng nó không phải là thành ngữ. Nếu bạn muốn làm việc theo nhóm, tôi sẽ cố gắng kiềm chế nó. Nếu không ai khác đọc mã của bạn, hãy đi hạt.

+9

Đồng ý. Tôi nghĩ rằng đó là một sai lầm khi viết các chương trình C# giống như các chương trình F # và ngược lại. Bạn nên chơi từng ngôn ngữ và khuôn khổ cho những điểm mạnh của nó, thay vì cố gắng phù hợp với chúng thành một khuôn được thừa kế từ một số ngôn ngữ hoặc khuôn khổ khác. Nếu bạn thực sự được bán trên mô hình lập trình F #/Scala, chương trình trong F # hoặc Scala :-). –

-1

Có nhiều lý do nên hạn chế bản năng này khi bạn viết OOP.

Trạng thái và hành vi đối tượng;

Lớp tĩnh và phương thức cần tham số và bạn nên đảm bảo tham số nào sẽ chuyển sang phương thức tĩnh. Nhưng lớp tự quản lý nếu phương thức liên quan đến là trạng thái.

Tôi nghĩ rằng chỉ có lý do này đủ để hạn chế các công cụ sửa đổi tĩnh.

Và vì lý do rõ ràng, chúng ta nên lắng nghe bà Liskov. here

+0

LSP phải làm gì với các phương pháp trợ giúp tĩnh? –

+0

Tôi sẽ ngạc nhiên nếu tôi thấy bất kỳ phương pháp nào được sửa đổi bởi tĩnh trong những người trợ giúp với các tham số "này". Các phương thức trợ giúp tĩnh không thực sự "tĩnh", nó chỉ được sửa đổi bởi "tĩnh". Một người nào đó phải viết một số phương thức tĩnh, và vị trí tốt nhất trong lớp cơ thể (có phương thức noI trong C#) phải được định nghĩa trong một lớp. –

+2

@Ben - Một phương pháp tĩnh không thể được thay thế, một cho người khác, không có người phụ thuộc biết sự khác biệt. Điều đó vi phạm một số nguyên tắc liên quan đến SOLID, bao gồm LSP. Nếu chương trình của bạn là rất tĩnh, nó được kết hợp chặt chẽ, đòi hỏi bạn phải thay đổi mã ở nhiều nơi hơn bạn sẽ nếu nó được tổ chức theo bất kỳ cách nào khác, thậm chí là một singleton. – KeithS

0

Không hoàn toàn. Tôi thích các phương pháp mở rộng của tôi, và LINQ, nhưng một ngôn ngữ OO nên được sử dụng trong một thời trang OO. Bên cạnh đó, nó là tất cả bắt buộc ở CPU, và đối với một số lớp trên đó.

5

Đối với một số lý do tôi nghĩ về câu nói này khi tôi đọc câu hỏi của bạn:

Bạn có thể viết Fortran bằng ngôn ngữ nào.

Nếu ý định của C# hoàn toàn hoạt động, static sẽ không cần thiết vì mọi thứ sẽ tĩnh theo mặc định. Nếu bạn nghiêm túc tuân theo các thực hành OOP và các nguyên tắc SOLID, mã của bạn có hiệu quả trở thành chức năng (tôi biết có một câu trích dẫn về điều này ở đâu đó) để bạn có được kết quả tốt nhất của cả hai thế giới.

Lý do tôi sẽ kiềm chế nó trong một dự án nhiều người dùng sẽ là nó không phải là điển hình C# (nó thực sự C# với còng tay). Bạn chỉ cần một người để phá vỡ các quy tắc và tuyên bố một tài sản có thể biến đổi tĩnh và tất cả mọi thứ đi vào địa ngục.

0

Câu hỏi hay.

Tôi nghĩ câu trả lời phụ thuộc vào ngữ cảnh của mã của bạn và số tiền đó là tĩnh.

Mã của tôi đã thấy ít trường hợp tĩnh hơn vì tôi lập trình nhiều giao diện ngay bây giờ và đánh dấu một số phương thức 'được bảo vệ ảo' thay vì 'tĩnh' cho các trường hợp như trích xuất và ghi đè kiểm tra đơn vị.Thats không nói rằng bạn couldnt chỉ cần gọi phương pháp tĩnh từ những, mặc dù.