2011-12-13 30 views
6

Tôi hơi bối rối về phương pháp Initialize thường được sử dụng cho trong một hàm tạo.Phương pháp Initialize được sử dụng cho và tôi có thực sự cần một phương pháp nào không?

Tại sao tôi không thể đặt mọi thứ vào hàm tạo và tại sao mẫu bên dưới gọi phương thức khởi tạo?

private IAzureTable<Product> _productRepository; 

    public ProductService(string dataSourceID) 
    { 
     Initialize(dataSourceID); 
    } 

    private void Initialize(string dataSourceID) 
    { 
     this._productRepository = StorageHelper.GetTable<Product>(dataSourceID); 
    } 

Có quy ước thường được sử dụng không?

Trong ví dụ này tôi cần từ this trong phương pháp Initialize?

+0

Bằng cách này, mã có thể được gọi từ một nơi khác khác với hàm tạo. – Megacan

+0

Đối với cả hai câu hỏi của bạn, một câu trả lời phổ biến: Khả năng đọc tốt hơn. Và đối với phương pháp riêng biệt, một điểm cộng nữa là giúp theo nguyên tắc DRY. – Maheep

+0

Có thể trùng lặp: http://stackoverflow.com/questions/4414471/initialize-vs-constructor-method-proper-usage-on-object-creation –

Trả lời

9

Tại sao tôi không thể chỉ cần đặt tất cả mọi thứ trong các nhà xây dựng và tại sao mẫu bên dưới gọi phương thức khởi tạo?

Bạn có thể đặt tất cả trong hàm tạo. Trong trường hợp đơn giản này, bạn nên. Constructors là để khởi tạo đối tượng của bạn.

Đôi khi bạn có một cái gì đó phức tạp hơn mặc dù:

  • Đôi khi bạn sẽ muốn có một phương pháp riêng biệt Initialize bởi vì bạn muốn gọi nó là tại một thời điểm riêng biệt từ xây dựng.
  • Đôi khi bạn muốn một vì bạn đang viết nhiều hàm tạo và bạn muốn chia sẻ một số việc triển khai giữa chúng.
  • Đôi khi việc khởi tạo của bạn phức tạp và bạn muốn cung cấp cho các phần của tên tốt để bạn biết mã của mình đang làm gì. Vì vậy, bạn chia những miếng thành các phương pháp riêng biệt.

Không có trường hợp nào trong số này là trường hợp của mã này, vì vậy tôi chỉ bỏ qua và ném mã vào hàm tạo.

Có quy ước thường được sử dụng không?

Không. Mọi người làm mọi thứ dễ đọc và dễ hiểu nhất, bất kỳ điều gì yêu cầu mã ít nhất phải viết và bất kỳ điều gì gây ra sự trùng lặp mã nhất.

Tuy nhiên, nếu bạn đang thực hiện phương thức Initialize công khai và không gọi phương thức đó từ hàm tạo, tôi khuyên bạn nên gọi nó là Initialize. Thiết kế nó để chỉ được gọi một lần.

Trong ví dụ này, tôi cần từ "this". trong phương thức Initialize?

Không. Bạn không bao giờ cần phải sử dụng this để truy cập thành viên của lớp trừ khi bạn có một biến địa phương khác có cùng tên. Dưới đây là một trường hợp như vậy:

public class Something 
{ 
    private string someValue; 

    public class Something(string someValue) 
    { 
     // must use "this" to access the member variable, 
     // because a local variable has the same name 
     this.someValue = someValue; 
    } 
} 
4

Những gì bạn đã đăng là trợ giúp riêng tư phương thức, không phải là một lớp học.

Nó chỉ đơn giản được sử dụng để các nhà xây dựng không lộn xộn với mã khởi tạo và để cung cấp cho một tên tốt cho những gì được thực hiện.

Trong ví dụ cụ thể của bạn, dường như có ít giá trị.

+1

... và trong trường hợp này tôi nghĩ rằng đó là dự phòng. Một nhà xây dựng đã "khởi tạo" mọi thứ, không cần phải thực hiện một phương thức khác làm điều tương tự (trừ khi bạn đang chia sẻ việc thực hiện chung nó giữa nhiều nhà xây dựng). –

+2

@ MerlynMorgan-Graham - Tôi đồng ý và đưa ra ý kiến ​​đó trong câu trả lời của tôi. – Oded

1

Điều đầu tiên là mã có thể đọc được nếu bạn tách riêng chức năng đó thành các phương pháp riêng của nó. Thứ hai, đôi khi trong một số trường hợp, bạn sẽ muốn khởi tạo công khai để nhà phát triển có thể sử dụng nó sau khi hàm tạo được gọi là bạn không muốn mã chạy trong hàm khởi tạo. Điều này thường là trường hợp nếu bạn có một hình thức và bạn muốn có một số mã khởi chạy trước một hình thức được hiển thị, vv

1

1: Việc sử dụng các phương pháp initalize có thể là hai lần:

  • Có thể là một loạt các hành động khởi tạo cần được chia nhỏ thành các khối có thể quản lý được (ví dụ: nhà xây dựng có thể tiếp tục thực hiện các hành động khác)
  • Có thể yêu cầu lớp tự khởi động lại, trong trường hợp mã khởi tạo phải trong một phương thức khác với hàm tạo.

Trong ví dụ cụ thể của bạn mặc dù ít ý nghĩa của nó.

2: Trong trường hợp của this:

Một lần nữa trong ví dụ của bạn của nó ý nghĩa chút. Nó có thể có sử dụng indifferentating giữa hiện thực của tài sản hoặc phương pháp trong một lớp cơ sở và lớp hiện tại (ví dụ bạn muốn sử dụng base. thay vì this.)

1

Không có tiêu chuẩn thống nhất, nhưng "khởi" là một từ nổi tiếng đó là ngay lập tức nhận ra cho bất cứ ai khác đọc mã và nói với tôi tất cả những gì cần biết về mục đích của phương pháp. Nó có thể được gọi là Bob() nhưng điều đó ít hữu ích hơn nhiều!

Tại sao tôi không thể đặt mọi thứ vào hàm tạo?

Bạn có thể, nhưng phá vỡ nó thành một phương pháp giúp làm cho mọi thứ dễ đọc hơn. Khi constructor của bạn là một dòng mã, nó thực sự không cần thiết.

Trong ví dụ này, tôi cần từ "this". trong phương thức Initialize?

Trong mã bạn đã đăng không, không cần thiết. Tại sao nó lại ở đó? Có thể đã được tạo tự động bởi một công cụ, có thể chỉ là một quy ước hoặc phong cách mà ai đó đã sử dụng, có thể được dán từ một nơi nào khác mà nó cần ...

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