2010-04-14 31 views
19

Tôi đã thấy điều này thường xuyên trong mã, nhưng khi tôi nói về nó, tôi không biết tên cho 'mẫu' như vậyĐây có phải là mẫu thiết kế nổi tiếng không? Tên của nó là gì?

Tôi có một phương pháp với 2 đối số gọi phương thức quá tải có 3 đối số và cố ý đặt chuỗi thứ 3 thành chuỗi rỗng.

public void DoWork(string name, string phoneNumber) 
{ 
    DoWork(name, phoneNumber, string.Empty) 
} 

private void DoWork(string name, string phoneNumber, string emailAddress) 
{ 
    //do the work 
} 

Lý do tôi làm điều này không trùng lặp mã và cho phép người gọi hiện tại vẫn gọi phương thức chỉ có 2 tham số.

Đây có phải là mẫu và có tên không?

+4

không có nghĩa là DoWork (tên, phoneNumber, string.Empty)? – Andrey

+0

vâng Andrey, tôi đã chỉnh sửa nó ngay bây giờ, cảm ơn vì đã chỉ ra điều này, và xin lỗi về bất kỳ sự nhầm lẫn nào có thể đã gây ra – GenEric35

+0

Cảm ơn tất cả mọi người về câu trả lời nhanh, tôi sẽ chờ một ai đó có tên này vì tôi đã thấy điều này thường xuyên và muốn đặt tên trên đó. Tôi sẽ chấp nhận một câu trả lời trước khi kết thúc ngày, cảm ơn. – GenEric35

Trả lời

34

Nó thực sự không chỉ là phương pháp quá tải (nơi thường tên cùng một phương pháp có lập luận khác nhau loại), mô hình cụ thể này - nơi quá tải về cơ bản cùng một phương pháp, và một ngắn hơn gọi một trong những lâu hơn với giá trị mặc định để mô phỏng các tham số tùy chọn - được gọi là mẫu kính thiên văn/kính thiên văn, thường được thấy trên các hàm tạo, nhưng tất nhiên là có thể khái quát được với bất kỳ phương thức nào.


Đối với một trích dẫn có thẩm quyền hơn, đây là một đoạn trích từ Effective Java 2nd Edition, khoản 2: Xem xét một mô hình xây dựng khi phải đối mặt với nhiều thông số constructor (excerpt online)

Theo truyền thống, các lập trình viên đã sử dụng mô hình telescoping constructor, trong đó bạn cung cấp một hàm tạo chỉ với các tham số bắt buộc, một với một tham số tùy chọn duy nhất, một tham số thứ ba với hai tham số tùy chọn, và trên ...

Một lần nữa, thường mô hình kính thiên văn được thảo luận trong bối cảnh của các nhà thầu (ví dụ: một nhà xây dựng 2-arg sẽ có một dòng this(arg1, arg2, ARG3_DEFAULT); để gọi hàm tạo 3-arg, v.v.), nhưng tôi không thấy tại sao nó không thể được khái quát hóa với các phương thức khác nữa.


Một quote có thẩm quyền, không may không có định nghĩa của mô hình: Sun Developer Network: How to Write Doc Comments for the Javadoc Tool:

Thông báo các phương pháp và nhà xây dựng đang ở trong "lồng" trật tự, có nghĩa là "không có arg" hình thức đầu tiên, sau đó dạng "1 arg", sau đó là dạng "2 arg", v.v.


Và một trích dẫn ngẫu nhiên, với một định nghĩa rõ ràng hơn về các mô hình: I Am Hate Method Overloading (And So Can You!):

telescoping Phương pháp

Bạn có thể có một chức năng mà phải mất một số tranh cãi . Các đối số cuối cùng có thể không phải là tất cả những gì quan trọng, và hầu hết người dùng sẽ khó chịu trong việc phải tìm ra những gì để vượt qua chúng. Vì vậy, bạn tạo thêm một vài phương thức có cùng tên và ít đối số hơn, gọi đến phương thức "chính".

Trích dẫn cuối cùng này đề xuất trực tiếp rằng hỗ trợ ngôn ngữ cho đối số mặc định là lựa chọn tốt hơn nhiều.

+0

câu trả lời hay, cảm ơn – GenEric35

+1

@polygenelubricants: Tôi thực sự đánh giá cao phản hồi của bạn, cảm ơn! Quan điểm của tôi là, trong khi tôi đồng ý 100% với bạn trong ý tưởng chung tôi không phải là rất thuyết phục đối với trường hợp cụ thể này. Thực tế là chúng tôi đã có OOP trong 40 năm và các mẫu thiết kế trong 30 năm và trong một tình huống như vậy, bạn khó tìm thấy 3 tài liệu tham khảo trên thế giới gọi là "mẫu thiết kế" (hoặc ít nhất là khái quát ý tưởng) nghĩ rằng không có mẫu thiết kế được chấp nhận và có lẽ vì nó không cần thiết? Bạn có nghĩ rằng đó là đủ với dữ liệu được cung cấp để nói: Đây là "Mẫu kính thiên văn"? –

+1

@Claudio: _maybe_ tên chưa được phổ biến rộng rãi, nhưng nó được sử dụng trong _Effective Java_, mà tôi tin là một cuốn sách được đọc rộng rãi. Trong mọi trường hợp, chúng ta hãy bắt đầu sử dụng tên thay vì không đặt tên cho nó. Chúng tôi đang sử dụng các mô hình (tốt hay xấu), vì vậy thay vì để nó không tên, chúng tôi cũng có thể gọi nó là một cái gì đó. Và những gì bạn biết, một số người đã làm. – polygenelubricants

20

Tên đó là quá tải và nó không phải là một mẫu thiết kế nhưng một tính năng OOP

http://en.wikipedia.org/wiki/Method_overloading

+0

Ok, tôi nên đặt phương thức thứ hai là riêng tư, đây là trường hợp phương thức quá tải bị ẩn cho người gọi và các phương thức quá tải được gọi bởi cha/mẹ. Tôi sẽ điều chỉnh mã của tôi, cảm ơn, là có một tên cho tính năng này hoặc sử dụng các phương pháp quá tải? – GenEric35

+1

IMO, quá tải có thể được coi là mẫu thiết kế được OOP và các ngôn ngữ khác hỗ trợ. – kenny

+0

Nói rằng đây chỉ là "quá tải phương thức" giống như nói v.d. mẫu khách truy cập là "công văn động". Nó mô tả cơ chế OOP một cách hoàn hảo, nhưng nó bỏ qua để giải quyết toàn bộ khái niệm về một mẫu thiết kế là gì. – polygenelubricants

3

Tôi đoán một trong hai DoWork phương pháp của bạn nên được gọi là CreateContact hoặc cuộc gọi của bạn để CreateContact nên DoWork. ..

Nhưng đây không thực sự là một mẫu. Đó chỉ là việc sử dụng phổ biến của method overloading.

+0

Có, tôi có thể gọi nó là Tạo liên hệ nhưng không muốn liên quan đến các nhà xây dựng vì trong ví dụ thực sự của tôi, đó là các phương pháp tĩnh, vì vậy tôi gọi nó là DoWork. Tôi hiểu nó được gọi là quá tải phương thức, có lẽ tôi nên đặt câu hỏi này vào câu hỏi để làm rõ rằng tôi biết đó là các phiên bản quá tải của cùng một phương thức. Đó là trường hợp người gọi không thể gọi trực tiếp phương thức bị quá tải, tôi phải đặt chế độ riêng thứ hai, mà tôi sẽ chỉnh sửa ngay bây giờ. Có tên nào cho việc sử dụng phương thức quá tải này khi họ gọi cho nhau và chỉ một trong số đó là công khai? – GenEric35

+0

Theo như tôi biết, đó vẫn chỉ là việc sử dụng quá tải thay vì một trong những mẫu được chấp nhận. –

7

Không, đây không phải là mẫu thiết kế trong nhóm bốn ý nghĩa, nhưng nó phổ biến ở nhiều ngôn ngữ không cho phép tham số mặc định.

Trong một ngôn ngữ như ruby ​​bạn có thể làm một cái gì đó tương tự như sau

def dowork(name, phoneNumber, emailAddress = '') 
    # code here 
    end 
4

tôi muốn nói đây là khá nhiều C# < 4 công trình xung quanh vì thiếu đối số mặc định. nếu bạn quy định cho 'mô hình thiếu tính năng ngôn ngữ' trường học của tư tưởng tôi đoán bạn có thể nói một mô hình của nó, mặc dù không phải là một trong đó thường được đặt tên.

chỉnh sửa: ok bản cập nhật của bạn thực sự đã ném tôi, tôi không thấy bạn đang cố gắng làm gì với phương thức công khai gọi phương thức riêng tư. như xa như api công cộng là có liên quan bạn chỉ có thể di chuyển tất cả các phương pháp riêng mã vào phương pháp công cộng và có một biến địa phương cho giá trị 'mặc định'. hoặc cả hai phương pháp cũng được gọi từ những nơi khác trong lớp học?

3

Nó được gọi là chức năng quá tải.Trong chức năng quá tải tên của một chức năng là giống nhau nhưng chúng khác nhau trong một trong hai loại tham số hoặc số tham số. Nó cũng được gọi là đa hình sai. Nó không phải là một khuôn mẫu, nó là một khái niệm OOP cơ bản.

5

Đây là ví dụ về phương thức trợ giúp. Những người Sheesh, không ở trong cuốn Gang of Four không dừng nó lại là một khuôn mẫu. Trong trường hợp cụ thể, nơi có người trợ giúp công khai và phương pháp được trợ giúp là riêng tư, đó là một ví dụ về đóng gói. Có thể có quá nhiều đóng gói trong trường hợp này.

+0

cũng giúp ích, cảm ơn: D – GenEric35

2

Tôi đồng ý với @polygenelubricants, nhưng muốn chỉ ra rằng mô hình kính thiên văn có thể được sử dụng ngoài việc quá tải. Một ví dụ là trong Objective-C, trong đó bộ chọn phương thức (chữ ký) phải là duy nhất và không thể bị quá tải.

- (id)init { 
    return [self initWithParam:0]; 
} 

- (id)initWithParam:(int)param { 
    // Do real initialization here! 
    return self; 
} 
Các vấn đề liên quan