방법 같은 공장 이름을 지정하는 방법?


146

나는 대부분의 공장과 같은 방법이로 시작한다고 생각합니다 create. 그러나 왜 " 만들기 " 라고 불리는가 ? " 만들기 ", " 생성하다 ", " 빌드 ", " 생성하다 "또는 다른 무엇인가? 맛만 문제입니까? 컨벤션? 아니면 "만들기"에 특별한 의미가 있습니까?

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

일반적으로 어떤 것을 선택 하시겠습니까?


4
한 번은 팩토리 메소드의 이름을 "get ()"으로하는 프로젝트를 수행했습니다. 처음에는 매우 혼란 스럽습니다.
Muxecoid

4
마지막 옵션은 접두사가 없는가? 우리는 거의 항상 정적 컨텍스트에서 팩토리를 사용하기 때문에 명확하지 않습니까? 토론을 촉구하는 것만으로도 개인적으로 선호하는 것입니다 createXyz().
vikingsteve

@vikingsteve 내가 만든 시스템에서 create접두어를 API 일관성을 위해 관습의 문제로 사용했으며 문자를 입력 c하면 IDE의 자동 완성에 문자 가 모두 표시되어 더 쉽게 만들 수 있기 때문에 사용 가능한 것을 배우려는 사람을 위해. 내가 했어 수 Matrix4f.identity(), Matrix4f.transpose()등을하지만 그들은으로 찾아 빠른 것 Matrix4f.createIdentity()Matrix4f.createTranspose(...)
code_dredd

답변:


117

임의의 생각 :

  • '만들기'는 대부분의 다른 단어보다 기능에 더 적합합니다. 내 머리 꼭대기에서 생각할 수있는 다음으로 가장 좋은 단어는 'Construct'입니다. 과거에는 'Alloc'(할당)이 C와 같은 언어로 된 객체보다 데이터 블록에 더 중점을 둔 유사한 상황에서 사용되었을 수 있습니다.

  • '만들기'는 명확하고 직관적 인 의미를 가진 짧고 간단한 단어입니다. 대부분의 경우 사람들은 아마도 무언가를 만들려고 할 때 가장 먼저 떠오르는 단어로 선택합니다. 일반적인 명명 규칙이며 "개체 생성"은 개체 생성 프로세스를 설명하는 일반적인 방법입니다.

  • '구문'은 가깝지만 일반적으로 객체를 생성하는 과정에서 특정 단계를 설명하는 데 사용됩니다 (할당 / 신규, 구성, 초기화 ...).

  • '빌드'와 '만들기'는 코드 컴파일과 관련된 프로세스의 일반적인 용어이므로 프로그래머에게 다른 의미를 지니므로 많은 단계와 디스크 활동이 많은 프로세스를 의미합니다. 그러나 팩토리 "빌딩"이란 아이디어는 합리적인 아이디어입니다. 특히 복잡한 데이터 구조가 구축되거나 여러 별도의 정보가 어떤 방식으로 결합 된 경우에 특히 그렇습니다.

  • '생성'은 해시 코드 또는 난수 생성과 같은 입력에서 값을 생성하는 데 사용되는 계산을 의미합니다.

  • '생성', '생성', '구성'은 '생성'보다 타이핑 / 읽기가 길다. 역사적으로 프로그래머들은 타이핑 / 읽기를 줄이기 위해 짧은 이름을 선호했습니다.


5
"만들기"에 대한
투표

103

"유효한 Java"의 Joshua Bloch 는 다음과 같은 명명 규칙을 제안합니다.

valueOf — 느슨하게 말하면 매개 변수와 같은 값을 가진 인스턴스를 반환합니다. 이러한 정적 팩토리는 효과적으로 형식 변환 방법입니다.

of — 간결한 대안 valueOf으로 EnumSet(Item 32)에 의해 대중화되었습니다 .

getInstance — 매개 변수로 설명되어 있지만 같은 값을 가질 수없는 인스턴스를 반환합니다. 싱글 톤의 경우 getInstance매개 변수를 사용하지 않고 단독 인스턴스를 리턴합니다.

newInstance — Like getInstance를 제외하고 newInstance반환 된 각 인스턴스가 다른 모든 인스턴스와 구별되도록합니다.

get Type — Like getInstance이지만 팩토리 메소드가 다른 클래스에있을 때 사용됩니다. Type 은 팩토리 메소드가 리턴 한 오브젝트의 유형을 나타냅니다.

new Type — Like newInstance이지만 팩토리 메소드가 다른 클래스에있을 때 사용됩니다. Type 은 팩토리 메소드가 리턴 한 오브젝트의 유형을 나타냅니다.


어떻게 평가 from하시겠습니까? 예를 들어 가설을 취 하거나 더 많은 논리가 일어나고 있음을 제안 할 것 Id.of("abc")입니까 (즉, 입력 분석, 다른 데이터와의 조회 / 상관 분석 등)? "of vs from": DId.from("xyz")from
knittl

22

다른 답변에서 볼 수없는 몇 가지 사항을 추가하고 싶었습니다.

  1. 전통적으로 '공장'은 '객체 생성'을 의미하지만, 나는 그것을 '예상 한대로 행동하는 대상을 돌려주는 것'으로 더 넓게 생각하고 싶습니다. 나는 그것이 새로운 물체 인지 항상 알아야 할 필요는 없으며 , 실제로는 상관하지 않을 수도 있습니다. 따라서 적절한 경우에는 지금 구현하는 방식이더라도 '만들기 ...'이름을 피할 수 있습니다.

  2. 구아바는 공장 명명 아이디어의 좋은 저장소입니다. 멋진 DSL 스타일을 대중화하고 있습니다. 예 :

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

1
맞아요, 구아바는 코드를 읽을 수있는 훌륭한 라이브러리입니다.
deamon December

11

"만들기"와 "만들기"는 짧고, 합리적으로 연상 적이며, 내가 생각할 수있는 명명의 다른 패턴과 관련이 없습니다. 나는 또한 꽤 자주 보았고 그것들이 "사실 표준"일지도 모른다고 의심했다. 하나를 선택하고 적어도 프로젝트 내에서 일관되게 사용합니다. (내 자신의 현재 프로젝트를 보면 "make"를 사용하는 것 같습니다. 일관성이 있기를 바랍니다 ...)

빌더 패턴에 더 잘 맞기 때문에 "빌드"를 피하고 생산자 / 소비자를 불러 일으키기 때문에 "생성"을 피하십시오.

패턴에 대한 "공장"이름의 은유를 계속 유지하기 위해 "제조"에 유혹을 받았지만 너무 긴 단어입니다.


3

나는 그것이 " 객체 를 만드는 것"에서 비롯된 것이라고 생각합니다 . 그러나 영어에서“만들기”라는 단어는“자연적으로 진화하지 않거나 평범한 과정에 의해 만들어지지 않은 독특한 것”,“자신의 생각 또는 예술 작품이나 발명품으로서의 상상력.” 따라서“만들기”가 올바른 단어 가 아닌 것 같습니다 . 반면에“만드는 것”은“재료를 형성하거나 바꾸거나 부품을 결합하는 등의 방법으로 존재하게하는 것”을 의미합니다. 예를 들어, 당신이하지 않는 만들 드레스를, 당신이 만들 드레스 (객체). 제 생각에는“만들다”는 의미에서“만들다”; 존재하거나 발생하는 원인; 가져오다”는 것은 공장 방법에 훨씬 더 좋은 단어입니다.


3

나는 새로운 것을 좋아한다. 나에게

var foo = newFoo();

보다 더 잘 읽습니다

var foo = createFoo();

영어로 번역하면 foo가 새로운 foo이거나 foo가 create foo입니다. 나는 문법 전문가가 아니지만 후자는 문법적으로 부정확하다고 확신합니다.


그들은 둘 다 작동합니다. createFoo함수입니다. 당신이 말하는 것처럼 foo아닙니다 createFoo. foo의 결과입니다 createFoo().
Krzysztof Czelusniak

2

부분적으로 관례, 부분적으로 의미론.

팩토리 메소드 (전통적으로 서명 됨 create)는 적절한 생성자를 호출해야합니다. 내가 보았을 때 buildURI, 계산이나 부품 조립이 포함되었다고 가정합니다 (공장이 관련된 것으로 생각하지 않습니다). 내가봤을 때 가장 먼저 생각한 것은 generateURI새로운 개인화 된 다운로드 링크처럼 무작위로 무언가를 만드는 것입니다. 그것들이 모두 같은 것은 아니며, 다른 단어들이 다른 의미를 불러 일으킨다. 그러나 그들 대부분은 전통적인 것이 아닙니다.


1

내가 부를거야 UriFactory.Create()

어디,

UriFactoryUri인스턴스 를 작성하는 메소드를 제공하는 클래스 유형의 이름입니다 .

그리고 Create()방법은 사양에 포함 된 변형만큼 과부하됩니다.

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

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

1
나는 당신의 이름에 동의하지만 Pascal-cased 메소드 이름 사용에 대한 당신의 협약에 강력히 동의하지 않습니다.
Chatatata

2
@Leviathlon은 항상 프로그래밍 언어와 내부 규칙에 따라 다릅니다. 파스칼 케이스는 C #과 같은 언어에 완전히 적합합니다.
momo

@momo 정확히, 나는 말하는 언어가 Java라고 가정했다고 생각합니다.
Chatatata

0

나는 모든 동사를 보았지만 일부 도서관이나 다른 곳에서 사용되는 것을 생산 했으므로 create는 보편적 인 규칙이라고 부르지 않을 것입니다.

이제 창조가 나에게 더 잘 들리며, 행동의 정확한 의미를 불러 일으킨다.

그렇습니다. 그것은 (문학적) 맛의 문제입니다.


0

개인적으로 좋아 instantiate하고 instantiateWith,하지만의 이유만으로 내 화합과 목표 C 경험. Unity 엔진 내부의 명명 규칙 instantiate은 팩토리 메소드를 통해 인스턴스를 만들기 위해 단어를 중심으로 돌아가는 것으로 보이며 Objective C with는 매개 변수가 무엇인지 나타내는 것처럼 보입니다 . 메소드가 인스턴스화 될 클래스에 있고 생성자 오버로드를 허용하는 언어에서는 이것이 '많은 일'이 아닌 경우에만 실제로 효과적입니다.

평범한 오래된 Objective C initWith도 좋은 것입니다!


-3

팩토리 메소드는 메소드 이름을 지시하지 않습니다. 팩토리에서 원하는 메소드를 모두 가질 수 있습니다. 모든 메소드가 동일한 패밀리에서 오브젝트를 리턴하는 경우입니다.

자세한 내용은 URL http://xeon2k.wordpress.com을 방문하십시오.


4
링크는 의미가 없으며 더 구체적이어야합니다.
brunsgaard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.