2011-10-14 64 views
5

Tôi có một hàm tạo khá dài đang thực hiện các tác vụ khởi tạo khác nhau, và như vậy tôi muốn đưa ra một số công việc này vào một số hàm. Điều này dẫn đến tôi tự hỏi liệu tôi có nên làm cho các ví dụ chức năng nói hoặc phương pháp tĩnh. Tôi hiểu nguy cơ gọi một hàm ảo từ một hàm tạo nhưng tôi cũng nghĩ có điều gì đó không đúng về việc gọi một phương thức cá thể trên một đối tượng không được khởi tạo 100%. Chắc chắn đây là một mâu thuẫn về mặt.Phương thức thể hiện cuộc gọi từ một hàm tạo trong C#

Tôi muốn được quan tâm đến ý kiến ​​của mọi người về vấn đề này. Tôi cũng thấy rằng bằng cách sử dụng một phương thức tĩnh để trả về một biến khởi tạo, tôi có thể làm cho mục tiêu thành viên chỉ đọc. Đây là một minh họa đơn giản về kịch bản của tôi.

public class A 
{ 
    private readonly string _foo; 

    public A() 
    { 
     _foo = InitialiseFoo(); 
    } 

    private static InitialiseFoo() 
    { 
     // Do stuff 
     return new string ("foo"); 
    } 
} 
+1

Tại sao bạn có một hàm tạo dài? Đó không phải là cách các nhà xây dựng nên như thế nào. Bạn nên sử dụng các phương thức để thực hiện các thao tác dài. Nó luôn luôn rất bực bội khi bạn cố gắng tiêu thụ một số API và API này thực hiện truy cập cơ sở dữ liệu và các công cụ trong constructor của nó và có khả năng ném ngoại lệ và các công cụ. Làm đi. Nó thực sự phiền phức. Các nhà xây dựng nên đơn giản. –

+0

Tôi hoàn toàn đồng ý với bạn về điều này, nhưng tôi đang mã hóa một cửa sổ dịch vụ mà cần phải có được tên dịch vụ của nó từ một tập tin cấu hình đầu tiên. Bạn chỉ có thể đặt tên của một dịch vụ bên trong hàm tạo của nó vì vậy tôi sắp xếp bị mắc kẹt với điều này. – user738134

Trả lời

4

Điều này là khá bình thường khi gọi phương thức thể hiện trong hàm tạo, phương pháp hơn nữa thực hiện Khởi tạo. Vì vậy, về cơ bản đây là một loại Extract Method refactorig để giảm một cơ thể phương pháp xây dựng, vì vậy bạn được chiết xuất phần khởi tạo thành một phương pháp riêng và xây dựng nhận thức về tiết kiệm của các đối số đầu vào, vv ...

Về sửa đổi static .. đôi khi (tôi tin rằng khi không có cách nào khác để tái cấu trúc vì điều này có vẻ không tốt - từ quan điểm của tôi), bạn cần gọi một phương thức để truyền kết quả trong một hàm tạo cơ sở. Trong trường hợp này, bạn phải đánh dấu nó là tĩnh để gọi trong một ngữ cảnh tĩnh trong các trường hợp khác để lại nó mà không có công cụ sửa đổi tĩnh

public A() 
: base(GetLogger()) 
{ 
} 

private static ILog GetLogger() ... 
+0

+1 để đề cập đến phương pháp trích xuất, đó là tất cả điều này là –

1

Tôi có thể hiểu mong muốn chỉ sử dụng các thành viên tĩnh trong một hàm tạo, beca sử dụng nó làm cho mã đơn giản hơn để sử dụng mà không cần phải theo dõi những gì đã được khởi tạo và những gì đã không, nhưng bạn có thể làm những thứ không cần thiết phức tạp cho chính mình. Gọi một phương thức thể hiện trong C# là miễn là bạn có lý do chính đáng để làm điều đó. Ví dụ, nếu bạn có một số nhà xây dựng mà tất cả thực hiện một số nhiệm vụ phổ biến, việc tạo ra một hàm thành viên duy nhất để thực hiện công việc dễ duy trì hơn là sao chép và dán mã cho mỗi hàm tạo. Bạn cũng có thể tưởng tượng một trường hợp mà phương thức có thể được tái sử dụng bên ngoài của hàm khởi tạo cho một cái gì đó giống như đặt lại lớp thành trạng thái khởi tạo.

Phương pháp tĩnh, là tốt, nhưng sẽ chỉ hoạt động trong trường hợp bạn đang thực hiện một số công việc bị cô lập và đưa kết quả vào biến thành viên. Nó cung cấp một cảm giác giống như lập trình rất sạch sẽ, chức năng. Tuy nhiên, nếu bất kỳ công việc nào liên quan đến trạng thái lớp, nó sẽ trở nên xấu xí.

+0

'nếu bạn có một số hàm tạo tất cả thực hiện một số tác vụ phổ biến', thường là lặp lại các chuỗi này với các cuộc gọi đến' MyCTor: this (arg1, arg2) 'từ nhà xây dựng. – nicodemus13

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