Làm thế nào để đặt tên nhà máy như phương pháp?


145

Tôi đoán rằng hầu hết các phương pháp giống như nhà máy bắt đầu với create. Nhưng tại sao chúng được gọi là " tạo "? Tại sao không " tạo ra ", " sản xuất ", " xây dựng ", " tạo ra " hoặc một cái gì khác? Có phải chỉ là vấn đề của hương vị? Một quy ước? Hoặc có một ý nghĩa đặc biệt trong "tạo"?

createURI(...) 
makeURI(...)
produceURI(...)
buildURI(...)
generateURI(...)

Bạn sẽ chọn cái nào nói chung và tại sao?


4
Tôi đã từng làm việc với dự án có tên các phương thức của nhà máy là "get ()". Lúc đầu rất khó hiểu.
Muxecoid

4
Và tùy chọn cuối cùng, làm thế nào về không có tiền tố? Vì chúng ta hầu như luôn sử dụng các nhà máy từ bối cảnh tĩnh, nên không rõ ràng? Chỉ cần yêu cầu thúc đẩy một số cuộc thảo luận - sở thích cá nhân của tôi là createXyz().
vikingsteve

@vikingsteve Trong một hệ thống do tôi xây dựng, tôi đã sử dụng createtiền tố như một vấn đề quy ước vì tính nhất quán của API và cũng bởi vì chỉ cần gõ chữ cái csẽ khiến tất cả chúng hiển thị trong tính năng tự động hoàn thành của IDE, điều này sẽ giúp việc này dễ dàng hơn cho ai đó cố gắng học những gì có sẵn. Tôi có thể đã có Matrix4f.identity(), Matrix4f.transpose()v.v. nhưng họ sẽ nhanh hơn để tìm Matrix4f.createIdentity()Matrix4f.createTranspose(...), v.v.
code_dredd

Câu trả lời:


117

Một số suy nghĩ ngẫu nhiên:

  • 'Tạo' phù hợp với tính năng tốt hơn hầu hết các từ khác. Từ tốt nhất tiếp theo tôi có thể nghĩ ra khỏi đỉnh đầu là 'Xây dựng'. Trước đây, 'Alloc' (phân bổ) có thể đã được sử dụng trong các tình huống tương tự, phản ánh sự nhấn mạnh lớn hơn vào các khối dữ liệu so với các đối tượng trong các ngôn ngữ như C.

  • 'Tạo' là một từ ngắn gọn, đơn giản có ý nghĩa trực quan rõ ràng. Trong hầu hết các trường hợp, mọi người có lẽ chỉ chọn nó là từ đầu tiên, rõ ràng nhất xuất hiện trong đầu khi họ muốn tạo ra một cái gì đó. Đó là một quy ước đặt tên phổ biến và "tạo đối tượng" là một cách phổ biến để mô tả quá trình ... tạo đối tượng.

  • 'Xây dựng' là gần, nhưng nó thường được sử dụng để mô tả một giai đoạn cụ thể trong quá trình tạo đối tượng (phân bổ / mới, xây dựng, khởi tạo ...)

  • 'Xây dựng' và 'Tạo' là các thuật ngữ phổ biến cho các quy trình liên quan đến biên dịch mã, do đó, có ý nghĩa khác nhau đối với các lập trình viên, ngụ ý một quy trình bao gồm nhiều bước và có thể có nhiều hoạt động của đĩa. Tuy nhiên, ý tưởng về Nhà máy "xây dựng" một cái gì đó là một ý tưởng hợp lý - đặc biệt là trong trường hợp cấu trúc dữ liệu phức tạp được xây dựng hoặc nhiều phần thông tin riêng biệt được kết hợp theo một cách nào đó.

  • 'Tạo' cho tôi ngụ ý một phép tính được sử dụng để tạo ra một giá trị từ đầu vào, chẳng hạn như tạo mã băm hoặc số ngẫu nhiên.

  • 'Sản xuất', 'Tạo', 'Xây dựng' dài hơn để nhập / đọc hơn 'Tạo'. Trong lịch sử các lập trình viên đã ưu tiên các tên ngắn để giảm việc gõ / đọc.


5
giơ ngón tay cái cho "Tạo"
pimbrouwers

103

Joshua Bloch trong "Java hiệu quả" gợi ý các quy ước đặt tên sau đây

valueOf - Trả về một thể hiện có, nói một cách lỏng lẻo, cùng giá trị với các tham số của nó. Các nhà máy tĩnh như vậy là phương pháp chuyển đổi loại hiệu quả.

của - Một thay thế ngắn gọn để valueOf, phổ biến bởi EnumSet(Mục 32).

getInstance - Trả về một thể hiện được mô tả bởi các tham số nhưng không thể nói là có cùng giá trị. Trong trường hợp của một singleton, getInstancekhông có tham số nào và trả về thể hiện duy nhất.

newInstance - Giống như getInstance, ngoại trừ việc newInstanceđảm bảo rằng mỗi trường hợp được trả về là khác biệt với tất cả các trường hợp khác.

get Type - Like getInstance, nhưng được sử dụng khi phương thức Factory nằm trong một lớp khác. Kiểu chỉ ra loại đối tượng được trả về bởi phương thức nhà máy.

Loại mới - Thích newInstance, nhưng được sử dụng khi phương thức xuất xưởng ở một lớp khác. Kiểu chỉ ra loại đối tượng được trả về bởi phương thức nhà máy.


Bạn đánh giá như thế nào from? Ví dụ: lấy giả thuyết Id.of("abc")so với trò chơi Id.from("xyz")hoặc sẽ fromđề xuất nhiều logic hơn xảy ra (nghĩa là phân tích cú pháp đầu vào, tra cứu / tương quan từ / với các dữ liệu khác, trên mạng)? Thật sự rất khó để tìm kiếm "của vs từ": D
knittl

22

Muốn thêm một vài điểm tôi không thấy trong các câu trả lời khác.

  1. Mặc dù theo truyền thống 'Nhà máy' có nghĩa là 'tạo ra các đối tượng', tôi muốn nghĩ về nó rộng hơn là 'trả lại cho tôi một đối tượng hoạt động như tôi mong đợi'. Tôi không nên luôn luôn biết liệu đó có phải là một đối tượng hoàn toàn mới hay không , thực tế tôi có thể không quan tâm. Vì vậy, trong những trường hợp phù hợp, bạn có thể tránh tên 'Tạo ...', ngay cả khi đó là cách bạn đang triển khai nó ngay bây giờ.

  2. Quả ổi là một kho tốt của các ý tưởng đặt tên nhà máy. Nó đang phổ biến một phong cách DSL đẹp. ví dụ:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    

1
Bạn nói đúng, Guava là một thư viện tuyệt vời với mã rất dễ đọc.
deamon

11

"Tạo" và "thực hiện" là ngắn gọn, gợi mở hợp lý và không bị ràng buộc với các mẫu khác trong cách đặt tên mà tôi có thể nghĩ ra. Tôi cũng đã thấy cả hai khá thường xuyên và nghi ngờ chúng có thể là "tiêu chuẩn thực tế". Tôi sẽ chọn một và sử dụng nó ít nhất trong một dự án. (Nhìn vào dự án hiện tại của riêng tôi, tôi dường như sử dụng "make". Tôi hy vọng tôi nhất quán ...)

Tránh "xây dựng" vì nó phù hợp hơn với mẫu Builder và tránh "sản xuất" vì nó gợi lên Nhà sản xuất / Người tiêu dùng.

Để thực sự tiếp tục ẩn dụ của tên "Nhà máy" cho mẫu, tôi bị cám dỗ bởi "sản xuất", nhưng đó là một từ quá dài.


3

Tôi nghĩ rằng nó bắt nguồn từ nhóm để tạo ra một đối tượng. Tuy nhiên, trong tiếng Anh, từ "Tạo tạo" được liên kết với khái niệm Cồng kềnh để ra đời, như một thứ độc đáo không tự nhiên phát triển hoặc không được tạo ra bởi các quá trình thông thường, Khăn và Lọ để phát triển từ suy nghĩ của chính mình hoặc trí tưởng tượng, như một tác phẩm nghệ thuật hoặc một phát minh. Vì vậy, có vẻ như vì vậy, tạo ra không phải là từ thích hợp để sử dụng. Mặt khác, Make Make, có nghĩa là, có thể tạo ra sự tồn tại bằng cách định hình hoặc thay đổi vật liệu, kết hợp các bộ phận, v.v. Ví dụ: bạn không tạo ra một chiếc váy, bạn tạo ra một chiếc váy (đối tượng). Vì vậy, theo ý kiến ​​của tôi, người hâm mộ đã tạo ra ý nghĩa về cách thức sản xuất; nguyên nhân tồn tại hoặc xảy ra; mang lại về tinh thần là một từ tốt hơn nhiều cho các phương pháp nhà máy.


3

Tôi thích cái mới Với tôi

var foo = newFoo();

đọc tốt hơn

var foo = createFoo();

Dịch sang tiếng Anh chúng tôi có foo là một foo mới hoặc foo là tạo foo. Mặc dù tôi không phải là một chuyên gia về ngữ pháp nhưng tôi khá chắc chắn rằng cái sau này không đúng về mặt ngữ pháp.


Cả hai đều làm việc. createFoolà một chức năng. fookhông createFoo, như bạn nói. foolà kết quả của createFoo().
Krzysztof Czelusniak

2

Một phần quy ước, một phần ngữ nghĩa.

Các phương thức nhà máy (được báo hiệu bởi truyền thống create) sẽ gọi các nhà xây dựng thích hợp. Nếu tôi thấy buildURI, tôi sẽ cho rằng nó liên quan đến một số tính toán, hoặc lắp ráp từ các bộ phận (và tôi sẽ không nghĩ rằng có một nhà máy liên quan). Điều đầu tiên mà tôi nghĩ khi tôi thấy generateURIlà tạo ra một cái gì đó ngẫu nhiên, như một liên kết tải xuống được cá nhân hóa mới. Chúng không giống nhau, các từ khác nhau gợi lên những ý nghĩa khác nhau; nhưng hầu hết trong số họ không được quy ước.


1

Tôi sẽ gọi nó UriFactory.Create()

Ở đâu,

UriFactorylà tên của loại lớp cung cấp (các) phương thức tạo các Urithể hiện.

Create()phương thức bị quá tải cho bao nhiêu biến thể bạn có trong thông số kỹ thuật của bạn.

public static class UriFactory
{
    //Default Creator
    public static UriType Create() 
    {
    }

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}

1
Trong khi tôi đồng ý với cách đặt tên của bạn, tôi hoàn toàn không đồng ý với quy ước của bạn về việc sử dụng tên phương thức được đặt trong Pascal.
Chatatata

2
@Leviathlon nó luôn phụ thuộc vào ngôn ngữ lập trình và các quy ước nội bộ. Pascal Case hoàn toàn tốt cho các langauges như C #.
momo

@momo Chính xác, tôi nghĩ rằng tôi đã có một giả định về ngôn ngữ được nói đến là Java.
Chatatata

0

Tôi chỉ ra rằng tôi đã thấy tất cả các động từ nhưng được sử dụng trong một số thư viện hoặc khác, vì vậy tôi sẽ không gọi tạo là một quy ước phổ quát.

Bây giờ, tạo ra âm thanh tốt hơn đối với tôi, gợi lên ý nghĩa chính xác của hành động.

Vì vậy, có, đó là một vấn đề của (văn học) hương vị.


0

Cá nhân tôi thích instantiateinstantiateWith, nhưng đó chỉ là do trải nghiệm Unity và Objective C của tôi. Các quy ước đặt tên bên trong công cụ Unity dường như xoay quanh từ instantiateđể tạo một thể hiện thông qua phương thức xuất xưởng và Objective C dường như muốn withchỉ ra tham số / s là gì. Điều này chỉ thực sự hoạt động tốt nếu phương thức nằm trong lớp sắp được khởi tạo mặc dù (và trong các ngôn ngữ cho phép quá tải hàm tạo, đây không phải là quá nhiều 'điều').

Mục tiêu C cũ đơn giản initWithcũng là một điều tốt!


-3

Phương thức nhà máy không ra lệnh cho tên phương thức. Bạn có thể có bao nhiêu phương thức bạn muốn trong nhà máy của mình, miễn là tất cả chúng trả về đối tượng từ cùng một gia đình.

Để biết thêm chi tiết, hãy truy cập url http://xeon2k.wordpress.com


4
liên kết không có ý nghĩa, nên được cụ thể hơn.
brungaard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.